Android WifiService的启动流程分析

最近在学习Android WiFi framework的相关知识,这里总结以下。WiFi framework的内容大致可以分为以下几个模块:

1. WiFi相关内容

2.WiFi P2P相关内容

3.Hotspot相关内容

4.WiFi Display相关内容

后面就将从这四个方面一一介绍。


WiFi service的启动流程

Wifiservice的启动地方在system server中,code路径在:framwork/base/service/java/com/android/server/SystemServer.java

try{
               Slog.i(TAG,"Wi-Fi P2pService");
                wifiP2p=newWifiP2pService(context);
               ServiceManager.addService(Context.WIFI_P2P_SERVICE, wifiP2p);
           }catch(Throwable e){
                reportWtf("starting Wi-Fi P2pService", e);
           }

           try{
               Slog.i(TAG,"Wi-Fi Service");
                wifi=newWifiService(context);
               ServiceManager.addService(Context.WIFI_SERVICE, wifi);
           }catch(Throwable e){
                reportWtf("starting Wi-Fi Service", e);
           }

           try{
               Slog.i(TAG,"Connectivity Service");
                connectivity=newConnectivityService(
                        context, networkManagement, networkStats, networkPolicy);
               ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
                networkStats.bindConnectivityManager(connectivity);
                networkPolicy.bindConnectivityManager(connectivity);
                wifi.checkAndStartWifi();
                wifiP2p.connectivityServiceReady();
           }catch(Throwable e){
                reportWtf("starting Connectivity Service", e);
           }


这里我们可以看到在system server中,先构造了WifiP2pService 和WifiService,并将它们注册在ServiceManager当中,然后调用WifiService的checkAndStartWifi函数。那首先我们进入Wifiservice的构造函数当中,code路径在:framwork/base/service/java/com/android/server/wifi/WifiService.java,代码如下:

   WifiService(Context context){
        mContext= context;

        mInterfaceName=  SystemProperties.get("wifi.interface","wlan0");

        mWifiStateMachine=newWifiStateMachine(mContext, mInterfaceName);
	.......

       HandlerThread wifiThread=newHandlerThread("WifiService");
        wifiThread.start();
        mAsyncServiceHandler=newAsyncServiceHandler(wifiThread.getLooper());
        mWifiStateMachineHandler=newWifiStateMachineHandler(wifiThread.getLooper());
	mWifiController=newWifiController(mContext, this,wifiThread.getLooper());

	.......
   }



