android m/mr1(6.0/6.1)WifiAutoJoinController.java
Android7.0/7.1
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
PeriodicScanListener onResults
AllSingleScanListener onResults
PnoScanListener onPnoNetworkFound
handleScanResults
localLog(listenerName + " onResults: start QNS")
mQualifiedNetworkSelector.selectQualifiedNetwork()
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiQualifiedNetworkSelector.java
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConfigManager.java
selectQualifiedNetwork
//select best candidate network, return WifiConfiguration
1. if needQualifiedNetworkSelection() return false, then return null
that means: scanDetails=null or isLinkDebouncing
or skipQualifiedNetworkSelectionForAutoConnect(auto connect disabled)
or connecting/disconnecting or WifiConfiguration=null
or not allowed to switch network
or short time pass since last select
or current network is qualified
2. loop for scanDetails
2.1 ssid=null, add to noValidSsid, ignore
2.2 isBlackListed() ignore, addToBlacklist(bssid) will add to blackList
2.3 too weak signal strength add to lowSignalScan, ignore 2.4G level<-85 5G level<-85
2.4 not saved network(add to notSavedScan)or saved but ephemeral, ignore
2.5 calculate the score of each scanresult whose associated network is not ephemeral
Android 8.0/9.0
WifiConnectivityManager.java
private boolean handleScanResults(List<ScanDetail> scanDetails, String listenerName)
mNetworkSelector.selectNetwork(scanDetails...)
WifiNetworkSelector.java
WifiConfiguration selectNetwork(List<ScanDetail> scanDetails..)
registeredEvaluator.evaluateNetwork
SavedNetworkEvaluator.java
evaluateNetwork
score = calculateBssidScore()
rssi, 5G, lastUserSelectedNetworkId, Same Bssid, Security award