最近在學習Android WiFi framework的相關知識,這裏總結以下。WiFi framework的內容大致可以分爲以下幾個模塊:
1. WiFi相關內容
2.WiFi P2P相關內容
3.Hotspot相關內容
4.WiFi Display相關內容
後面就將從這四個方面一一介紹。
WiFi service的啓動流程
- 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);
- }
- 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>.......
- }
- 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();
- }
- }
- NetworkStateTracker.EVENT_STATE_CHANGED
- NetworkStateTracker.EVENT_CONFIGURATION_CHANGED
- NetworkStateTracker.EVENT_NETWORK_SUBTYPE_CHANGED
- 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);
- }
- }
- }
- 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);
- }
- 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);
- }