RRO overlay:资源定制机制
2026/8/9大约 3 分钟系统定制Android 14RROoverlay资源定制
RRO overlay:资源定制机制
上一章建立了定制地图。这一章回答:RRO 是什么,资源怎么被覆盖,idmap 如何工作, overlay 如何启用与叠加?
RRO 只替换目标允许覆盖的资源
| 常见误解 | 正确理解 |
|---|---|
| overlay 是“替换整个 APK” | overlay 是独立 APK,只覆盖指定资源,不替换应用 |
| overlay 改了资源文件就能生效 | 需要 idmap 映射、安装与启用,资源名必须匹配 |
| 所有资源都能随意覆盖 | Android 10+ 受 overlayable 与策略约束 |
核心结论
- overlay APK 声明 targetPackage 与需要覆盖的资源。
- idmap 把 overlay 资源映射到目标资源,避免重编目标。
- 资源查找顺序:目标包 → 叠加的 overlay(按优先级)。
- 静态 overlay 随分区安装,动态 overlay 可用 cmd overlay 管理。
- Android 10+ 用 overlayable 与策略限制可覆盖范围。
覆盖主链
逐步解释:
- 声明:overlay 声明目标包与资源。
- 映射:系统生成 idmap 对应表。
- 查找:运行时优先找 overlay 提供的值。
- 优先级:多个 overlay 按优先级取高者。
- 生效:应用读取到被覆盖的资源。
overlay APK 结构
一个 overlay 包的 AndroidManifest 核心声明:
<manifest>
<application android:hasCode="false"/>
<overlay android:targetPackage="com.android.settings"
android:targetName="SettingsResources"/>
</manifest>overlay 内的 res/ 只放要覆盖的资源;hasCode=false 表示无代码。
源码证据
阅读目标:确认 idmap 与资源查找机制。
正文指针:libs/androidfw/ 的 idmap 实现;AssetManager.java 的资源查找; cmd overlay 的管理入口。
// libs/androidfw/(伪代码,行号以 r75 为准)
// idmap:overlay 资源 ID → 目标资源 ID 的映射表这段代码证明: idmap 让 overlay 无需重编目标包;资源查找按“目标 → overlay” 顺序解析,这就是“运行时覆盖”的实现基础。
验证与排障
环境:开发设备或模拟器;以下命令不需要 root。
adb shell cmd overlay list
adb shell cmd overlay enable <overlay包名>
adb shell cmd overlay dump <overlay包名>
adb shell dumpsys package <overlay包名>cmd overlay list 看启用状态;enable/disable 切换;dump 看映射与目标。overlay 不生效时先确认:包名与 target 匹配、资源名一致、idmap 生成成功、状态已启用。
常见误区
- “overlay 替换 APK”:只是覆盖资源。
- “放进去就生效”:要安装、idmap、启用。
- “资源名随便改”:必须与目标一致。
- “所有资源都可覆盖”:受 overlayable 约束。
延伸问题
- 静态 overlay 与动态 overlay 的区别是什么?
- overlayable 与策略(system/vendor/product)如何工作?
- 多个 overlay 的优先级如何确定?
- 如何验证 idmap 是否成功生成?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
libs/androidfw/ | idmap | 资源映射 |
AssetManager.java | 资源查找 | 运行时解析 |
OverlayManagerService.java | overlay 管理 | 启用状态 |
cmd overlay | 命令行 | 排障入口 |
公共路径:frameworks/base/libs/androidfw/、 frameworks/base/core/java/android/content/res/ 与 frameworks/base/services/core/java/com/android/server/om/。行号以 r75 检索为准。
资源覆盖在系统界面中的实际落点,见 SystemUI 定制。