Android4.4(MT8685)源碼WIFI
發表時(shí)間:2021-1-4
發布人(rén):融晨科技
浏覽次數:71
在(zài)Android系統啓動的(de)時(shí)候,會在(zài)./frameworks/base/services/java/com/android/server/SystemServer.java類中啓動許多服務,其中和(hé / huò)Wifi相關的(de)服務就(jiù)在(zài)這(zhè)裏初始化。在(zài)SystemServer的(de)main方法中,我們可以(yǐ)看到(dào)
thr.initAndLoop();
這(zhè)裏調用了(le/liǎo)它的(de)内部類對象的(de)initAndLoop方法,在(zài)這(zhè)個(gè)方法的(de)作用主要(yào / yāo)就(jiù)是(shì)初始化系統啓動需要(yào / yāo)加載的(de)服務的(de),我們在(zài)這(zhè)個(gè)方法中可以(yǐ)找到(dào)
try { Slog.i(TAG, "Wi-Fi Service"); wifi = new WifiService(context); ServiceManager.addService(Context.WIFI_SERVICE, wifi); } catch (Throwable e) { reportWtf("starting Wi-Fi Service", e); } try { Slog.i(TAG, "Connectivity Service"); connectivity = new ConnectivityService( context, networkManagement, networkStats, networkPolicy); ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity); networkStats.bindConnectivityManager(connectivity); networkPolicy.bindConnectivityManager(connectivity); wifiP2p.connectivityServiceReady(); wifi.checkAndStartWifi(); } catch (Throwable e) { reportWtf("starting Connectivity Service", e); }
這(zhè)裏我們可以(yǐ)看到(dào)初始化了(le/liǎo)一個(gè)WifiService和(hé / huò)ConnectivityService對象,并把這(zhè)2個(gè)對象注冊到(dào)ServiceManager中,然後通過創建的(de)對象wifi 來(lái)調用checkAndStartWifi方法,具體的(de)WifiService的(de)分析我們下一章再做詳細介紹,現在(zài)我們簡單分析下ConnectivityService。
ConnectivityService是(shì)管理系統中所有的(de)數據連接服務,其中就(jiù)包括Wifi,我們來(lái)看看它的(de)構造函數,路徑:./frameworks/base/services/java/com/android/server/ConnectivityService.java
public ConnectivityService(Context context, INetworkManagementService netd, INetworkStatsService statsService, INetworkPolicyManager policyManager) { // Currently, omitting a NetworkFactory will create one internally // TODO: create here when we have cleaner WiMAX support this(context, netd, statsService, policyManager, null); }
這(zhè)裏就(jiù)是(shì)調用了(le/liǎo)同名的(de)構造方法
public ConnectivityService(Context context, INetworkManagementService netManager, INetworkStatsService statsService, INetworkPolicyManager policyManager, NetworkFactory netFactory) { if (DBG) log("ConnectivityService starting up"); HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread"); handlerThread.start(); mHandler = new InternalHandler(handlerThread.getLooper()); mTrackerHandler = new NetworkStateTrackerHandler(handlerThread.getLooper()); // Create and start trackers for hard-coded networks for (int targetNetworkType : mPriorityList) { final NetworkConfig config = mNetConfigs[targetNetworkType]; final NetworkStateTracker tracker; try { /** M: Hotspot Manager @{*/ if(config.radio == TYPE_USB){ log("new UsbDataStateTracker"); mNetTrackers[targetNetworkType] = new UsbDataStateTracker(targetNetworkType, config.name, mNetd); mNetTrackers[targetNetworkType].startMonitoring(context, mTrackerHandler); continue; } if(true == FeatureOption.MTK_ALPS_BOX_SUPPORT && config.radio == TYPE_ETHERNET){ if (DBG) log("Starting Ethernet Service."); mNetTrackers[TYPE_ETHERNET] = makeEthStateTracker(context); if(mNetTrackers[TYPE_ETHERNET] != null){ if (DBG) log("mNetTrackers[TYPE_ETHERNET] != null"); mNetTrackers[TYPE_ETHERNET].startMonitoring(context, mTrackerHandler); if (config.isDefault()) { mNetTrackers[TYPE_ETHERNET].reconnect(); } } continue; } /*@} */ /*@} */ ///M:new a Teledongle Data Tracker @by mtk94127 @{ if(FeatureOption.MTK_EXTERNAL_DONGLE_SUPPORT && (config.radio == TYPE_TEDONGLE)) { log("new TedongleDataStateTracker"); mNetTrackers[targetNetworkType] = makeTedongleDataTracker(); log("new TedongleDataStateTracker medium!"); mNetTrackers[targetNetworkType].startMonitoring(context, mTrackerHandler); log("new TedongleDataStateTracker end!"); continue; } ///M:@} 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(); } } }
這(zhè)裏根據com.android.internal.R.array.networkAttributes配置的(de)屬性去創建一個(gè)個(gè)tracker,并監聽其狀态,tracker.startMonitoring(context, mTrackerHandler);可以(yǐ)看出(chū)tracker可以(yǐ)通過mTrackerHandler向ConnectivityService發送消息,這(zhè)些消息有
/** * The network state has changed and the NetworkInfo object * contains the new state. * * msg.what = EVENT_STATE_CHANGED * msg.obj = NetworkInfo object */ public static final int EVENT_STATE_CHANGED = BASE_NETWORK_STATE_TRACKER; /** * msg.what = EVENT_CONFIGURATION_CHANGED * msg.obj = NetworkInfo object */ public static final int EVENT_CONFIGURATION_CHANGED = BASE_NETWORK_STATE_TRACKER + 1; /** * msg.what = EVENT_RESTORE_DEFAULT_NETWORK * msg.obj = FeatureUser object */ public static final int EVENT_RESTORE_DEFAULT_NETWORK = BASE_NETWORK_STATE_TRACKER + 2; /** * msg.what = EVENT_NETWORK_SUBTYPE_CHANGED * msg.obj = NetworkInfo object */ public static final int EVENT_NETWORK_SUBTYPE_CHANGED = BASE_NETWORK_STATE_TRACKER + 3; /** * msg.what = EVENT_NETWORK_CONNECTED * msg.obj = LinkProperties object */ public static final int EVENT_NETWORK_CONNECTED = BASE_NETWORK_STATE_TRACKER + 4; /** * msg.what = EVENT_NETWORK_CONNECTION_DISCONNECTED * msg.obj = LinkProperties object, same iface name */ public static final int EVENT_NETWORK_DISCONNECTED = BASE_NETWORK_STATE_TRACKER + 5;
當WiFi的(de)連接AP成功後,就(jiù)會想 ConnectivityService發送一個(gè)EVENT_STATE_CHANGED消息。
接着我們來(lái)看創建了(le/liǎo)哪些tracker,找到(dào)createTracker方法
@Override public NetworkStateTracker createTracker(int targetNetworkType, NetworkConfig config) { switch (config.radio) { case TYPE_WIFI: return new WifiStateTracker(targetNetworkType, config.name); case TYPE_MOBILE: return new MobileDataStateTracker(targetNetworkType, config.name); case TYPE_DUMMY: return new DummyDataStateTracker(targetNetworkType, config.name); case TYPE_BLUETOOTH: return BluetoothTetheringDataTracker.getInstance(); case TYPE_WIMAX: return makeWimaxStateTracker(mContext, mTrackerHandler); case TYPE_CSD: return new CsdStateTracker(targetNetworkType, config.name); default: throw new IllegalArgumentException( "Trying to create a NetworkStateTracker for an unknown radio type: " + config.radio); } }
這(zhè)裏我們主要(yào / yāo)關注TYPE_WIFI,創建了(le/liǎo)一個(gè)WifiStateTracker對象,進入到(dào)WifiStateTracker的(de)構造方法
public WifiStateTracker(int netType, String networkName) { ///M:@{ mNetType = netType; ///@} mNetworkInfo = new NetworkInfo(netType, 0, networkName, ""); mLinkProperties = new LinkProperties(); mLinkCapabilities = new LinkCapabilities(); mNetworkInfo.setIsAvailable(false); setTeardownRequested(false); }
接着調用startMonitoring
/** * Begin monitoring wifi connectivity */ public void startMonitoring(Context context, Handler target) { mCsHandler = target; mContext = context; mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE); IntentFilter filter = new IntentFilter(); ///M:seperate p2p and wifi @{ if (mNetType == ConnectivityManager.TYPE_WIFI) { filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); } ///@} mWifiStateReceiver = new WifiStateReceiver(); mContext.registerReceiver(mWifiStateReceiver, filter); }
這(zhè)裏就(jiù)是(shì)注冊了(le/liǎo)一個(gè)廣播用于(yú)接收NETWORK_STATE_CHANGED_ACTION和(hé / huò)LINK_CONFIGURATION_CHANGED_ACTION廣播,ConnectivityService我們就(jiù)分析到(dào)這(zhè)裏,下一章我們将詳細分析WifiService。