一、引言
在Android 以太网服务启动流程中我们启动了EthernetService(ES),NetworkManagementService(NMS)等服务,其中ES作为Binder的服务端,向客户端EthernetManger提供了调用接口的引用。因此,应用可以通过EthernetManger来访问以太网的相关接口。本篇文章将从APP调用以太网的使能和关闭的接口流程作为切入点来分析,以太网框架中,上层app是如何将指令传递到底层。图1-1所示为以太网使能和关闭流程图

二、以太网使能流程
2.1 app端调用以太网的使能接口
应用端调用以外网使能的接口是setEthernetEnabled,具体调用过如下:
import android.net.EthernetManager;
EthernetManager et;
//获取ethernet的Binder引用端
et = (EthernetManager)getSystemService("ethernet");
//调用setEthernetEnabled使能以太网
et.setEthernetEnabled("eth0", true);
App端实现很简单,是Android 通常获取Binder通信过程,主要完成以下任务:
- 获取以太网的Binder服务的引用,以便调用其使能接口;
- 调用setEthernetEnabled接口来使能以外网
2.2 system_server进程的调用流程
App端调用setEthernetEnabled接口来使能以外网,具体代码如下:
//frameworks/base/core/java/android/net/EthernetManager.java
public boolean setEthernetEnabled(String iface, boolean enabled) {
Log.d(TAG,enabled ? "turn on Ethernet" : "turn off Ethernet");
try {
return mService.setEthernetEnabled(iface, enabled);
} catch (RemoteException e) {
return false;
}
}
其实调用很简单,直接调用服务端的setEthernetEnabled接口,需要注意的是,这里传入的iface为Hal层创建interface名称,以太网是eth0,enabled是true表示使能以太网,否则表示关闭以太网。下面我们直捣黄龙直接看服务端的setEthernetEnabled这个接口的实现。
//frameworks/opt/net/ethernet/java/com/android/server/ethernet/EthernetServiceImpl.java
public class EthernetServiceImpl extends IEthernetManager.Stub {
//以太网服务的核心
private EthernetTracker mTracker;
public boolean setEthernetEnabled(String iface, boolean enable) {
//enforceChangePermission();
Log.i(TAG,"setEthernetEnabled() : enable="+enable);
return mTracker.setEthernetEnabled(iface, enable);
}
}
由Android 以太网服务启动流程我们可以知道EthernetTracker是以太网服务的核心,其能保存NetworkManagementService的引用对象,从而间接和Netd进行通信,下面我们直接看EthernetTracker中的setEthernetEnabled接口。
final class EthernetTracker {
private final INetworkManagementService mNMService;
EthernetTracker(Context context, Handler handler) {
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
mNMService = INetworkManagementService

本文详细分析了Android系统中开启和关闭以太网的流程,从APP调用EthernetManager的setEthernetEnabled接口开始,经由system_server进程,深入到NetworkManagementService和Netd服务,最终通过ioctl操作与kernel交互,实现以太网的启用和禁用。文章还介绍了NetworkManagementService如何通过Binder服务与Netd通信,以及Netd如何获取和设置InterfaceConfiguration。
最低0.47元/天 解锁文章
8001

被折叠的 条评论
为什么被折叠?



