系列文章目录

【安卓Framework学习】Wifi框架学习之开启与关闭流程
【安卓Framework学习】Wifi框架学习之wifi状态机
【安卓Framework学习】Wifi框架学习之连接与断开流程
【安卓Framework学习】Wifi框架学习之扫描模式及扫描流程
【安卓Framework学习】Wifi框架学习之热点评分机制
【安卓Framework学习】安卓连接管理(ConnectivityService)之wifi连接及注册.


文章目录

  • 系列文章目录
  • 前言
  • 一、wifi框架中的核心类
    • 1、WifiManager
    • 2、WifiService
    • 3、WifiServiceImpl
    • 4、WifiInjector
    • 5、ClientModeImpl
    • 6、WifiNative
    • 7、ScanRequestProxy
    • 8、WifiScanner
    • 9、WifiScanningService
    • 10、WifiScanningServiceImpl
    • 11、WifiFrameworkInitializer
    • 12、WifiMonitor
    • 13、WifiConnectivityManager
  • 二、wifi相关服务获取
  • 总结

前言

前段时间做了一个wifi相关的需求,但是看了安卓wifi的标准api之后发现不够用,仍然会出现许多问题,比如wifi连接会有不稳定的时候,有时候能连接上有时候无法连接,但是却不知道是什么原因。为此萌发了去翻看wifi框架的源码进行学习。本文主要是针对wifi框架中的一些核心类,根据自己看源码的注释进行理解学习,可能理解得不那么精确,但掌握大致的意思。文中所有涉及到的源码均来源于Android11.


一、wifi框架中的核心类

1、WifiManager

此类是暴露给应用层开发者使用的一个管理类,我认为是一个代理类,其主要作用有:

  • 1、提供可以获得系统中已经配置过的wifi网络信息列表,主要体现在WifiConfiguration对象中。
  • 2、提供当前已经连接上的wifi的网络信息,并且能够通过广播获得当前连接时的动态状态。
  • 3、提供wifi扫描的api,能够触发wifi芯片扫描周围非隐藏的热点以及被添加到系统中的隐藏热点,并通过广播获得详细的扫描结果。
  • 4、定义了各种和wifi连接、扫描、状态相关的常用广播:
    • ACTION_WIFI_SCAN_AVAILABILITY_CHANGED 表示当前的wifi扫描是否有效,通过获取EXTRA_SCAN_AVAILABLE来判定本次扫描是否可以获得扫描结果。
    • SCAN_RESULTS_AVAILABLE_ACTION 表示扫描已经完成,并且可以获取扫描结果,通过getScanResults()方法获取
    • WIFI_STATE_CHANGED_ACTION 表示wifi的开启和关闭状态,一般会有已开启正在开启已关闭正在关闭未知这五个状态,通过EXTRA_WIFI_STATE来获取当前的状态值。
    • NETWORK_STATE_CHANGED_ACTION 表示wifi连接过程中的网络状态变化,可以通过获取EXTRA_NETWORK_INFO得到一个NetworkInfo对象获得详细的网络连接的状态信息。
    • CONFIGURED_NETWORKS_CHANGED_ACTION 表示已经存在系统中配置好的WifiConfiguration对象发生了变化和更新,获取EXTRA_WIFI_CONFIGURATION得到WifiConfiguration,但是在Android11之后就拿不到这个对象了。
    • RSSI_CHANGED_ACTION 表示wifi的信号强度有变化,获取EXTRA_NEW_RSSI得到新的信号强度。

2、WifiService

此类我认为是一个功能型类,继承了SystemService,主要是方便SystemServer统一启动其中的生命周期回调函数。在WifiService中实例化了真正的IWifiManager实现类的服务端WifiServiceImpl,服务端中实现了主要的wifi框架功能和流程。
以下为WifiService的构造函数,其中实例化了WifiServiceImplWifiInjector .

 public WifiService(Context contextBase) {super(contextBase);mWifiContext = new WifiContext(contextBase);WifiInjector injector = new WifiInjector(mWifiContext);WifiAsyncChannel channel =  new WifiAsyncChannel(TAG);mImpl = new WifiServiceImpl(mWifiContext, injector, channel);}

3、WifiServiceImpl

这个类是wifi框架中IWifiManager接口的实现类了,实现了安卓Framework中的wifi相关服务的核心函数,通过Binder跨进程通信,由WifiManager拿到其Binder对象调用相对应的api.

4、WifiInjector

此类在WifiService的构造函数中就实例化出一个对象,足以见得其与WifiServiceImpl是具有同等地位和作用的。根据官方的注释解释,WifiInjector是一个wifi相关类的依赖注入器,通过它可以获得各种wifi类的实例并且能够模拟注入。我推测其实官方为了方便测试wifi框架,然后用它来作为所有其他wifi相关类的一个入口,只要mock了它,就可以获得其他所有类,从而方便测试。

5、ClientModeImpl

