🧐 引言:为什么要先学 Settings 和 Wi-Fi?
在所有的 AOSP 客制化需求中,**Settings(设置)**和Wi-Fi占据了 80% 的工作量。
- Settings:是用户接触系统的入口,几乎所有的“开关”都在这里。
- Wi-Fi:是设备联网的咽喉,各种自动连接、隐藏网络、热点配置都在这里。
掌握这两个模块,你就掌握了 AOSP 客制化的半壁江山。
⚙️ 第一部分:Settings 模块客制化——“改皮肤”与“动骨骼”
Settings模块位于packages/apps/Settings/。它的结构主要由XML 配置和Java/Kotlin 逻辑组成。
1. 界面布局在哪改?(XML)
Settings 的界面是由一个个Preference组成的。
- 路径:
packages/apps/Settings/res/xml/ - 查找技巧:比如你要改“关于手机”里的内容,就去找
settings_about_phone.xml。 - 客制化操作:
- 增删菜单:直接在 XML 里添加或删除
<Preference>标签。 - 修改标题:修改
android:title属性。最佳实践是不要直接写死字符串,而是去res/values/strings.xml定义新的字符串资源,然后引用它。
- 增删菜单:直接在 XML 里添加或删除
2. 逻辑代码在哪改?(Java/Kotlin)
XML 只是骨架,血肉在代码里。
- 路径:
packages/apps/Settings/src/com/android/settings/ - 客制化操作:
- 修改默认值:比如系统默认字体大小是“标准”,你想改成“大号”。你需要找到控制字体的
Fragment(如DisplaySettings.java),在onCreate或onResume里修改逻辑。 - 监听开关:如果你想在某个开关打开时触发特定硬件操作,需要重写
onPreferenceChange方法。
- 修改默认值:比如系统默认字体大小是“标准”,你想改成“大号”。你需要找到控制字体的
3. 高级技巧:如何批量修改样式?
很多时候,客户要求“所有菜单去掉图标”、“字体变大”。
- 核心文件:
res/values/styles.xml或theme.xml。 - 原理:AOSP 使用
preferenceTheme来统一管理样式。你可以在theme.xml里找到@style/PreferenceTheme,然后去修改PreferenceTheme的定义,比如设置android:layout指向你自定义的布局文件,从而去除图标占位。
📶 第二部分:Wi-Fi 模块客制化——“自动连接”与“智能判断”
Wi-Fi 模块位于frameworks/opt/net/wifi/和packages/apps/Settings/(界面部分)。
1. 修改 Wi-Fi 默认行为
- 需求:开机默认开启 Wi-Fi,或者休眠时保持 Wi-Fi 连接。
- 路径:
frameworks/base/packages/SettingsProvider/res/values/defaults.xml - 操作:
- 找到
false,改为true。 - 找到
2,2代表“始终连接”(即使在休眠时)。
- 找到
2. 定制 Wi-Fi 直连 (P2P) 名称
- 需求:修改设备在 Wi-Fi 直连时显示的名字。
- 代码:你需要在初始化的地方(如
WifiP2pManager的相关调用处)使用代码动态设置:WifiP2pManager manager = (WifiP2pManager) context.getSystemService(Context.WIFI_P2P_SERVICE); WifiP2pManager.Channel channel = manager.initialize(context, context.getMainLooper(), null); // 设置新的设备名 manager.setDeviceName(channel, "MyCoolDevice", new WifiP2pManager.ActionListener() {...});
3. 高级功能:判断“坏 Wi-Fi”
- 需求:有些 Wi-Fi 虽然连上了,但上不了网(比如需要认证的酒店 Wi-Fi)。系统通常会将其标记为“受限”或断开。
- 原理:系统通过
ConnectivityManager检测网络能力。 - 关键代码点:检查
NetworkCapabilities。
你可以在这里添加自己的逻辑,比如自动断开这种网络。NetworkCapabilities nc = connectivityManager.getNetworkCapabilities(network); // 如果网络未通过验证(比如 DNS 坏了,或者根本没有传输能力) if (!nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) { // 标记为坏连接,触发重连或提示 log.d("Wi-Fi", "检测到坏网络"); }
🔍 第三部分:实战搜索技巧——“大海捞针”法
在 AOSP 中,“找到代码”比“写出代码”难。给你几个实战中百试百灵的搜索口诀:
| 你的目标 | 搜索关键词 | 搜索范围 | 预期结果 |
|---|---|---|---|
| 改界面文字 | "要改的原文"(用双引号) | res/values/strings.xml | 找到对应的资源 ID |
| 改某个开关逻辑 | Settings$NAME(如Settings$Wifi) | 全局代码 | 找到启动该页面的 Intent 或 Fragment |
| 找系统服务实现 | Service+onStart | frameworks/base/services/ | 找到 SystemServer 启动的服务 |
| 找 XML 对应的代码 | R.xml.xxx_settings | src/目录 | 找到加载该 XML 的 Java 文件 |
📝 总结:AOSP 客制化实战 Checklist
在你动手修改之前,请务必确认以下几点,以免走弯路:
- 确认分支:
repo forall -c "git branch"确保你在自己的客制化分支上。 - 确认需求层级:
- 只是改个图标、文字? ->
res/目录。 - 改逻辑、加开关? ->
src/目录。 - 改默认配置? ->
defaults.xml或device.mk。
- 只是改个图标、文字? ->
- 编译验证:
- 改了 Settings?
cd packages/apps/Settings && m。 - 改了 Framework?
m framework或全量编译m。
- 改了 Settings?
- SELinux:如果涉及跨进程通信或访问敏感硬件,记得去
system/sepolicy放行权限。
💡 给你的建议
不要试图去背诵 AOSP 的代码结构,因为太庞大了。学会利用“全局搜索”和“日志打印”,是 AOSP 开发者最重要的生存技能。
现在,你可以试着打开你的 AOSP 源码,去packages/apps/Settings/res/xml/目录下,试着找到“WLAN”设置的 XML 文件,试着给它加一个“假的”测试开关,然后编译刷机看看效果。这是检验你环境是否搭建成功、技能是否掌握的最好方法!