Android WiFi Service启动 - Android13
- 1、SystemServer中入口
- 2、WifiService启动
- 2.1 关键类概要
- 2.2 启动时序图
Android WiFi基础概览
AOSP > 文档 > 心主题 > WiFi概览
1、SystemServer中入口
- 编译生成对应的jar包:
"/apex/com.android.wifi/javalib/service-wifi.jar"
- 相关WiFi服务:
WifiService
、WifiScanningService
、RttService
、WifiAwareService
、WifiP2pService
frameworks/base/services/java/com/android/server/SystemServer.java
private static final String WIFI_APEX_SERVICE_JAR_PATH =
"/apex/com.android.wifi/javalib/service-wifi.jar";
private static final String WIFI_SERVICE_CLASS =
"com.android.server.wifi.WifiService";
private static final String WIFI_SCANNING_SERVICE_CLASS =
"com.android.server.wifi.scanner.WifiScanningService";
private static final String WIFI_RTT_SERVICE_CLASS =
"com.android.server.wifi.rtt.RttService";
private static final String WIFI_AWARE_SERVICE_CLASS =
"com.android.server.wifi.aware.WifiAwareService";
private static final String WIFI_P2P_SERVICE_CLASS =
"com.android.server.wifi.p2p.WifiP2pService";
/**
* Starts a miscellaneous grab bag of stuff that has yet to be refactored and organized.
*/
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
// ... ... ... ...
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_WIFI)) {
// Wifi Service must be started first for wifi-related services.
t.traceBegin("StartWifi");
mSystemServiceManager.startServiceFromJar(
WIFI_SERVICE_CLASS, WIFI_APEX_SERVICE_JAR_PATH);
t.traceEnd();
t.traceBegin("StartWifiScanning");
mSystemServiceManager.startServiceFromJar(
WIFI_SCANNING_SERVICE_CLASS, WIFI_APEX_SERVICE_JAR_PATH);
t.traceEnd();
}
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_WIFI_RTT)) {
t.traceBegin("StartRttService");
mSystemServiceManager.startServiceFromJar(
WIFI_RTT_SERVICE_CLASS, WIFI_APEX_SERVICE_JAR_PATH);
t.traceEnd();
}
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_WIFI_AWARE)) {
t.traceBegin("StartWifiAware");
mSystemServiceManager.startServiceFromJar(
WIFI_AWARE_SERVICE_CLASS, WIFI_APEX_SERVICE_JAR_PATH);
t.traceEnd();
}
if (context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_WIFI_DIRECT)) {
t.traceBegin("StartWifiP2P");
mSystemServiceManager.startServiceFromJar(
WIFI_P2P_SERVICE_CLASS, WIFI_APEX_SERVICE_JAR_PATH);
t.traceEnd();
}
// ... ... ... ...
}
2、WifiService启动
2.1 关键类概要
WifiInjector.java
: WiFi依赖性注入器。用于访问各种WiFi类实例,并作为模拟注入的句柄。WifiConnectivityManager.java
: 管理所有与连接相关的扫描活动。当屏幕打开或关闭、WiFi连接或断开连接或按需时,会启动扫描,扫描结果会传递给WifiNetworkSelector,由其建议连接到哪个网络。ClientModeManagerBroadcastQueue.java
: 用于在多个并发客户端接口处于活动状态时缓冲公共广播,以在存在单个客户端接口处于激活状态时保留应用程序预期的遗留行为。StateMachine.java
: 这里定义的状态机是一个分层状态机,它处理消息,并且可以具有分层排列的状态。
状态是state
对象,必须实现processMessage
并可选地输入exit
getName
。进入/退出方法相当于面向对象编程中的构造和销毁,分别用于执行状态的初始化和清理。getName
方法返回状态的名称;默认实现返回类名。让getName
返回状态实例名称可能是可取的,特别是在特定状态类具有多个实例的情况下。
创建状态机时,addState
用于构建层次结构,setInitialState
用于标识其中哪一个是初始状态。构造完成后,程序员调用start
来初始化并启动状态机。StateMachine
的第一个操作是从其最年长的父级开始,对初始状态的所有层次结构调用enter
。要输入的调用将在StateMachine
的处理程序的上下文中进行,而不是在要启动的调用的上下文中,并且它们将在处理任何消息之前被调用。例如,给定下面的简单状态机,将调用mP1.enter
,然后调用mS1.enter
。最后,发送到状态机的消息将由当前状态处理;在我们下面的简单状态机中,它最初是mS1.processMessage
。WifiServiceImpl.java
: 实际处理实现处理类;WifiService通过实现IWifiManager
接口来处理远程WiFi操作请求。ActiveModeWarden.java
、ConcreteClientModeManager.java
: 不同WiFi操作模式的实现。在客户端模式中管理WiFi,连接到配置的网络,在仅扫描模式下我们不连接到配置网络,但执行扫描。此类的一个实例处于活动状态,用于管理每个客户端接口。(Android 12 引入了 Wi-Fi STA/STA 并发功能,使设备可同时连接到两个 Wi-Fi 网络。)
packages/modules/Wifi/service/java/com/android/server/wifi/ConcreteClientModeManager.java
2.2 启动时序图
启动过程不在赘述,主要处理类
WifiServiceImpl.java
(publishBinderService(Context.WIFI_SERVICE, mImpl)
),主要WiFi连接处理ActiveModeWarden.java
、ConcreteClientModeManager.java