1 Wifi 服务
//frameworks/base/services/java/com/android/server/SystemServer.java
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();
//...
}
在 SystemServer 中注册 并启动 WiFi 服务,创建了 WifiService。
//packages/modules/Wifi/service/java/com/android/server/wifi/WifiService.java
public WifiService(Context contextBase) {
super(contextBase);
mWifiContext = new WifiContext(contextBase);
WifiInjector injector = new WifiInjector(mWifiContext);
mImpl = new WifiServiceImpl(mWifiContext, injector);
}
public void onStart() {
Log.i(TAG, "Registering " + Context.WIFI_SERVICE);
publishBinderService(Context.WIFI_SERVICE, mImpl);
}
创建 WifiService 实例时创建了一些对象,WifiInjector 管理和组织与 Wi-Fi 相关的各种操作和组件,WifiServiceImpl 是 WiFi 服务的具体实现,其成员几乎全由 WifiInjector 创建。并将 WifiServiceImpl 注册到 ServiceManager 中。
简单看下Android11 相对Android9 新增加与Wifi打开相关的几个初始化类:
- ClientModeImpl 作为客户端的模式实现,作为客户端事件处理在这里完成,并所有的连接状态变化在这里初始化。
- ActiveModeWarden 提供WiFi不同操作模式的配置实现。
//packages/modules/Wifi/service/java/com/android/server/wifi/WifiService.java
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
mImpl.checkAndStartWifi();
} else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
mImpl.handleBootCompleted();
}
}
Boot 分不同阶段,与 WifiService 相关的有两个阶段:PHASE_SYSTEM_SERVICES_READY,PHASE_BOOT_COMPLETED。
2 PHASE_SYSTEM_SERVICES_READY 阶段
在 PHASE_SYSTEM_SERVICES_READY 阶段,SystemServer 将会通过其内部的 SystemServiceManager 来挨个调用自己管理的系统服务的 onBootPhase,也就包括 WifiService,接下来调用到 WifiServiceImpl 的 checkAndStartWifi 方法中。
//packages/modules/Wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
public void checkAndStartWifi() {
mWifiThreadRunner.post(() -> {
if (!mWifiConfigManager.loadFromStore()) {
Log.e(TAG, "Failed to load from config store");
}
mWifiConfigManager.incrementNumRebootsSinceLastUse();
// config store is read, check if verbose logging is enabled.
enableVerboseLoggingInternal(
mWifiInjector.getSettingsConfigStore().get(WIFI_VERBOSE_LOGGING_ENABLED)
? 1 : 0);
// Check if wi-fi needs to be enabled
boolean wifiEnabled = mSettingsStore.isWifiToggleEnabled();
Log.i(TAG,
"WifiService starting up with Wi-Fi " + (wifiEnabled ? "enabled" : "disabled"));
mWifiInjector.getWifiScanAlwaysAvailableSettingsCompatibility().initialize();
mWifiInjector.getWifiNotificationManager().createNotificationChannels();
//mContext.registerReceiver(
// new BroadcastReceiver(),
// new IntentFilter(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED))
//...
registerForBroadcasts();
mInIdleMode = mPowerManager.isDeviceIdleMode();
mActiveModeWarden.start();
registerForCarrierConfigChange();
mWifiInjector.getAdaptiveConnectivityEnabledSettingObserver().initialize();
});
}
首先,代码会尝试从配置存储中加载 Wi-Fi 配置信息,如果加载失败则记录错误日志。
然后,调用 WifiConfigManager.incrementNumRebootsSinceLastUse 方法来增加自上次使用以来的重启次数。
接下来,通过 WifiInjector 获取 SettingsConfigStore 来检查是否启用了详细日志记录,并调用enableVerboseLoggingInternal 方法来设置是否启用详细日志。
然后,检查 Wi-Fi 是否需要启用。根据 SettingsStore 的 isWifiToggleEnabled 方法返回的结果来确定是否启用 Wi-Fi,并记录日志。
接着,代码初始化了一些相关的设置,如扫描常可用性设置和通知管理器的通知通道。
接下来,注册了多个广播接收器,分别用于监听 SIM 卡状态变化、SIM 卡应用状态变化、默认数据卡变化、网络国家代码变化和语言环境变化。当接收到相应的广播时,会执行相应的逻辑,如重置运营商网络、更新国家代码等。
然后,调用 registerForBroadcasts 方法注册了一个用于监听应用移除和修改事件的广播接收器。
最后,开始了一些后台任务,包括启动ActiveModeWarden、注册运营商配置更改的监听和初始化自适应网络功能的使能设置观察器对象。
//packages/modules/Wifi/service/java/com/android/server/wifi/ActiveModeWarden.java
public void start() {
mContext.registerReceiver(new BroadcastReceiver()
, new IntentFilter(LocationManager.MODE_CHANGED_ACTION));
//...
if (trackEmergencyCallState) {
mContext.registerReceiver(new BroadcastReceiver()
, new IntentFilter(TelephonyManager.ACTION_EMERGENCY_CALL_STATE_CHANGED));
}
mWifiController.start();
}