在Android9.0的版本时,还不存在这个类,其实本类就是之前的wifi状态机WifiStateMachineClientModeImpl是由WifiInjector在初始化的时候实例化出来的对象,在WifiServiceImpl对象初始化的时候会去获得其对象。由于wifi框架中存在许多状态,大量运用到了状态模式来做开发,这个类主要处理wifi连接和断开的过程状态,所以一些连接、断开等业务实现是服务端WifiServiceImpl通过给ClientModeImpl发送消息然后交给它来实现具体的业务和切换具体的状态,每个状态在对同一个消息会有不同的处理。和之前WifiStateMachine不同,ClientModeImpl在Android11中将其他的状态移到别的类重了,目前只包含了8个状态,分别为DefaultStateConnectModeStateL2ConnectedStateDisconnectedStateDisconnectingStateRoamingStateObtainingIpStateConnectedState,如果对状态模式不了解的可以另行学习。

6、WifiNative

这个类就顾名思义了,和底层(对接的其实是HAL层Framework)真正去操作wifi模块的守护进程直接发送请求,请求wifi模块扫描、pno扫描、连接、断开以及这些操作之后的状态返回通过回调来通知上层Framework是否成功或者是其他结果。

7、ScanRequestProxy

此类管理来自外部应用程序的所有扫描请求,在WifiServiceImplWifiScanningServiceImpl之间作为一个代理类。其主要职责有:

  1. 启动/禁用扫描
  2. 作为一个扫描请求的代理,介于WifiServiceImplWifiScanningServiceImpl之间
  3. 缓存扫描结果,并用getScanResults()可以获取扫描结果
  4. 当有新的扫描结果时,向外发送SCAN_RESULTS_AVAILABLE_ACTION广播
  5. 限制非设置应用的扫描请求(并非不让飞设置应用扫描,只是做限制)

8、WifiScanner

WifiManager一样在同一个位置被初始化,作为暴露给上层的一个wifi扫描的管理类,但是平时开发并不能够直接获得。其封装了一些api,然后通过异步通信AsyncChannelWifiScanningServiceImpl之间进行消息发送和接收,实现响应的扫描功能和结果返回。

9、WifiScanningService

此类与WifiService一样,继承了SystemService,主要是方便SystemServer统一启动其中的生命周期回调函数。在WifiScanningService中实例化了真正的IWifiScanner实现类的服务端WifiScanningServiceImpl,服务端中实现了主要的wifi框架中扫描功能。
以下为WifiScanningService的构造函数,其中实例化了WifiScanningServiceImpl.

    public WifiScanningService(Context contextBase) {super(new WifiContext(contextBase));Log.i(TAG, "Creating " + Context.WIFI_SCANNING_SERVICE);mHandlerThread = new HandlerThread("WifiScanningService");mHandlerThread.start();mImpl = new WifiScanningServiceImpl(getContext(), mHandlerThread.getLooper(),WifiScannerImpl.DEFAULT_FACTORY,getContext().getSystemService(BatteryStatsManager.class),WifiInjector.getInstance());}

10、WifiScanningServiceImpl

这个类与WifiServiceImpl一样,是对IWifiScanner的实现,实现了wifi扫描服务主要的功能,主要是体现了三种扫描方式单次扫描、后台扫描、PNO扫描,这三种扫描方式对应的策略和场景不同不在这做详细描述,但是同时在这个类里面对应三种不同的状态机WifiSingleScanStateMachineWifiBackgroundScanStateMachineWifiPnoScanStateMachine.

11、WifiFrameworkInitializer

