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


目录
相关文章
|
2月前
|
Android开发
Android 状态栏WiFi图标的显示逻辑
Android 状态栏WiFi图标的显示逻辑
58 0
|
15天前
|
ARouter IDE 开发工具
Android面试题之App的启动流程和启动速度优化
App启动流程概括: 当用户点击App图标,Launcher通过Binder IPC请求system_server启动Activity。system_server指示Zygote fork新进程,接着App进程向system_server申请启动Activity。经过Binder通信,Activity创建并回调生命周期方法。启动状态分为冷启动、温启动和热启动,其中冷启动耗时最长。优化技巧包括异步初始化、避免主线程I/O、类加载优化和简化布局。
29 3
Android面试题之App的启动流程和启动速度优化
|
7天前
|
安全 网络协议 算法
Android网络基础面试题之HTTPS的工作流程和原理
HTTPS简述 HTTPS基于TCP 443端口,通过CA证书确保服务器身份,使用DH算法协商对称密钥进行加密通信。流程包括TCP握手、证书验证(公钥解密,哈希对比)和数据加密传输(随机数加密,预主密钥,对称加密)。特点是安全但慢,易受特定攻击,且依赖可信的CA。每次请求可能复用Session ID以减少握手。
16 2
|
20天前
|
Android开发
Android面试题之activity启动流程
该文探讨了Android应用启动和Activity管理服务(AMS)的工作原理。从Launcher启动应用开始,涉及Binder机制、AMS回调、进程创建、Application和Activity的生命周期。文中详细阐述了AMS处理流程,包括创建ClassLoader、加载APK、启动Activity的步骤,以及权限校验和启动模式判断。此外,还补充了activity启动流程中AMS的部分细节。欲了解更多内容,可关注公众号“AntDream”。
16 1
|
21天前
|
Java Linux Android开发
Android面试题之说说系统的启动流程(总结)
这篇文章概述了Android系统的启动流程,从Boot Rom到Zygote进程和SystemServer的启动。init进程作为用户级别的第一个进程,负责创建文件目录、初始化服务并启动Zygote。Zygote通过预加载资源和创建Socket服务,使用fork函数生成SystemServer进程。fork过程中,子进程继承父进程大部分信息但具有独立的进程ID。Zygote预加载资源以减少后续进程的启动时间,而SystemServer启动众多服务并最终开启Launcher应用。文中还讨论了为何从Zygote而非init或SystemServer fork新进程的原因。
27 2
|
16天前
|
存储 XML 数据库
深入地了解Android应用开发的流程和技术
深入地了解Android应用开发的流程和技术
14 0
|
20天前
|
vr&ar 数据库 Android开发
Android面试题之ActivityManagerService的启动流程
本文探讨了Android系统的SystemServer启动过程,包括创建SystemContext、引导服务、启动各类核心服务以及AMS的启动和初始化。AMS负责管理activity、广播队列、provider等,并设置SystemProcess,安装系统Provider。当AMS调用SystemReady时,系统UI准备启动,启动Launcher。文中还对比了init、zygote和system_server进程的角色。最后推荐了两本关于Android内核剖析的书籍:柯元旦教授的《Android内核剖析》和罗升阳的《Android系统源代码情景分析》。关注公众号AntDream获取更多内容。
19 0
|
2月前
|
Android开发
Android获取当前连接的wifi名称
Android获取当前连接的wifi名称
49 6
|
2月前
|
设计模式 算法 Android开发
2024年Android网络编程总结篇,androidview绘制流程面试
2024年Android网络编程总结篇,androidview绘制流程面试
2024年Android网络编程总结篇,androidview绘制流程面试
|
2月前
|
Java Android开发
Android 切换壁纸代码流程追踪
Android 切换壁纸代码流程追踪
23 0