Android 9.0 WiFi 扫描结果上报和获取流程

简介: Android 9.0 WiFi 扫描结果上报和获取流程

本文是对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,


WificondScannerImpl.java


目录
相关文章
|
4天前
|
Android开发
Android 状态栏WiFi图标的显示逻辑
Android 状态栏WiFi图标的显示逻辑
31 0
|
3天前
|
设计模式 算法 Android开发
2024年Android网络编程总结篇,androidview绘制流程面试
2024年Android网络编程总结篇,androidview绘制流程面试
2024年Android网络编程总结篇,androidview绘制流程面试
|
3天前
|
Android开发
Android获取当前连接的wifi名称
Android获取当前连接的wifi名称
14 6
|
4天前
|
Java Android开发
Android 切换壁纸代码流程追踪
Android 切换壁纸代码流程追踪
15 0
|
4天前
|
Android开发
android连接指定wifi
android连接指定wifi
18 0
|
4天前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
19 0
|
4天前
|
Java Android开发
Android startActivity流程
Android startActivity流程
7 0
|
4天前
|
Java Android开发
Android 9在连接以太网情况下 还能连接WiFi
Android 9在连接以太网情况下 还能连接WiFi
11 0
|
4天前
|
Android开发
Android12 ethernet和wifi共存
Android12 ethernet和wifi共存
20 0
|
4天前
|
Java Shell Android开发
Android11 有线网和wifi优先级设置
Android11 有线网和wifi优先级设置
17 0