【安卓Framework学习】Wifi框架学习之核心类

Android系统的Wi-Fi系统框架和详细启动流程 在Android系统中,Wi-Fi系统的框架和流程涉及多个组件和技术,包括Wi-Fi管理服务(WifiManager)、Wi-Fi驱动、硬件接口等。其中,服务部分主要包括,它负责处理来自应用层的请求和与硬件通信。以下是对Android Wi-Fi系统框架和启动流程的详细解释。 阅读详情

系列文章目录

【安卓Framework学习】Wifi框架学习之开启与关闭流程
【安卓Framework学习】Wifi框架学习之wifi状态机
【安卓Framework学习】Wifi框架学习之连接与断开流程
【安卓Framework学习】Wifi框架学习之扫描模式及扫描流程
【安卓Framework学习】Wifi框架学习之热点评分机制
【安卓Framework学习】安卓连接管理(ConnectivityService)之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的构造函数,其中实例化了WifiServiceImpl和WifiInjector .

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

6、WifiNative

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

7、ScanRequestProxy

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

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

8、WifiScanner

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

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扫描,这三种扫描方式对应的策略和场景不同不在这做详细描述,但是同时在这个类里面对应三种不同的状态机WifiSingleScanStateMachine、WifiBackgroundScanStateMachine、WifiPnoScanStateMachine.

11、WifiFrameworkInitializer

这个类用来注册wifi相关服务,可以在这里看到WifiManager和WifiScanner都是在这里被实例化,并且获得相对应的远端服务的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_supplicant和wificond上报上来的事件,并且在java层Framework中将这些事件广播出去。wifi框架中的其他类例如ClientModeImpl会将自己的Handler注册到WifiMonitor中,WifiMonitor在接收到wpa_supplicant和wificond上报上来的事件然后给监听了对应消息的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扫描服务类

Android WiFi关闭机制全解:从Framework到HAL的调用链与调试指南 在Android系统开发中,WiFi模块的启停远非表面那般简单。用户点击关闭开关后,请求需经WifiManager、Binder、WifiService等层级传递,由WifiController与WifiStateMachine两个核心状态机协同完成扫描终止、连接断开、supplicant停止与驱动释放等操作。这一机制涉及AIDL跨进程通信、状态迁移超时、HAL接口适配等底层原理,理解其设计有助于定位WiFi关闭慢、无响应或重启等疑难问题。无论是系统定制工程师还是应用开发者,掌握该调用链都能在功耗优化、网络 阅读详情

相关推荐

Android框架WiFi架构

动平台,它主要是用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,而实际上工作内容是通过socket(不管是wpa_supplicant与上层还是wpa_spplicant与驱动都采用socket通讯)与驱动交互上报数据给用户,而用户可以通过socket发送命令给wpa_supplicant调试来对wifi芯片操作,简单的说,二、android wifi 系统架构:andtoid wifi 系统引入了wpa_supplicant,它的整个wifi系统。

手机-手表蓝牙开发工程师的博客 3456

Android WIFI架构

Android wifi架构

123的专栏 2415

android wifi的整体架构以及架构下的模块细分

本文主要介绍wifi的整体架构,我们在学习一个模块时,不能一开始就去坑代码,要先从整体的看待这个模块,不然我们两眼一抹黑,就进入到代码的时间的时候,发现这里不懂哪里不懂,只有先了解事务的一个宏观情况,然后再到代码里面去深挖才能慢慢对该问题真正掌握。

changcheng00的博客 2613

WiFi基本知识总结 --- 通信框架及基础概念说明

IEEE 802.11协议族定义了无线局网的MAC和PHY层标准,下面总结常见的IEEE 802.11类协议。IEEE802.11系列常见协议•11a: for5GHz•11b: for2.4GHz•11g: for2.4GHz•11n: for5GHzand2.4GHz将上面提到的协议,整理如下:802.11MAC层相关标准:只要是无线网络里面的一些功能的规范,或是具体协议的体现,如QOS、MESH、错误检测、数据帧校验、无线安全标准;

wit_732的博客 4万+

Android 12.0 framework层禁止扫描5g wifi功能实现

在12.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持2.4g网络,所以需要在wifi扫描的过程中 禁止扫描5g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能

安卓兼职framework和app工程师的博客 375

Android 11.0 framework层禁止扫描5g wifi功能实现

在11.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持2.4g网络,所以需要在wifi扫描的过程中 禁止扫描5g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能

安卓兼职framework和app工程师的博客 539

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

上一篇重点介绍了wifi的开关流程【安卓Framework学习】Wifi框架学习之开启与关闭流程,由于中间涉及到较多的状态机,本篇想对wifi框架中的各类状态机详细介绍一下。本篇中涉及到的安卓源码均来源于安卓11.状态模式是设计模式中的行为模式的一种,对于其解释网络上解释的相当全面了。通俗一点来说,就是某个对象,包含一些动作或方法,但是这些动作和方法根据对象目前所处状态不同会有不同的运行..................

qq_39036223的博客 3825

Android 11.0 framework层禁止扫描2.4g wifi功能实现

在11.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持5g网络,所以需要在wifi扫描的过程中 禁止扫描2.4g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能

安卓兼职framework和app工程师的博客 446

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

前言 上一篇记录了安卓wifi框架中的主要的核心类,后续学习内容主要从实际的操作动作或者业务流程出发,分析其在wifi框架中的主要流程。本次学习内容针对常见的开启和关闭wifi来梳理其中的流程。文中出现的代码大部分基于android11源码。...............

