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 nameconfig_show_toggle_airplanefalse/bool bool nameconfig_show_app_info_settings_batteryfalse/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:keygesture_prevent_ringing_sound android:titlestring/gesture_prevent_ringing_sound_title android:fragmentcom.android.settings.gestures.PreventRingingGestureSettings settings:controllercom.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的getAvailabilityStatusPrivacySettingsActivity的入口控制最稳妥的做法是全局搜索backup关键字我整理过需要检查的17个关键文件。修改后建议用这个命令测试备份服务状态adb shell bmgr list transports4. 版本兼容与维护建议不同Android版本修改方式差异很大。比如Android 11新增了SettingsIntelligence应用部分逻辑被抽离出去。最近帮客户从Android 10升级到11时就发现之前修改的搜索配置失效了。建议建立自己的修改映射表我常用的记录格式是这样的功能模块修改文件关键修改点影响范围电池设置config.xmlconfig_show_top_level_battery全局HDMI输出HdmiPreferenceController.javaisAvailable()返回值局部维护时要注意每次系统升级后要重新验证修改保留原始代码的注释而非直接删除使用git管理定制化补丁有个客户坚持用直接删除代码的方式结果OTA升级时冲突多到没法看。后来改用条件返回false的方式合并冲突减少了80%。