Chapter 5 Part 1 WifiService简介

本文解析Android系统的WifiService核心服务,包括其创建与初始化过程,以及HSM和AsyncChannel在Wi-Fi功能中的作用。重点讲解了IWifiManager、状态机架构和与Wi-FiScanningService的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 WifiService简介

WifiService是Android Java Framework中负责Wi-Fi功能的核心服务
它主要借助WPAS来管理和控制Android平台中的Wi-Fi功能
虽然WPAS才是Android平台中整个Wi-Fi模块的真正核心
但WifiService作为JavaFramework中Wi-Fi功能的总入口,其重要性也不言而喻

教材分两条路线研究WifiService
1.WifiService的创建和初始化
2.在Settings中打开Wi-Fi功能、扫描无线网络及加入目标无线网络

类图结构如下:
在这里插入图片描述

1.IWifiManager、IWifiManager.Stub和IWifiManager.Stub.Proxy类
均由IWifiManager.aidl文件在编译时通过aidl工具转换而来
2.WifiService派生自 IWifiManager.Stub 类,它是Binder服务端
3.WifiManager是WifiService的客户端,它通过成员变量mService和WifiService进行Binder交互

2 WifiService的创建及初始化

WifiService在SystemServer进程中被创建
当前AOSP源码(Android 11)与教材的有些区别,以AOSP为主
SystemServer.java

if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
    // Wifi Service must be started first for wifi-related services.
    t.traceBegin("StartWifi");
    mSystemServiceManager.startService(WIFI_SERVICE_CLASS);
    t.traceEnd();
    t.traceBegin("StartWifiScanning");
    mSystemServiceManager.startService("com.android.server.wifi.scanner.WifiScanningService");
    t.traceEnd();
}
3 HSM和AsyncChannel介绍

HSM(对应的类是StateMachine)和AsyncChannel是Android Java Framework中两个重要的类
不过,它们目前还仅由Framework内部使用,SDK中并没有包含它们。
这两个类的作用如下

HSM(Hierarchical State Machine,结构化状态机)
HSM在传统状态机对所有状态都一视同仁的基础上做了一些改变,使得状态和状态之间有了层级关系
HSM中的状态层级关系与Java中父子类的派生和继承关系类似
即在父状态中实现generic的功能,而在子状态中实现一些特定的处理
不过,和Java中类派生不同的是,HSM中父子状态对应的是毫无派生关系的两个类,所以使用时需要创建两个对象
而Java中子类则从其父类派生,实际使用时创建一个子类对象即可,该子类对象就能完成父类的工作

AsyncChannel用于两个Handler之间的通信
具体的通信方式为源Handler通过sendMessage向目标Handler发送消息
而目标Handler通过replyToMessage回复源Hdler处理结果
注意,这两个Handler可位于同一个进程,也可分属两个不同的

4 HSM

HSM对应的类叫StateMachine

初始状态由 setInitialState 来设置

HSM中的每个状态均 extends State,
enter() 代表每一个状态的Entry Action,SM进入此状态时将调用其EA
exit() 代表每一个状态的Exit Action, SM退出某状态时将调用其EXA

除了EA和EXA外,每个State中最重要的函数就是processMessage()
在HSM中,外界和HSM交互的方式就是向其sendMessage
Message由当前State的processMessage函数来处理

如果当前State成功处理此message,则返回HANDLED,否则,返回NOT_HANDLED
在Message处理中,如果子状态返回NOT_HANDLED,则其父状态的ProcessMessage将被调用
如果当前状态及祖先状态都不能处理,则HSM的unhandledMessage将被调用
而HSM的派生类可重载unhandledMessage函数以处理这个不能被当前状态和祖先状态处理的消息

transitionTo() 用于切换状态

deferMessage() 用于保留某个消息,被保留的消息会留到下一个状态去处理

obtainMessage 外界调用HSM的obtainMessage以获取一个Message,因为HSM内部是围绕一个Hanlder来工作的

5 AsyncChannel

AsyncChannel用于两个Handler之间的通信

我看到的源码和教材的有些区别,这里会根据教材的来
AOSP WifiAsyncChannel继承至AsyncChannel

AsyncChannel有两种不同的应用模式(usage model),这里介绍除简单的request/response模式外的另外一种模式:
Server端维护Client的信息。这样,Server可以向Client发送自己的状态或者其他一些有意义的信息
与这种模式类似的应用场景就是之前介绍的wpa_cli和wpa_supplicant
wpa_cli可以发送命令给WPAS去执行
同时,WPAS也会将自己的状态及其他一些消息通知给wpa_cli

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值