天天看點

Android Wi-Fi connect & auto connect流程分析(Android 7.0)

1 WifiConnectivityManager

WifiConnectivityManager,之前Android connect一個wifi和做scan的操作都是放在wifistatemachine中的,整個看起來很雜亂。現在google在android N中做了個新的東西,WifiConnectivityManager,通過這個東西來管理scan和connect。這裡我從wifi connect一個ssid的流程來看這個WifiConnectivityManager.

2 WifiManager.connect()

這個API沒有發生變動.

在WifiserviceImpl.Java中會收到這個CMD,跟着做相應的處理

看下WifiStateMachine,一般都是在ConnectModeState中會處理這個

連接配接一個使用者指定的SSID

WifiQualifiedNetworkSelector

其實這個class的設計是用于自動連接配接一個信号比較好的wifi ssid的。把使用者連接配接一個熱點的邏輯整合在這裡,應該是為了避免在android 5.1經常出現的使用者觸發一個連接配接熱點的操作,結果背景auto connect自己選擇一個熱點也去連接配接了,結果兩個flow打架

2.1 看下①處的userSelectNetwork

到這裡的就結束了。。。。。這部分邏輯應該是為防止attempt auto join去跑的邏輯。

回到前面的WiFiConnectivityManager中,

2.2 跑完①之後,跟着會跑②

回到前面的WifiStatemachine中,跟着後面直接call mWifiNative.reconnect()去連接配接一個SSID。

3 Auto connect

Android N對這個auto connect的部分做了大改,重新做了。這個Auto connect的機制其實是為了做wifi 熱點的漫遊用,即當找到信号等品質更好的熱點的時候,就會切過去。但是在之前,特别是android L這個部分和使用者connect的flow産生沖突,出現了很多的bug,很雞肋。

前面提到的新 Android N scan機制 提到了幾種scan場景的應用,這個auto connect都會用到。這裡我們就隻分析一種case就好。

startPeriodicScan,這個是當螢幕是亮屏的時候,背景一直做scan的操作。

看下這裡傳入的監聽器:mPeriodicScanListener

看下這些函數都做了些什麼?

3.1 selectQualifiedNetwork

3.2 connectToNetwork

對我們通過算法算出來的目标ssid發起連接配接,candidate是一個WifiConfiguration對象。

接下來就交給Wifistatemachine去處理了。

/**
 * Automatically connect to the network specified
 *
 * @param networkId ID of the network to connect to
 * @param bssid BSSID of the network
 */
public void autoConnectToNetwork(int networkId, String bssid) {
 sendMessage(CMD_AUTO_CONNECT, networkId, , bssid);
}

/**
 * Automatically roam to the network specified
 *
 * @param networkId ID of the network to roam to
 * @param scanResult scan result which identifies the network to roam to
 */
public void autoRoamToNetwork(int networkId, ScanResult scanResult) {
 sendMessage(CMD_AUTO_ROAM, networkId, , scanResult);
}