1. 在WifiSettings界面,每10s扫描一次
frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
mWifiManager.startScan()
sendEmptyMessageDelayed(MSG_SCAN, WIFI_RESCAN_INTERVAL_MS);
WIFI_RESCAN_INTERVAL_MS=10s
I WifiService: startScan uid=1000
D WifiHandler.WifiScanningService: handleMessage Received message=159765d sendingUid=1000
D WifiScanningService: addSingleScanRequest: ClientInfo[uid=1000,android.os.Messenger@4c0c49],Id=60,WorkSource{1000}, ScanSettings { type:HIGH ACCURACY band:24Ghz & 5Ghz (DFS incl) period:0 reportEvents:3 numBssidsPerScan:0 maxScansToCache:0 channels:[ ] hiddenNetworks:[ ] }
D WifiScanRequestProxy: Scan request succeeded
D WifiScanningService: replySucceeded replySucceeded recvdMessage=159765
2. 亮屏时 周期性扫描 20s-40s-80s-160s
WifiConnectivityManager.java ->WifiScanner ->WifiScanningServiceImpl ->WifiNative
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
startConnectivityScan
亮屏时 startPeriodicScan(scanImmediately) 20s-40s-80s-160s
灭屏时 且断开连接 startDisconnectedPnoScan DISCONNECTED_PNO_SCAN_INTERVAL_MS=20s
startPeriodicScan
startPeriodicSingleScan()
startSingleScan(isFullBandScan, WIFI_WORK_SOURCE);
mScanner.startScan
schedulePeriodicScanTimer(mPeriodicSingleScanInterval);
D WifiConnectivityManager: startConnectivityScan: screenOn=true wifiState=transitioning scanImmediately=true wifiEnabled=true wifiConnectivityManagerEnabled=true
I WifiStateMachine: disconnectedstate enter
D WifiStateMachine: Enter DisconnectedState screenOn=true
D WifiConnectivityManager: handleConnectionStateChanged: state=disconnected
D WifiConnectivityManager: scheduleWatchdogTimer
D WifiConnectivityManager: startConnectivityScan: screenOn=true wifiState=disconnected scanImmediately=true wifiEnabled=true wifiConnectivityManagerEnabled=true
D WifiConnectivityManager: schedulePeriodicScanTimer, intervalMs: 20000
D WifiHandler.WifiScanningService: handleMessage Received message=159765d sendingUid=1000
D WifiScanningService: addSingleScanRequest: ClientInfo[uid=1000,android.os.Messenger@4c0c49],Id=28,WorkSource{1010}, ScanSettings { type:HIGH ACCURACY band:24Ghz & 5Ghz (DFS incl) period:0 reportEvents:3 numBssidsPerScan:0 maxScansToCache:0 channels:[ ] hiddenNetworks:[ ] }
D WifiScanningService: replySucceeded replySucceeded recvdMessage=159765
D WifiStateMachine: DisconnectedState !CMD_GET_SUPPORTED_FEATURES uid=1000 rt=11953480/11953480 0 0
D WifiStateMachine: ConnectModeState !CMD_GET_SUPPORTED_FEATURES uid=1000 rt=11953480/11953480 0 0
D WifiStateMachine: DefaultState !CMD_GET_SUPPORTED_FEATURES uid=1000 rt=11953480/11953480 0 0
D WifiHAL : WifiRequest::create vendor command to iface 37, vendor_id=0x1a11, subcmd=0x0002, res=0
3. 灭屏 且断开连接,仅扫描已保存的ssid, 20s
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
startConnectivityScan
亮屏时 startPeriodicScan(scanImmediately) 20s-40s-80s-160s
灭屏时 且断开连接 startDisconnectedPnoScan DISCONNECTED_PNO_SCAN_INTERVAL_MS=20s
startDisconnectedPnoScan
mScanner.startDisconnectedPnoScan WifiScanner.java
startPnoScan
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
startPnoScan
mAsyncChannel.sendMessage(CMD_START_PNO_SCAN, 0, key, pnoParams);
addHwPnoScanRequest
addPnoScanRequest
mActivePnoScans.addRequest()
4. 断开连接时 每20分钟一次WATCHDOG_INTERVAL_MS = 20 * 60 * 1000
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiConnectivityManager.java
handleConnectionStateChanged
scheduleWatchdogTimer()
startConnectivityScan(SCAN_IMMEDIATELY)
watchdogHandler()
scheduleWatchdogTimer();
startSingleScan(true, WIFI_WORK_SOURCE)
D WifiConnectivityManager: start a single scan from watchdogHandler
D WifiConnectivityManager: scheduleWatchdogTimer
D WifiHandler.WifiScanningService: handleMessage Received message=159765d sendingUid=1000
D WifiScanningService: addSingleScanRequest: ClientInfo[uid=1000,android.os.Messenger@4c0c49],Id=29,WorkSource{1010}, ScanSettings { type:HIGH ACCURACY band:24Ghz & 5Ghz (DFS incl) period:0 reportEvents:3 numBssidsPerScan:0 maxScansToCache:0 channels:[ ] hiddenNetworks:[ ] }
D WifiScanningService: replySucceeded replySucceeded recvdMessage=159765
5. 其他应用触发的扫描,这是gms触发的
D WifiHandler.WifiScanningService: handleMessage Received message=159765d sendingUid=10018
D WifiScanningService: addSingleScanRequest: ClientInfo[uid=10018,android.os.Messenger@cafe09e],Id=9,WorkSource{10018 com.google.android.gms, 10061 com.google.android.googlequicksearchbox}, ScanSettings { type:LOW LATENCY band:24Ghz & 5Ghz (no DFS) period:0 reportEvents:2 numBssidsPerScan:25 maxScansToCache:0 channels:[ ] hiddenNetworks:[ ] }
D WifiScanningService: replySucceeded replySucceeded recvdMessage=159765
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java
public void onPnoNetworkFound(ScanResult[] results) {
sendMessage(CMD_PNO_NETWORK_FOUND, 0, 0, results);
addSingleScanRequest
sendRequestToClientHandler(WifiScanner.CMD_START_SINGLE_SCAN...)
case WifiScanner.CMD_START_SINGLE_SCAN:
validateScanRequest
mActiveScans.addRequest(ci, handler, workSource, scanSettings);
mPendingScans.addRequest(ci, handler, workSource, scanSettings);
/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
<integer name="def_wifi_scan_always_available">0</integer>
/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
loadIntegerSetting(stmt, Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE,
R.integer.def_wifi_scan_always_available);
/packages/apps/Settings/src/com/android/settings/wifi/WifiScanningRequiredFragment.java
public void onClick(DialogInterface dialog, int which)
case DialogInterface.BUTTON_POSITIVE:
Settings.Global.putInt(contentResolver,
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
/packages/apps/Settings/src/com/android/settings/wifi/WifiScanModeActivity.java
private void doPositiveClick() {
Settings.Global.putInt(getContentResolver(),
Settings.Global.WIFI_SCAN_ALWAYS_AVAILABLE, 1);
/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiSettingsStore.java
public synchronized boolean isScanAlwaysAvailable() {
return !mAirplaneModeOn && mScanAlwaysAvailable;
}