qq_39036223的博客 6266

Android 13.0 framework层禁止扫描5g wifi功能实现

在13.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持2.4g网络,所以需要在wifi扫描的过程中 禁止扫描5g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能

安卓兼职framework和app工程师的博客 381

Android 10.0 framework层禁止扫描5g wifi功能实现

在10.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持2.4g网络,所以需要在wifi扫描的过程中 禁止扫描5g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能

安卓兼职framework和app工程师的博客 880

【安卓Framework学习】Wifi框架学习之扫描模式及扫描流程

之前有分析学习过wifi的开启【安卓Framework学习】Wifi框架学习之开启与关闭流程和连接过程【安卓Framework学习】Wifi框架学习之连接与断开流程,但在没有连接的时候wifi模组又是如何扫描运作的呢?本篇将从wifi的扫描过程中分析其源码,......

qq_39036223的博客 4116

Android 9.0 framework层禁止扫描2.4g wifi功能实现

在9.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持5g网络,所以需要在wifi扫描的过程中 禁止扫描2.4g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能

安卓兼职framework和app工程师的博客 311

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

之前分析过wifi框架中的连接断开、开启关闭以及扫描相关的流程,本篇将继续分析wifi框架中隐藏较深的一个机制——热点的评分机制。在安卓wifi框架中,这一套机制实现了对设备周围的热点在一定规则下进行打分,然后根据分数高低决定是否需要连接。由于此机制中包含的规则较多,如有不正确之处望大家及时指出。文中出现的代码大部分基于android11源码。......

qq_39036223的博客 2911

Android 9.0 framework层禁止扫描5g wifi功能实现

在10.0的系统rom定制化开发中,在关于对wifi模块的开发中,由于wifi模块仅支持2.4g网络,所以需要在wifi扫描的过程中 禁止扫描5g网络,所以就需要分析扫描过程中的功能,接下来具体实现相关功能

安卓兼职framework和app工程师的博客 263

Cadence AMS数模混合仿真:从零搭建高效验证环境的实战指南

本文是Cadence AMS数模混合仿真的实战指南,详细介绍了如何从零搭建高效的芯片验证环境。内容涵盖环境准备、Testbench创建、核心Config视图与ADE设置、仿真运行调试及性能加速技巧,旨在帮助工程师解决SoC设计中数字与模拟模块的集成验证难题,确保芯片设计一次成功。

weixin_29164091的博客 315

【安卓Framework学习】Wifi框架学习之连接与断开流程

前几篇介绍了wifi框架中的状态机和wifi的开关流程,本篇将基于wifi的连接和断开功能分析其代码流程。由于连接和断开是wifi功能中用得最多也是最重要的功能之一,可以说前几篇都也为这一篇做了铺垫。............

qq_39036223的博客 4399

英飞凌ADS开发环境搭建全流程:从安装到第一个程序烧录

本文详细介绍了英飞凌ADS开发环境搭建的全流程,包括环境准备、ADS安装与配置、MemTools烧录技巧等关键步骤。针对嵌入式开发者,特别提供了从安装到第一个程序烧录的实战指南,涵盖常见问题解决方案和优化建议,帮助开发者快速上手英飞凌AURIX系列微控制器的开发工作。

qsc901234的博客 326

【安卓Framework学习】安卓连接管理(ConnectivityService)之wifi连接及注册

之前介绍了一些wifi框架相关的内容,由于wifi框架在安卓连接框架中只是一个小部分,所以今天会分析一下wifi连接上后连接管理框架是如何管理这些网络连接等其他连接的。本篇中涉及到的安卓源码均来源于安卓11.由类名粗暴的理解为网络工厂,本人理解为所需要的网络由此类提供并控制。根据提供的不同的网络类型有不同的实现,wifi的实现类为,以太网的实现为。网络工厂在每个网络框架初始化时便会实例化一个对象出来与网络是否被使用或连接上无关,同时会向连接管理(

qq_39036223的博客 2938

FPGA实战笔记——SDRAM乒乓缓存与OV5640视频采集(VGA显示优化篇)

本文详细介绍了基于FPGA的SDRAM乒乓缓存技术在OV5640视频采集与VGA显示优化中的应用。通过设计多时钟域同步和双Bank乒乓缓存策略,有效解决了摄像头30fps输出与VGA 60fps显示之间的帧率不匹配问题,实现了720P高清视频的流畅稳定显示,为实时图像处理系统提供了可靠的硬件解决方案。

ss78901的博客 874

分布式 Agent 系统设计:高并发场景下的挑战与解决方案

分布式 Agent 系统由多个分布在不同节点上的智能 Agent 组成,这些 Agent 具有自主决策能力,能够通过通信协作完成复杂任务。每个 Agent 可以看作是一个独立的实体,具备感知环境、处理信息、执行动作的功能,它们相互协作,共同实现系统的整体目标。分布式 Agent 系统在高并发场景下面临着资源调度、通信延迟、状态一致性、容错处理和性能瓶颈等诸多挑战。通过采用动态资源分配、高效通信协议、分布式共识算法、冗余备份等解决方案,可以有效应对这些挑战,提高系统的性能、可靠性和可用性。

shuizhudan223的博客 1283
下一篇: 【安卓Framework学习】Wifi框架学习之开启与关闭流程
leeeeesss
博客等级 码龄9年 148粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值