1. 项目背景与需求分析
最近接手了一个特殊的Android系统定制需求:为一款不带4G通信模块的工业设备定制ROM。客户要求彻底移除系统中所有与移动通信相关的功能入口,包括SIM卡管理、移动网络设置以及短信、电话、通讯录等原生应用。这种深度定制在工业平板、智能POS机等专用设备上很常见,主要出于以下考虑:
- 功能精简:设备仅需Wi-Fi联网,移除冗余功能可降低系统复杂度
- 界面净化:避免用户误操作通信相关设置
- 安全加固:去除可能的信息泄露渠道
从技术角度看,这涉及到Android框架层的多处修改。不同于简单的应用禁用,我们需要从系统设置菜单、状态栏快捷开关、底层权限控制等多个维度进行彻底清理。下面分享我的完整实现方案和踩坑记录。
2. 技术方案设计
2.1 整体架构分析
Android的通信功能模块主要分布在以下位置:
| 模块类型 | 涉及组件 | 修改方式 |
|---|---|---|
| 系统设置 | Settings.apk | 修改res/xml配置文件 |
| 状态栏 | SystemUI.apk | 修改快速设置面板布局 |
| 核心应用 | Dialer.apk, Contacts.apk等 | 从编译系统中移除 |
| 框架层 | Telephony框架 | 修改Java层服务逻辑 |
2.2 关键修改点
需要重点处理的核心功能入口包括:
- 设置 → 网络和互联网 → 移动网络
- 设置 → 网络和互联网 → SIM卡
- 设备信息 → SIM卡状态
- 快捷设置面板中的移动数据开关
3. 具体实现步骤
3.1 移除通信相关应用
在设备/device/<厂商>/<产品>/目录下的产品mk文件中添加:
makefile复制PRODUCT_PACKAGES := \
... \
-Dialer \
-Contacts \
-Messaging \
-CellBroadcastReceiver \
-Stk
注意:部分ROM可能使用不同的包名,需通过
adb shell pm list packages | grep "dialer"等命令确认实际包名
3.2 修改系统设置菜单
3.2.1 移除移动网络选项
修改packages/apps/Settings/res/xml/network_and_internet.xml:
xml复制<PreferenceCategory
android:title="@string/network_and_internet_mobile"
android:key="mobile_network_category">
<!-- 注释或删除整个PreferenceCategory块 -->
</PreferenceCategory>
3.2.2 移除SIM卡选项
修改packages/apps/Settings/res/xml/sim_card.xml:
xml复制<!-- 原始内容 -->
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/sim_card_title">
<!-- 全部删除 -->
</PreferenceScreen>
3.3 屏蔽SIM状态显示
修改frameworks/base/packages/SettingsLib/res/values/config.xml:
xml复制<bool name="config_show_sim_info">false</bool>
3.4 修改SystemUI快速设置
编辑packages/apps/SystemUI/res/values/config.xml:
xml复制<string-array name="quick_settings_tiles_default">
wifi,bt,airplane_mode,rotation,flashlight
<!-- 移除mobile_data -->
</string-array>
4. 深度定制技巧
4.1 彻底禁用Telephony服务
在frameworks/base/services/java/com/android/server/SystemServer.java中注释相关服务:
java复制// 查找并注释以下行
// telephonyRegistry = new TelephonyRegistry(context);
// ServiceManager.addService("telephony.registry", telephonyRegistry);
4.2 权限控制加固
在frameworks/base/core/res/AndroidManifest.xml中移除危险权限:
xml复制<!-- 删除以下权限声明 -->
<permission android:name="android.permission.READ_PHONE_STATE" />
<permission android:name="android.permission.CALL_PHONE" />
5. 常见问题与解决方案
5.1 设置菜单残留问题
现象:修改xml后仍有菜单项显示
排查:
- 检查是否清理了odex缓存:
adb shell rm -rf /data/dalvik-cache/* - 确认修改的是正确overlay目录下的资源文件
5.2 系统服务崩溃
现象:开机后出现Phone进程FC
解决:需要同步修改frameworks/base/telephony相关代码,禁用服务调用:
java复制// 在PhoneGlobals.java中找到onCreate方法添加
if (true) return; // 禁用电话服务初始化
5.3 编译报错处理
常见错误:
error: <包名> has no default impl
解决方案:
在Android.bp中添加对应模块的override声明:
blueprint复制android_app_import {
name: "Dialer",
enabled: false,
}
6. 进阶优化建议
- 广播拦截:在
PhoneStateListener注册处添加过滤,防止应用监听电话状态 - API屏蔽:修改
frameworks/base/telephony/java/android/telephony/TelephonyManager.java,使相关API返回空值 - 资源清理:删除
res/drawable中所有SIM卡、信号强度相关的图标资源 - 存储优化:移除
/system/priv-app/CarrierConfig等运营商配置包
经过这些修改后,系统将完全剥离移动通信功能。实测在Android 10-13上均可稳定运行,系统存储空间可节省约80MB。建议在修改前后分别进行adb shell dumpsys package <包名>对比,确认组件已彻底移除。
这种深度定制需要特别注意系统升级兼容性,建议在设备树中保留修改记录文档。如果后续需要恢复通信功能,可以通过差分OTA包的方式重新启用相关模块。
