ConnectivityService 中调用 EthernetStateTracker 和 EthernetService


u最近在研究android 中的 ethernet 部分,主要集中在上层JAVA service 和java api。

整个 android 系统的mobile, wifi,wimax 和 bluetooth 都是通过ConnectivitySerivice 来提供服务的。
android本身不自带ethernet服务,需要新加 android-x86 里拿的ics-ethernet patch。

接下来分析 ConnectivityService 是怎么提供 ethernet 服务的。


1. 最开始,ConnectivityService 中会创建 EthernetStateTracker 和 EthernetService。
frameworks/base/services/java/com/android/server/ConnectivityService.java:

    case ConnectivityManager.TYPE_ETHERNET:
                    //mNetTrackers[netType] = EthernetDataTracker.getInstance();
                    //mNetTrackers[netType].startMonitoring(context, mHandler);
                    if(DBG) log("Starting Ethernet Service.");
                    //创建 EthernetStateTracker
                    EthernetStateTracker est=new EthernetStateTracker(context, mHandler);  
                    
                    //创建EthernetService
                    EthernetService ethService=new EthernetService(context, est);
 
                    //向ServiceManager 中添加 ETHERNET_SERVICE 服务
                    ServiceManager.addService(Context.ETHERNET_SERVICE, ethService); 

                    mNetTrackers[ConnectivityManager.TYPE_ETHERNET]= est; //赋值EthernetStateTracker.
                    
                    //调用EthernetStateTracker 的startMonitoring
                    est.startMonitoring(context, mHandler);  
                    break;

a. mNetTrackers 定义:

    /**
     * Sometimes we want to refer to the individual network state
     * trackers separately, and sometimes we just want to treat them
     * abstractly.
     */
    private NetworkStateTracker mNetTrackers[];  
    //网络状态跟踪,no_connected, connecting, connected ,三种状态

b. EthernetStateTracker.startMonitoring():
    public void startMonitoring(Context context, Handler target) {
        if (localLOGV) Slog.v(TAG,"start to monitor the ethernet devices");
        if (mServiceStarted) {  //获得systemService 中 ethernet_service的上下文
            mEM = (EthernetManager)context.getSystemService(Context.ETHERNET_SERVICE);
            mContext = context;
            mCsHandler = target;

            int state = mEM.getState();
            if (state != mEM.ETHERNET_STATE_DISABLED) {
                if (state == mEM.ETHERNET_STATE_UNKNOWN) {
                    // maybe this is the first time we run, so set it to enabled
                    mEM.setEnabled(mEM.getDeviceNameList() != null);  //set mEM to enabled.
                } else {
                    try {
                        //if it's not the first time we run, reset the interface.   
                        resetInterface();
                    } catch (UnknownHostException e) {
                        Slog.e(TAG, "Wrong ethernet configuration");
                    }
                }
            }
        }
    }


2.  创建 EthernetStateTracker :

frameworks/base/ethernet/java/android/net/ethernet/EthernetStateTracker.java

    public EthernetStateTracker(Context context, Handler target){

            //创建 NetworkInfo,可以用来查看网络状况
            mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_ETHERNET, 0,"ETH","");
 
            mLinkProperties = new LinkProperties();  //网络链接属性

            if (localLOGV) Slog.v(TAG,"Starts...");

            //EthernetNative 通过 JNI 调用到 libnetutil.so 中去了。
            if (EthernetNative.initEthernetNative()!= 0){  
                Slog.e(TAG,"Can not init ethernet device layers");
                return;
            }

            if (localLOGV) Slog.v(TAG,"Successed");

            mServiceStarted = true;

            //创建 DHCP 线程
            HandlerThread dhcpThread = new HandlerThread("DHCP Handler Thread");
            dhcpThread.start();
            mDhcpTarget = new DhcpHandler(dhcpThread.getLooper(),this);
            mMonitor = new EthernetMonitor(this); //创建 EthernetMonitor
            mDhcpInfo = new DhcpInfoInternal();   //创建 DhcpInfoInternal, 用来描述DHCP IP配置            
            mDhcpInfo1 = new DhcpInfo();          //创建DhcpInfo, 用来描述static ip 配置 
 }

a.   DhcpHandler(): 这个类不知道干啥的。。
    private class DhcpHandler extends Handler {
         public DhcpHandler(Looper looper, Handler target) { 
             super(looper);
             mTrackerTarget = target; //赋值mTrackerTarget.
         }

b.   EthernetMonitor(): 这个会单独介绍

c.   DhcpInfoInternal(): 这个应该是DhcpInfo的新一代。

frameworks/base/core/java/android/net/DhcpInfoInternal.java

/**
 * A simple object for retrieving the results of a DHCP request.
 * Replaces (internally) the IPv4-only DhcpInfo class.
 * @hide
 */
public class DhcpInfoInternal {
    private final static String TAG = "DhcpInfoInternal";
    public String ipAddress;
    public int prefixLength;

    public String dns1;
    public String dns2;

    public String serverAddress;
    public int leaseDuration;

    private Collection<RouteInfo> mRoutes;

d. DhcpInfo 类内容明显 和 DhcpInfoInternal 不同:
frameworks/base/core/java/android/net/DhcpInfo.java
/**
 * A simple object for retrieving the results of a DHCP request.
 */
public class DhcpInfo implements Parcelable {
    public int ipAddress;
    public int gateway;
    public int netmask;

    public int dns1;
    public int dns2;

    public int serverAddress;
    public int leaseDuration;



3.    创建 EthernetService
frameworks/base/services/java/com/android/server/EthernetService.java

    public EthernetService(Context context, EthernetStateTracker Tracker){
            mTracker = Tracker;
            mContext = context; 
            isEnabled = getPersistedState();
            if (localLOGV==true) Slog.i(TAG,"Ethernet dev enabled "+ isEnabled);
            getDeviceNameList();  //从驱动获得设备表
            setState(isEnabled);  //设置 enabled 状态
            Slog.d(TAG,"xxha: ---------------------- StartPolling()");
            mTracker.StartPolling(); //开始监听驱动层的事件信号
        }

a. getDeviceNameList() :
    /**
     * get all the ethernet device names
     * @return interface name list on success, {@code null} on failure
     */
    public String[] getDeviceNameList() {
        return (scanDevice() > 0) ? DevName : null;  //扫描设备
    }

    private int scanDevice() {
        int i, j;
        if ((i = EthernetNative.getInterfaceCnt()) == 0)
            return 0;

        DevName = new String[i];

        for (j = 0; j < i; j++) {
            DevName[j] = EthernetNative.getInterfaceName(j); //获取设备名eth0,sit0
            if (DevName[j] == null)
                break;
            if (localLOGV) Slog.v(TAG, "device " + j + " name " + DevName[j]);
        }

        return i;
    }

b.  mTracker.StartPolling()

    public void StartPolling() {
        mMonitor.startMonitoring(); //这个也会调到EthernetMonitor 中的 startMonitoring() 去。
    }







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值