这个类用来注册wifi相关服务,可以在这里看到WifiManagerWifiScanner都是在这里被实例化,并且获得相对应的远端服务的Binder对象的。

    public static void registerServiceWrappers() {SystemServiceRegistry.registerContextAwareService(Context.WIFI_SERVICE,WifiManager.class,(context, serviceBinder) -> {IWifiManager service = IWifiManager.Stub.asInterface(serviceBinder);return new WifiManager(context, service, getInstanceLooper());});...//此处省略部分注册SystemServiceRegistry.registerContextAwareService(Context.WIFI_SCANNING_SERVICE,WifiScanner.class,(context, serviceBinder) -> {IWifiScanner service = IWifiScanner.Stub.asInterface(serviceBinder);return new WifiScanner(context, service, getInstanceLooper());});...//此处省略部分注册}

12、WifiMonitor

WifiMonitor就是用来监听wpa_supplicantwificond上报上来的事件,并且在java层Framework中将这些事件广播出去。wifi框架中的其他类例如ClientModeImpl会将自己的Handler注册到WifiMonitor中,WifiMonitor在接收到wpa_supplicantwificond上报上来的事件然后给监听了对应消息的Handler发送消息,拥有Handler对象的类根据实际业务再做响应的处理。

 public synchronized void registerHandler(String iface, int what, Handler handler) {SparseArray<Set<Handler>> ifaceHandlers = mHandlerMap.get(iface);if (ifaceHandlers == null) {ifaceHandlers = new SparseArray<>();mHandlerMap.put(iface, ifaceHandlers);}Set<Handler> ifaceWhatHandlers = ifaceHandlers.get(what);if (ifaceWhatHandlers == null) {ifaceWhatHandlers = new ArraySet<>();ifaceHandlers.put(what, ifaceWhatHandlers);}ifaceWhatHandlers.add(handler);}

13、WifiConnectivityManager

这个类就是用来管理所有的wifi连接的扫描活动,当屏幕开启或关闭、wifi连接或断开或者有扫描需求时,都会启动一次扫描,并将扫描结果传递给wifi框架选择并评分,然后让wifi框架选择出扫描结果中最优的热点最为推荐热点。

二、wifi相关服务获取

总结

总结起来,其实wifi框架主要是类比较繁多,但其实结构较为简单,主要是围绕wifi连接服务类和wifi扫描服务类

【安卓Framework学习】Wifi框架学习之核心类相关推荐

  1. 【安卓Framework学习】Wifi框架学习之热点评分机制

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...

  2. 【安卓Framework学习】Wifi框架学习之wifi状态机

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类. [安卓Framework学习]Wifi框架学习之开启与关闭流程. [安卓Framework学习]Wifi框架学习之连接与断开流程 ...

  3. 【安卓Framework学习】Wifi框架学习之开启与关闭流程

    系列文章目录 [安卓Framework学习]Wifi框架学习之核心类 [安卓Framework学习]Wifi框架学习之wifi状态机 [安卓Framework学习]Wifi框架学习之连接与断开流程 [ ...

  4. 数据增强 transform_深度学习-Pytorch框架学习之数据处理篇

    前言 数据是深度学习的核心,大部分论文里都会提到data-driven这个词,也就是数据驱动的意思.基本的模型搭建完成后,如何处理数据,如何将数据送给网络,如何做数据增强等等,对于提高网络的性能都十分 ...

  5. spring boot框架学习2-spring boot核心(1)

    本节主要: 1:解析spring boot入口和@SpringBootApplication源码详解 SpringBootApplication包含: @SpringBootConfiguration ...

  6. 关于“labuladong的算法小抄”的学习笔记---第0章核心框架汇总的前半部分框架(c++版)

    目录 作者给自己的话 一.学习算法和刷题的框架思维 1.数据结构的存储方式 2.数据结构的基本操作 3.算法刷题指南 二.labuladong的刷题心得 1.算法的本质 2.数组/单链表系列算法 3. ...

  7. Quartz框架学习(1)—核心层次结构

    Quartz框架学习 Quartz(任务调度)框架的核心组件: job:任务.即任务调度行为中所要调度的对象. trigger:触发器.是什么促使了一个任务的调度?当然是时间.这也算事件驱动类型程序. ...

  8. 腾讯优图开源深度学习推理框架 TNN,助力 AI 开发降本增效

    从学界到工业界,"开源"已经成为AI领域的一个关键词.一方面,它以"授人以渔"的方式为AI构建了一个开放共进的生态环境,帮助行业加速AI应用落地:另一方面,在解 ...

  9. TIP 2021 | 重访CV经典!首个无监督深度学习图像拼接框架

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 作者:廖康  |  已授权转载(源:知乎) https://zhuanlan.zhihu.com/p/386 ...

最新文章

  1. DOM4J解析XML文档、Document对象、节点对象节点对象属性、将文档写入XML文件(详细)...
  2. 常考数据结构与算法:二叉树的镜像
  3. 【小练习03】CSS-表格(table)--天气预报
  4. C++ Opengl 变形实例源码
  5. 三层架构与设计模式思想部署企业级数据库业务系统开发
  6. flatpickr功能强大的日期时间选择器插件
  7. C++面向对象思想 两条直线交点计算
  8. 程序员崩溃了,想拿的年终奖怎么说黄就黄?!
  9. 敏捷开发框架_RingCentral Tech丨LeSS- 大规模敏捷开发框架实践心路
  10. java实现凯撒密码_Java实现进阶版凯撒密码
  11. Flutter Dio 报错is not a subtype of type ‘DioError‘
  12. window7安装jdk报错this version of the jdk is already installed
  13. ElementUI Collapse 折叠面板
  14. pytest告警信息的处理方法
  15. Google 常用镜像收集
  16. cve-2020-7066简单解析
  17. epoll LT ET 区别 | Nginx epoll 原理 listend 用 LT
  18. hive3编译 on tez+tez-ui配置和遇到的兼容问题与踩坑记录
  19. activiti会签多人审批(通过以及驳回)
  20. python的print输出居中对齐

热门文章

  1. android自定义横竖双向滚动,Android开发实现自定义水平滚动的容器示例
  2. 苹果xr配置_看看下面这些对比,你就知道苹果x和xr哪个好?
  3. HRBUST1151-魔女
  4. 2022年9月份前端女生工作总结
  5. 笔记本扩展屏幕后没声音的解决办法(HDMI转VGA)
  6. 今日头条-新年集卡分2亿,每晚8:45红包雨
  7. 美国乳品公司试点区块链技术改善食品供应链
  8. 小白的靶机VulnHub-Temple of Doom
  9. 信号带e无法连接服务器,手机信号栏突然出现“E”是啥意思?原来是这个问题,望周知...
  10. 【元宵快乐】猜灯谜吃元宵 元气满满闹元宵~(附猜灯谜小游戏)