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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. try{  
  2.                Slog.i(TAG,"Wi-Fi P2pService");  
  3.                 wifiP2p=newWifiP2pService(context);  
  4.                ServiceManager.addService(Context.WIFI_P2P_SERVICE, wifiP2p);  
  5.            }catch(Throwable e){  
  6.                 reportWtf("starting Wi-Fi P2pService", e);  
  7.            }  
  8.   
  9.            try{  
  10.                Slog.i(TAG,"Wi-Fi Service");  
  11.                 wifi=newWifiService(context);  
  12.                ServiceManager.addService(Context.WIFI_SERVICE, wifi);  
  13.            }catch(Throwable e){  
  14.                 reportWtf("starting Wi-Fi Service", e);  
  15.            }  
  16.   
  17.            try{  
  18.                Slog.i(TAG,"Connectivity Service");  
  19.                 connectivity=newConnectivityService(  
  20.                         context, networkManagement, networkStats, networkPolicy);  
  21.                ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);  
  22.                 networkStats.bindConnectivityManager(connectivity);  
  23.                 networkPolicy.bindConnectivityManager(connectivity);  
  24.                 wifi.checkAndStartWifi();  
  25.                 wifiP2p.connectivityServiceReady();  
  26.            }catch(Throwable e){  
  27.                 reportWtf("starting Connectivity Service", e);  
  28.            }  


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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.    WifiService(Context context){  
  2.         mContext= context;  
  3.   
  4.         mInterfaceName=  SystemProperties.get("wifi.interface","wlan0");  
  5.   
  6.         mWifiStateMachine=newWifiStateMachine(mContext, mInterfaceName);  
  7. <span style="white-space:pre">  </span>.......  
  8.   
  9.        HandlerThread wifiThread=newHandlerThread("WifiService");  
  10.         wifiThread.start();  
  11.         mAsyncServiceHandler=newAsyncServiceHandler(wifiThread.getLooper());  
  12.         mWifiStateMachineHandler=newWifiStateMachineHandler(wifiThread.getLooper());  
  13. <span style="white-space:pre">  </span>mWifiController=newWifiController(mContext, this,wifiThread.getLooper());  
  14.   
  15. <span style="white-space:pre">  </span>.......  
  16.    }  



这里主要创建一个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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. publicConnectivityService(Context context,INetworkManagementService netManager,  
  2.           INetworkStatsService statsService,INetworkPolicyManager policyManager,  
  3.           NetworkFactory netFactory){  
  4.       if(DBG) log("ConnectivityService starting up");  
  5.   
  6.       HandlerThread handlerThread=newHandlerThread("ConnectivityServiceThread");  
  7.        handlerThread.start();  
  8.        mHandler=newInternalHandler(handlerThread.getLooper());  
  9.        mTrackerHandler=newNetworkStateTrackerHandler(handlerThread.getLooper());  
  10.   
  11.   .......  
  12.   
  13.       // Create and start trackers for hard-coded networks  
  14.       for(int targetNetworkType: mPriorityList){  
  15.           finalNetworkConfig config= mNetConfigs[targetNetworkType];  
  16.           finalNetworkStateTracker tracker;  
  17.           try{  
  18.                tracker= netFactory.createTracker(targetNetworkType, config);  
  19.                mNetTrackers[targetNetworkType]= tracker;  
  20.           }catch(IllegalArgumentException e){  
  21.               Slog.e(TAG,"Problem creating "+ getNetworkTypeName(targetNetworkType)  
  22.                       +" tracker: "+ e);  
  23.               continue;  
  24.            }  
  25.   
  26.            tracker.startMonitoring(context, mTrackerHandler);  
  27.           if(config.isDefault()){  
  28.                tracker.reconnect();  
  29.           }  
  30.       }  



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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. NetworkStateTracker.EVENT_STATE_CHANGED  
  2. NetworkStateTracker.EVENT_CONFIGURATION_CHANGED  
  3. 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:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.     publicNetworkStateTracker createTracker(int targetNetworkType,NetworkConfig config){  
  2.          switch(config.radio){  
  3.             case TYPE_WIFI:  
  4.                 returnnewWifiStateTracker(targetNetworkType, config.name);  
  5.             case TYPE_MOBILE:  
  6.                 returnnewMobileDataStateTracker(targetNetworkType, config.name);  
  7.             case TYPE_DUMMY:  
  8.                 returnnewDummyDataStateTracker(targetNetworkType, config.name);  
  9.             case TYPE_BLUETOOTH:  
  10.                 returnBluetoothTetheringDataTracker.getInstance();  
  11.             case TYPE_WIMAX:  
  12.                 return makeWimaxStateTracker(mContext, mTrackerHandler);  
  13.             case TYPE_ETHERNET:  
  14.                 returnEthernetDataTracker.getInstance();  
  15.             default:  
  16.                 thrownewIllegalArgumentException(  
  17.                         "Trying to create a NetworkStateTracker for an unknown radio type: "  
  18.                         + config.radio);  
  19.         }  
  20.     }  
  21. }  



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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. publicWifiStateTracker(int netType,String networkName){  
  2.      mNetworkInfo=newNetworkInfo(netType,0, networkName,"");  
  3.      mLinkProperties=newLinkProperties();  
  4.      mLinkCapabilities=newLinkCapabilities();  
  5.   
  6.      mNetworkInfo.setIsAvailable(false);  
  7.      setTeardownRequested(false);  
  8. }  
  9.   
  10. publicvoid startMonitoring(Context context,Handler target){  
  11.      mCsHandler= target;  
  12.      mContext= context;  
  13.   
  14.      mWifiManager=(WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);  
  15.     IntentFilter filter=newIntentFilter();  
  16.      filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);  
  17.      filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);  
  18.   
  19.      mWifiStateReceiver=newWifiStateReceiver();  
  20.      mContext.registerReceiver(mWifiStateReceiver, filter);  
  21. }  



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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. publicvoid checkAndStartWifi(){  
  2.      boolean wifiEnabled= mSettingStore.isWifiToggleEnabled();  
  3.     Slog.i(TAG,"WifiService starting up with Wi-Fi "+  
  4.             (wifiEnabled?"enabled":"disabled"));  
  5.   
  6.     // If we are already disabled (could be due to airplane mode), avoid changing persist  
  7.     // state here  
  8.     if(wifiEnabled) setWifiEnabled(wifiEnabled);  
  9.   
  10.      mWifiWatchdogStateMachine=WifiWatchdogStateMachine.  
  11.             makeWifiWatchdogStateMachine(mContext);  
  12.   
  13. }  



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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值