天天看点

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);
}