这里主要创建一个WifiStateMachine的实例,然后新建一个HandlerThread来处理所有的message,并注册一些broadcast的receive,例如WIFI_STATE_CHANGED_ACTION、NETWORK_STATE_CHANGED_ACTION等。WifiStateMachine用于控制整个wifi的开启、关闭、连接、断开等各个状态切换,我们将在后面具体来介绍StateMachine。
接着回到system server中,ConnectivityService用于管控机器中所有的数据连接服务,WiFi当然也属于其监控的对象,那我们进入到ConnectivityService构造函数中一看。code路径在:framwork/base/service/java/com/android/server/ConnectivityService.java

 publicConnectivityService(Context context,INetworkManagementService netManager,
           INetworkStatsService statsService,INetworkPolicyManager policyManager,
           NetworkFactory netFactory){
       if(DBG) log("ConnectivityService starting up");

       HandlerThread handlerThread=newHandlerThread("ConnectivityServiceThread");
        handlerThread.start();
        mHandler=newInternalHandler(handlerThread.getLooper());
        mTrackerHandler=newNetworkStateTrackerHandler(handlerThread.getLooper());

   .......

       // Create and start trackers for hard-coded networks
       for(int targetNetworkType: mPriorityList){
           finalNetworkConfig config= mNetConfigs[targetNetworkType];
           finalNetworkStateTracker tracker;
           try{
                tracker= netFactory.createTracker(targetNetworkType, config);
                mNetTrackers[targetNetworkType]= tracker;
           }catch(IllegalArgumentException e){
               Slog.e(TAG,"Problem creating "+ getNetworkTypeName(targetNetworkType)
                       +" tracker: "+ e);
               continue;
            }

            tracker.startMonitoring(context, mTrackerHandler);
           if(config.isDefault()){
                tracker.reconnect();
           }
       }



在ConnectivityService中将根据 com . android . internal . R . array . networkAttributes中配置的系统network属性去一一的创建tracker并开始monitor其状态,t racker . startMonitoring ( context , mTrackerHandler)这行code告诉我们这些tracker可以通过mTrackerHandler发送消息给ConnectivityService,我们可以到mTrackerHandler中看看这些消息主要有哪些类型:

NetworkStateTracker.EVENT_STATE_CHANGED
NetworkStateTracker.EVENT_CONFIGURATION_CHANGED
NetworkStateTracker.EVENT_NETWORK_SUBTYPE_CHANGED


其中 NetworkStateTracker . EVENT_STATE_CHANGED极为重要,我们将在后面的内容中看到当wifi连接AP成功后,会发送这个消息给ConnectivityService来做一些其它的检测。

回到ConnectivityService的构造函数中,刚刚说到ConnectivityService中将根据com.android.internal.R.array.networkAttributes中配置的系统network属性去一一的创建tracker,那我们进入到netFactory.createTracker(targetNetworkType, config)去看看究竟会创建哪些tracker:

       publicNetworkStateTracker createTracker(int targetNetworkType,NetworkConfig config){
            switch(config.radio){
               case TYPE_WIFI:
                   returnnewWifiStateTracker(targetNetworkType, config.name);
               case TYPE_MOBILE:
                   returnnewMobileDataStateTracker(targetNetworkType, config.name);
               case TYPE_DUMMY:
                   returnnewDummyDataStateTracker(targetNetworkType, config.name);
               case TYPE_BLUETOOTH:
                   returnBluetoothTetheringDataTracker.getInstance();
               case TYPE_WIMAX:
                   return makeWimaxStateTracker(mContext, mTrackerHandler);
               case TYPE_ETHERNET:
                   returnEthernetDataTracker.getInstance();
               default:
                   thrownewIllegalArgumentException(
                           "Trying to create a NetworkStateTracker for an unknown radio type: "
                           + config.radio);
           }
       }
   }



这里我们主要关系的是TYPE_WIFI,ConnectivityService将创建一个WiFiStateTracker对象,并调用其startMonitoring方法,进入到WiFiStateTracker代码中分析:

   publicWifiStateTracker(int netType,String networkName){
        mNetworkInfo=newNetworkInfo(netType,0, networkName,"");
        mLinkProperties=newLinkProperties();
        mLinkCapabilities=newLinkCapabilities();

        mNetworkInfo.setIsAvailable(false);
        setTeardownRequested(false);
   }

   publicvoid startMonitoring(Context context,Handler target){
        mCsHandler= target;
        mContext= context;

        mWifiManager=(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
       IntentFilter filter=newIntentFilter();
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);

        mWifiStateReceiver=newWifiStateReceiver();
        mContext.registerReceiver(mWifiStateReceiver, filter);
   }



WiFiStateTracker的构造函数和startMonitoring方法都比较简单,主要是注册一个broadcast receiver用于接收系统的NETWORK_STATE_CHANGED_ACTION和LINK_CONFIGURATION_CHANGED_ACTION消息。
      好,到这里我们把ConnectivityService的构造函数中与wifi相关的内容介绍完毕了,我们再回到system server当中,在把ConnectivityService加入到Service Manager后,就调用 wifi . checkAndStartWifi()来检查是否可以启动wifi了

   publicvoid checkAndStartWifi(){
        boolean wifiEnabled= mSettingStore.isWifiToggleEnabled();
       Slog.i(TAG,"WifiService starting up with Wi-Fi "+
               (wifiEnabled?"enabled":"disabled"));

       // If we are already disabled (could be due to airplane mode), avoid changing persist
       // state here
       if(wifiEnabled) setWifiEnabled(wifiEnabled);

        mWifiWatchdogStateMachine=WifiWatchdogStateMachine.
               makeWifiWatchdogStateMachine(mContext);

   }



  具体的如何启动wifi和wifi启动流程将在下一章中分析,这里来看一下整个Wifiservice启动的流程图,图中的红色字体部分表示新建一个thread,绿色部分表示在已有的looper当中创建一个handler,黄色部分表示注册broadcast receiver。

Android WifiService的启动流程分析_第1张图片

你可能感兴趣的:(framework,Wi-Fi)