Android WIFI体系
先说说WifiLock、MulticastLock 、IWificond
- WifiLock 允许应用强制保持 WiFi 活跃,即便设备处于休眠状态。如WIFI_MODE_FULL_HIGH_PERF:保持高性能 WiFi 活跃状态,适用于高带宽需求,如视频通话、流媒体。经测试有的场景能减少100ms的延迟
- MulticastLock 允许应用接收 WiFi 组播数据包,适用于需要使用 UDP 多播通信的场景。组播会导致较高的电量消耗,建议在不需要时及时释放。
- wificond的话见下图
文章主要就是介绍wifi扫描的代码逻辑、lock的实现还有80211中的一些知识
wifi的帧有以下几种:
管理帧、控制帧和数据帧(都是洋大人制定的协议罢了)
常见的三种Wifi协议,速度和频段以及调制决定,这个就偏硬件了
802.11ax 2019 Wi-Fi6
802.11ac 2013 Wi-Fi5,MU-MIMO,支持5G
802.11n 2009 Wi-Fi4,MIMO最大4*4
主动扫描wifi的时候,STA主动发送probe-request帧到空中,AP收到后回复probe-response给STA;
隐藏SSID的扫描:如果probe-request中包含具体的SSID,那么只有SSID匹配的AP才会回复probe response,通常用来扫描隐藏AP;
被动扫描wifi的时候如下图:(这个广播包里可以包含任何数据其实)。
连接的话就是
目前Wi-Fi在打开状态下芯片一直是活动状态,Wi-Fi芯片支持一系列offload功能,可以把一些任务交给芯片处理,主机可以休眠。Wi-Fi在不需要传输数据时释放wake lock,使主机有机会睡下去,同时会启用包过滤,只有收到特定类型的包之后才会唤醒主机,并传输给kernel,比如单播和特定的多播帧。通过周期唤醒,接收并解析Beacon帧中的TIM IE,看AP是否有缓存的数据,如果没有则继续睡下去
漫游强调的是 在同一网络中 AP 之间的切换,IP 不变,体验平滑。
中继强调的是 物理信号转发扩展,可能存在网段隔离或额外延迟。
4. wifi open 扫描的流程
层级 | 描述 |
---|---|
WifiManager | 应用层接口,如 enableNetwork() 、connect() |
WifiServiceImpl | Framework 层 Wi-Fi 服务实现 |
WifiNative | 封装底层操作接口,如 connectToNetwork() 、startScan() |
wificond | 用于扫描控制、监听事件、构建 netlink 消息与内核交互 |
Wifi HAL | 调用 vendor 提供的 HAL 接口,如 scan、connect(用于兼容芯片) |
wpa_supplicant | 由 wpa_supplicant 进程处理连接和认证流程,通过 HIDL 接口暴露 |
wifiService的主要参数
mResourceCache 缓存 Wi-Fi 相关的资源,提升访问效率。
mWifiInjector 依赖注入器,提供 Wi-Fi 模块所需的各种组件和服务。
mClock 提供系统时间相关的功能,常用于记录事件时间戳。
mSettingsConfigStore 管理 Wi-Fi 设置的存储和加载。
mFacade 框架外观接口,封装了对系统服务的访问。
mWifiMetrics 收集和记录 Wi-Fi 性能和使用情况的指标数据。
mWifiTrafficPoller 定期轮询 Wi-Fi 流量数据,用于流量统计和分析。
mUserManager 管理用户账户信息,处理多用户环境下的 Wi-Fi 设置。
mCountryCode 管理和设置设备的国家代码,影响 Wi-Fi 频段和功率设置。
mActiveModeWarden 管理 Wi-Fi 的活动模式,如 STA(客户端)和 AP(热点)模式的切换。
mScanRequestProxy 代理扫描请求,协调多个组件的扫描需求。
mSettingsStore 存储和管理 Wi-Fi 的持久化设置。
mPowerManager 管理设备的电源状态,控制 Wi-Fi 在不同电源模式下的行为。
mAppOps 管理应用的操作权限,确保应用有权限进行 Wi-Fi 操作。
mWifiLockManager 管理 Wi-Fi 锁,防止 Wi-Fi 在特定情况下进入休眠状态。
mWifiMulticastLockManager 管理多播锁,允许应用接收多播数据包。
mWifiBackupRestore 处理 Wi-Fi 设置的备份和恢复功能。
mSoftApBackupRestore 处理软 AP 设置的备份和恢复功能。
mWifiSettingsBackupRestore 处理 Wi-Fi 设置的备份和恢复功能。
mBackupRestoreController 控制备份和恢复过程的协调器。
mWifiApConfigStore 存储和管理 Wi-Fi 热点的配置。
mWifiPermissionsUtil 工具类,检查和管理应用的 Wi-Fi 权限。
mLog 日志记录器,用于记录 Wi-Fi 模块的日志信息。
mFrameworkFacade 框架外观接口,封装了对系统服务的访问。
mTetheredSoftApTracker 跟踪和管理设备作为热点时的状态和连接。
mLohsSoftApTracker 跟踪和管理本地仅热点(LOHS)的状态。
mWifiNetworkSuggestionsManager 管理应用提供的 Wi-Fi 网络建议。
mWifiNetworkFactory 处理 Wi-Fi 网络的请求和连接。
mDppManager 管理 DPP(设备配对协议)功能。
mWifiThreadRunner 管理 Wi-Fi 操作的线程执行。
mWifiHandlerThread 处理 Wi-Fi 操作的线程。
mWifiConfigManager 管理 Wi-Fi 网络配置。
mHalDeviceManager 管理与硬件抽象层(HAL)的交互。
mWifiBlocklistMonitor 监控和管理 Wi-Fi 网络的黑名单。
mPasspointManager 管理 Passpoint(热点 2.0)功能。
mWifiScoreCard 记录和评估 Wi-Fi 网络的性能评分。
mWifiHealthMonitor 监控 Wi-Fi 的健康状态。
mMemoryStoreImpl 存储 Wi-Fi 相关的内存数据。
mWifiConnectivityManager 管理 Wi-Fi 的连接策略和流程。
mWifiDataStall 检测和处理 Wi-Fi 数据阻塞情况。
mWifiNative 与底层 Wi-Fi 驱动进行交互的接口。
mCoexManager 管理 Wi-Fi 与其他无线技术的共存。
mConnectHelper 辅助 Wi-Fi 连接过程的工具类。
mWifiGlobals 存储全局的 Wi-Fi 设置和状态。
mSimRequiredNotifier 通知用户需要 SIM 卡以连接特定 Wi-Fi 网络。
mWifiCarrierInfoManager 管理运营商相关的 Wi-Fi 信息。
mWifiPseudonymManager 管理 Wi-Fi 的伪匿名信息。
mMakeBeforeBreakManager 管理 Wi-Fi 的“先连接后断开”策略。
mLastCallerInfoManager 记录最后调用 Wi-Fi 接口的应用信息。
mWifiDialogManager 管理 Wi-Fi 相关的对话框和提示。
mBuildProperties 存储构建相关的属性信息。
mDefaultClientModeManager 管理默认的客户端模式。
mCountryCodeTracker 跟踪国家代码的变化。
mWifiTetheringDisallowed 标记是否禁止 Wi-Fi 网络共享。
mMultiInternetManager 管理多网络连接的策略。
mDeviceConfigFacade 访问设备配置的接口。
mFeatureFlags 管理功能开关的标志位。
mApplicationQosPolicyRequestHandler 处理应用的 QoS 策略请求。
mWifiPulledAtomLogger 记录 Wi-Fi 的统计数据。
mAfcManager 管理 AFC(自动频率控制)功能。
mTwtManager 管理 TWT(目标唤醒时间)功能。
mWepNetworkUsageController 控制 WEP 网络的使用。🔧 mIfaceMgr 的作用
mIfaceMgr 是 WifiVendorHal 类中的成员变量,全称为 InterfaceManager。它主要负责管理 Wi-Fi 接口的生命周期,包括创建、删除和查询接口等操作。主要职责:
接口创建与删除:通过调用底层 HAL 接口,创建或删除 Wi-Fi 接口(如 STA、AP)。
接口信息管理:维护当前系统中所有 Wi-Fi 接口的信息,供上层查询和使用。
接口状态监听:监听接口状态的变化,及时通知上层组件进行相应处理。
一、setWifiEnabled 方法概述
setWifiEnabled(String packageName, boolean enable) 是 Android 系统提供的用于启用或禁用 Wi-Fi 的接口。该方法首先进行一系列权限和状态检查,确保调用者有权进行此操作,并且当前系统状态允许 Wi-Fi 状态的更改。
二、权限和状态检查流程
- 权限验证:
调用 enforceChangePermission(packageName) 检查调用者是否具有修改 Wi-Fi 状态的权限。
通过 isPrivileged 判断调用者是否为系统应用或具有特权的应用。 - 第三方应用限制:
对于非特权的第三方应用,若其目标 SDK 版本高于 Android Q(API 29),则禁止其更改 Wi-Fi 状态。 - 飞行模式限制:
在飞行模式下,仅允许特权应用更改 Wi-Fi 状态。 - 热点模式限制:
当设备处于热点(SoftAp)模式时,仅允许特权应用更改 Wi-Fi 状态。 - 用户限制:
若用户设置了禁止更改 Wi-Fi 状态的限制,且调用者不是设备所有者(DO)或配置文件所有者(PO),则禁止更改 Wi-Fi 状态。 - 用户确认对话框:
对于目标 SDK 版本低于 Android Q 的第三方应用,系统可能会弹出用户确认对话框,询问用户是否允许该应用更改 Wi-Fi 状态。
三、打开的调用栈为
ActiveModeWarden -> ConcreteClientModeManager-> mWifiNative-> HalDeviceManager-> WifiHal
HalDeviceManager:Handles device management through the HAL interface. 很明显
WifiNative: Native calls for bring up/shut down of the supplicant daemon and for sending requests to the supplicant daemon
在WifiNative中的setupInterfaceForClientInScanMode:为客户端模式(用于扫描)操作设置界面,此方法在本机守护程序(wificond,供应商 HAL)中以 STA 模式配置接口。最后就掉到了hal那边,如下图:
Wi-Fi HAL(libwpa_client.so):
socket通信中的client端程序;作为Client端与wpa_supplicant这个Server端进行通信。
wpa_supplicant:
无线STA端的一个解决方案;它实现了WPA/WPA2的密钥协商以及802.1X认证,并控制WLAN Driver的认证,关联以及漫游等。
hostapd:
无线AP端的一个解决方案;