本文是对wifi扫描结果上报和获取过程的java层代码流程梳理总结。
我们先分析扫描成功的上报和获取过程。
一、WiFi扫描成功的上报和获取过程
WiFi扫描成功的上报和获取大致是由三条不连贯流程组成的,分别是通知framework和WifiTracker获取扫描结果以及应用主动获取扫描结果。
1.framework获取保存扫描结果。大致的流程为:WificondControl-->WifiMonitor--> WificondScannerImpl-->WifiNative;
2.WifiTracker获取和保存扫描结果。大致的流程为:WificondControl-->WifiMonitor--> WificondScannerImpl-->WifiNative;
3.Settings应用获取扫描结果
下面我们看下代码的具体流程:
1 framework获取保存扫描结果
WificondControl.java
WifiMonitor.java
WificondScannerImpl.java
进入pollLatestScanData();
通过mWifiNative.getScanResults来从底层获取wifi扫描结果。
WifiNative.java
最后调用scannerImpl.getScanResults()从底层获扫描取数据。
2、WifiTracker获取和保存扫描结果
ScanRequestProxy.java
onResults()是底层完成扫描后的上报;
发送广播SCAN_RESULTS_AVAILABLE_ACTION通知WifiTracker扫描结果可获取
WifiTracker获取扫描数据
WifiTracker在这里接收到扫描结果获取的广播WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
这里调用了mWifiManager.getScanResults()获取扫描数据,然后调用updateAccessPoints(newScanResults, configs)刷新缓存的扫描数据;
packages\modules\Wifi\framework\java\android\net\wifi\WifiManager.java
WifiManager.java
service是IWifiManager 类型的aidl文件,具体实现在packages\modules\Wifi\service\java\com\android\server\wifi\BaseWifiService.java
IWifiManager mService;
public class BaseWifiService extends IWifiManager.Stub {
具体实现在packages\modules\Wifi\service\java\com\android\server\wifi\WifiServiceImpl.java
WifiServiceImpl.java
ScanRequestProxy.java
这里看看mLastScanResults怎么来的。
这里可以看到mLastScanResults就是ScanRequestProxy在发送广播时赋值的。所以WifiTracker获取的扫描数据是framwork缓存的值。
WifiTracker缓存扫描数据
这个mInternalAccessPoints会在5.3中用到的。
3、Settings应用获取扫描结果
在生命周期函数onStart()处理Wifi的状态;
这里的mInternalAccessPoints 则是在WifiTracker保存的。
二、扫描失败结果上报
前面只分析了扫描成功后的结果的上报,这里再分析下扫描失败部分的上报流程。扫描命令下发失败、扫描过程中失败,扫描结果获取超时。
1 扫描命令下发失败。
WifiServiceImpl.java
这里调用了runWithScissonrs()。这是一个同步等待其他线程handler的执行的方法,超时后就会返回false。
这里如果超时就返回false就发送广播sendFailedScanBroadcast(),通知扫描失败。
再看下scanSuccess.value结果。
ScanRequestProxy.java
这里再一次进行了扫描之前的判断并发送广播通知扫描失败。下面继续跟踪扫描的方法走。
这里的方法中通过replyFailed()通知扫描失败。
WifiScanner.java
这里移除对应的listener,如果是failed,就回调listener的onFailure方法,将失败原因和描述传递打印出来。
ScanRequestProxy.java
后面就进入WificondScannerImpl中的startSingleScan().
2 扫描过程中失败
WificondScannerImpl.java
方法中对mWifiNative.scan()的返回结果做了处理,
handleScanTimeout()方法是当下发扫描命令成功后会设立一个15s的倒计时,若15s没有失败或者成功上报就会上报一个失败,最终触发广播通知
3 扫描结果获取失败
WificondControl.java,