如何在AOSP框架层实现开机自动开启蓝牙与WiFi?
兄弟,我之前折腾AOSP开机自动开WiFi和蓝牙的时候,也踩过和你一样的坑——改了defaults.xml、config.xml和overlay还是没效果。其实你改的这些是基础配置,但AOSP里还有几个关键环节没覆盖到,给你梳理几个可行的解决方向:
强制覆盖SettingsProvider数据库值
defaults.xml里的默认值只在第一次开机初始化数据库时生效,如果是已经刷过机的设备,数据库里的旧值会覆盖默认配置。要解决这个,可以修改SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java的loadSystemSettings方法,强制写入开启状态:// 强制设置WiFi开启 loadBooleanSetting(stmt, Settings.System.WIFI_ON, R.bool.def_wifi_on); // 强制设置蓝牙开启(注意蓝牙用的是Global而非System) loadBooleanSetting(stmt, Settings.Global.BLUETOOTH_ON, R.bool.def_bluetooth_on);这样每次开机都会强制更新数据库里的开关状态,不受旧数据影响。
主动触发WiFi服务开启
有些设备的WiFi服务会有延迟启动或额外的启动条件,默认不会自动拉起。可以修改frameworks/base/services/core/java/com/android/server/wifi/WifiService.java的onBootPhase方法,在系统服务就绪后主动开启:@Override public void onBootPhase(int phase) { super.onBootPhase(phase); if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { // 开机自动开启WiFi try { setWifiEnabled(true); } catch (RemoteException e) { Slog.e(TAG, "Failed to enable WiFi on boot", e); } } }主动触发蓝牙服务开启
蓝牙的逻辑和WiFi类似,修改frameworks/base/services/core/java/com/android/server/bluetooth/BluetoothManagerService.java的systemReady方法,在系统就绪后主动开启:@Override public void systemReady() { super.systemReady(); // 开机自动开启蓝牙 try { setBluetoothEnabled(true); } catch (RemoteException e) { Slog.e(TAG, "Failed to enable Bluetooth on boot", e); } }注意:部分地区合规要求第一次开机需用户同意蓝牙开启,如果你做的是定制系统可以忽略这个限制。
验证Overlay配置的有效性
确保你的Overlay文件路径正确,且没有被更高优先级的Overlay覆盖。可以用adb shell dumpsys overlay命令查看当前生效的Overlay资源,确认def_wifi_on和def_bluetooth_on的值是否为true。测试第一次开机场景
如果是在已开机的设备上重新编译刷机,数据库里的旧配置会保留,导致默认值不生效。可以尝试adb shell wipe data后重新刷机,验证默认值是否正常生效。
内容的提问来源于stack exchange,提问作者Prasanna T

