小米mix2 WLAN扫描开关位于设置-更多设置-系统安全-位置信息-扫描,截图如下
搜索字符串
之后定位到ScanningSettings这个类对应于开关的逻辑处理
从如上代码可以看到该开关其实就是对应了一个数据库值(Global.WIFI_SCAN_ALWAYS_AVAILABLE)的变化
在framework搜索相关数据库监听
挨个看了下WifiServiceImpl中有对该数据库值(Global.WIFI_SCAN_ALWAYS_AVAILABLE)的监听
数据库值(Global.WIFI_SCAN_ALWAYS_AVAILABLE)的变化会触发
依次看下
WifiSettingsStore就是更新一下自己保存的局部变量mScanAlwaysAvailable与当前开关保存一致。
搜索代码看了下只有三个状态会对消息CMD_SCAN_ALWAYS_MODE_CHANGED进行处理,分别是
DefaultState(不作处理)
ApStaDisabledState(若开关打开,切换到StaDisabledWithScanState)
StaDisabledWithScanState(若开关关闭,切换到ApStaDisabledState)
2.4.1 wifi scan always打开
从如上代码及状态之间图示可以看出状态切换只走了StaDisabledWithScanState的enter方法
简单看了就是切换到了SCAN_ONLY_WITH_WIFI_OFF_MODE并且启动了supplicant
WSM
i 切换SCAN_ONLY_WITH_WIFI_OFF_MODE
InitialState
ii 启动supplicant
可以看到两步其实都下发了启动supplicant的命令,简单看起来有冗余,之后WiFi启动流程是差不多的,加载驱动-启动supplicant,从InitialState-SupplicantStartingState-SupplicantStartedState
之前梳理WiFi启动流程的时候OperationalMode都是CONNECT_MODE,之后会切换到DisconnectedState
而这次wifi scan always的OperationalMode是SCAN_ONLY_WITH_WIFI_OFF_MODE,这时会切换到ScanModeState
这个状态很简单,就处理两个消息,CMD_SET_OPERATIONAL_MODE和CMD_START_SCAN,主要看下CMD_START_SCAN的处理
(对比ConnectModeState可以处理CMD_START_CONNECT CMD_START_ROAM CMD_SAVE_CONFIG等等连接相关的命令)
这里还可以看到
这边应该是可以让扫描可以扫描到隐藏网络的相关代码,梳理待续
可以理解为ScanModeState主要就处理扫描请求,和其所处模式SCAN_ONLY_WITH_WIFI_OFF_MODE的描述很相符,WiFi关闭情况下只进行扫描。
2.4.1 wifi scan always关闭
WifiController
这边看来就是将supplicant关闭即可
WSM ScanModeState的父状态为SupplicantStartedState,由于ScanModeState无法处理CMD_STOP_SUPPLICANT,由其父状态SupplicantStartedState处理。
切换到SupplicantStoppingState
关闭supplicant后切换到InitialState状态
流程处理完毕。