Android 11 系统精简:Settings 功能模块移除的定制化实践
1. Android 11系统定制化入门:为什么要精简Settings?
每次拿到新手机,你是不是总觉得系统设置里有一堆从来用不上的功能?作为ROM开发者,我经常接到客户抱怨说系统太臃肿。其实Android 11原生的Settings应用包含200多个功能模块,但实际项目中至少有30%是用不到的。比如给老人机定制系统时,根本不需要开发者选项;儿童手表上也用不上HDMI输出设置。
精简Settings主要出于三个实际考虑:
- 硬件适配:比如移除不支持的NFC功能
- 界面简化:减少用户选择困难
- 合规要求:某些地区必须移除特定功能
最近给东南亚客户做定制时,就遇到个典型场景:他们生产的廉价平板根本不带打印模块,但系统里却留着打印设置入口,用户点进去只会报错。这种体验实在太糟糕了。
2. 实战:七种典型模块移除方案
2.1 基础开关配置法
最简单的办法是修改config.xml中的布尔值。比如要移除电池和飞行模式:
<!-- vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/config.xml --> <bool name="config_show_toggle_airplane">false</bool> <bool name="config_show_app_info_settings_battery">false</bool>这种方式的优点是修改简单,适合控制一级菜单的显示。但要注意三个细节:
- 不同厂商路径可能不同(MTK是高通路径会变)
- 修改后需要clean build才能生效
- 某些功能可能被其他模块引用,移除后要检查依赖关系
2.2 控制器逻辑修改
对于更复杂的模块,需要修改PreferenceController。比如处理HDMI设置:
// vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/mediatek/settings/display/HdmiPreferenceController.java @Override public boolean isAvailable() { return false; // 直接返回不可用 }我遇到过有个坑:某项目修改后设置项确实消失了,但系统日志里还在报HDMI服务找不到。后来发现除了控制器,还要检查AndroidManifest.xml里的服务声明。
2.3 XML节点注释法
声音设置里的二级菜单适合用XML注释:
<!-- vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/sound_settings.xml --> <!-- <Preference android:key="gesture_prevent_ringing_sound" android:title="@string/gesture_prevent_ringing_sound_title" android:fragment="com.android.settings.gestures.PreventRingingGestureSettings" settings:controller="com.android.settings.gestures.PreventRingingParentPreferenceController"/> -->注意!这里容易踩两个坑:
- 注释时要把整个标签完整注释,包括开头和结尾
- 修改后必须删除/data/system/users/0/settings_global.xml才能彻底生效
2.4 账户菜单的完整移除
账户菜单涉及多处修改:
- 注释top_level_settings.xml中的Preference
- 移除SettingsGateway中的引用
- 检查是否关联了SyncAdapter服务
上次给银行定制系统时就因为这个漏了第二步,导致设置崩溃。建议修改后用这个命令验证:
adb shell am start -n com.android.settings/.Settings3. 进阶技巧与避坑指南
3.1 手势设置的精细化处理
移除"防误触振动"选项时,要注意连带修改状态判断逻辑:
// vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/gestures/PreventRingingGesturePreferenceController.java if (preventRingingSetting == Settings.Secure.VOLUME_HUSH_OFF) { mMutePref.setEnabled(false); } else { mMutePref.setEnabled(true); }实测发现如果只注释掉振动选项而不改这里,静音选项会显示异常。建议修改后用这个测试用例验证:
adb shell settings put secure volume_hush_gesture 13.2 外设相关模块的移除
打印服务的移除比较特殊,需要:
- 注释connected_devices_advanced.xml
- 修改AdvancedConnectedDeviceDashboardFragment
- 移除PrintServiceRecommendationService
有个项目就漏了第三步,导致设置里虽然看不到打印选项,但系统仍在后台扫描打印机。可以通过这个命令检查:
adb shell dumpsys print3.3 系统级功能的深度移除
备份功能涉及最多修改点,包括:
- SettingsActivity的setTileEnabled
- 多个PreferenceController的getAvailabilityStatus
- PrivacySettingsActivity的入口控制
最稳妥的做法是全局搜索"backup"关键字,我整理过需要检查的17个关键文件。修改后建议用这个命令测试备份服务状态:
adb shell bmgr list transports4. 版本兼容与维护建议
不同Android版本修改方式差异很大。比如Android 11新增了SettingsIntelligence应用,部分逻辑被抽离出去。最近帮客户从Android 10升级到11时,就发现之前修改的搜索配置失效了。
建议建立自己的修改映射表,我常用的记录格式是这样的:
| 功能模块 | 修改文件 | 关键修改点 | 影响范围 |
|---|---|---|---|
| 电池设置 | config.xml | config_show_top_level_battery | 全局 |
| HDMI输出 | HdmiPreferenceController.java | isAvailable()返回值 | 局部 |
维护时要注意:
- 每次系统升级后要重新验证修改
- 保留原始代码的注释而非直接删除
- 使用git管理定制化补丁
有个客户坚持用直接删除代码的方式,结果OTA升级时冲突多到没法看。后来改用条件返回false的方式,合并冲突减少了80%。
