Android 11 系统精简:Settings 功能模块移除的定制化实践

📅 2026/7/7 2:35:26 👁️ 阅读次数 📝 编程学习
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>

这种方式的优点是修改简单,适合控制一级菜单的显示。但要注意三个细节:

  1. 不同厂商路径可能不同(MTK是高通路径会变)
  2. 修改后需要clean build才能生效
  3. 某些功能可能被其他模块引用,移除后要检查依赖关系

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"/> -->

注意!这里容易踩两个坑:

  1. 注释时要把整个标签完整注释,包括开头和结尾
  2. 修改后必须删除/data/system/users/0/settings_global.xml才能彻底生效

2.4 账户菜单的完整移除

账户菜单涉及多处修改:

  1. 注释top_level_settings.xml中的Preference
  2. 移除SettingsGateway中的引用
  3. 检查是否关联了SyncAdapter服务

上次给银行定制系统时就因为这个漏了第二步,导致设置崩溃。建议修改后用这个命令验证:

adb shell am start -n com.android.settings/.Settings

3. 进阶技巧与避坑指南

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 1

3.2 外设相关模块的移除

打印服务的移除比较特殊,需要:

  1. 注释connected_devices_advanced.xml
  2. 修改AdvancedConnectedDeviceDashboardFragment
  3. 移除PrintServiceRecommendationService

有个项目就漏了第三步,导致设置里虽然看不到打印选项,但系统仍在后台扫描打印机。可以通过这个命令检查:

adb shell dumpsys print

3.3 系统级功能的深度移除

备份功能涉及最多修改点,包括:

  1. SettingsActivity的setTileEnabled
  2. 多个PreferenceController的getAvailabilityStatus
  3. PrivacySettingsActivity的入口控制

最稳妥的做法是全局搜索"backup"关键字,我整理过需要检查的17个关键文件。修改后建议用这个命令测试备份服务状态:

adb shell bmgr list transports

4. 版本兼容与维护建议

不同Android版本修改方式差异很大。比如Android 11新增了SettingsIntelligence应用,部分逻辑被抽离出去。最近帮客户从Android 10升级到11时,就发现之前修改的搜索配置失效了。

建议建立自己的修改映射表,我常用的记录格式是这样的:

功能模块修改文件关键修改点影响范围
电池设置config.xmlconfig_show_top_level_battery全局
HDMI输出HdmiPreferenceController.javaisAvailable()返回值局部

维护时要注意:

  1. 每次系统升级后要重新验证修改
  2. 保留原始代码的注释而非直接删除
  3. 使用git管理定制化补丁

有个客户坚持用直接删除代码的方式,结果OTA升级时冲突多到没法看。后来改用条件返回false的方式,合并冲突减少了80%。