转于: http://blog.csdn.net/lilian0118/article/details/21964423
最近在学习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);
- <span style="white-space:pre"> </span>.......
- HandlerThread wifiThread=newHandlerThread("WifiService");
- wifiThread.start();
- mAsyncServiceHandler=newAsyncServiceHandler(wifiThread.getLooper());
- mWifiStateMachineHandler=newWifiStateMachineHandler(wifiThread.getLooper());
- <span style="white-space:pre"> </span>mWifiController=newWifiController(mContext, this,wifiThread.getLooper());
- <span style="white-space:pre"> </span>.......
- }
这里主要创建一个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。