📢 1. 职业规划篇
📢 2.基础篇
基础篇.用 bugreport 带你看 Crash 和 ANR
📢 3. 系统应用篇
系统应用篇.解密 Partner、google PAI 机制
📢 4. 系统篇
系统篇.SystemServer 简介、自定义 Service 服务一
系统篇.SystemServer 简介、自定义 Service 服务二
系统篇.SystemServer 简介、自定义 Service 服务三
系统篇.SystemServer 简介、自定义 Service 服务四
📢 5. 性能篇
(省)低内存优化
性能篇 (省).SystemServer 与 LMK 的 socket 通信
(稳)稳定性优化
(快)开机优化
framework交流,答疑:251662478
—— 彻底搞懂 Android 资源替换机制!
在 AOSP 或 厂商定制 ROM 开发中,Overlay 是最重要的机制之一!
你可以用 Overlay 无痛修改系统 UI、设置项、默认值,而无需改动 AOSP 原始代码!
本篇文章将带你 彻底搞懂 Overlay,包括 静态 Overlay(Static Overlay) 和 动态 Overlay(Runtime Overlay) 的区别、使用方法、源码解析!🚀
💡 1. 什么是 Overlay?
Overlay(叠加资源) 允许你在不修改 AOSP 源码的情况下,替换系统的 布局、颜色、样式、图片、默认值 等资源。
🛠 主要作用:
- 修改 SystemUI 颜色、图标、布局(如修改通知栏、状态栏)。
- 修改 Settings 选项默认值(如默认开启/关闭某些功能)。
- 厂商定制 ROM(不同机型可以用不同 Overlay)。
- 不同 Android 版本的兼容适配(解决资源 ID 变动问题)。
📌 适用场景:
| 场景 | 使用方式 |
|---|---|
| 修改 ROM 资源(如状态栏颜色、默认壁纸) | 静态 Overlay |
| 动态修改 UI(如夜间模式、不同地区切换不同资源) | 动态 Overlay |
🔹 2. 静态 Overlay(Static Overlay)
📌 2.1 静态 Overlay 的特点
✅ 系统启动前加载(开机前生效)。
✅ 需要系统编译支持(不能运行时动态修改)。
✅ 适用于 SystemUI、Settings 等核心资源替换。
✅ 官方支持 /product 和 /vendor 分区,适用于不同机型适配。
📌 2.2 静态 Overlay 的实现
🔧 主要文件结构:
vendor/
└── overlay/
├── SystemUIOverlay/
│ ├── Android.mk
│ ├── AndroidManifest.xml
│ ├── res/
│ │ ├── values/colors.xml # 修改颜色
│ │ ├── drawable/ic_lock.png # 修改图标
│ │ ├── layout/status_bar.xml # 修改状态栏布局
│ └── Android.bp
📌 2.3 AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.overlay"
android:versionCode="1"
android:versionName="1.0">
<overlay android:targetPackage="com.android.systemui"
android:priority="1"
android:requiredSystemPropertyName="ro.vendor.overlay"
android:requiredSystemPropertyValue="true"/>
</manifest>
🔍 关键参数:
android:targetPackage="com.android.systemui"-
- 指定目标应用(此处为
SystemUI)。
- 指定目标应用(此处为
android:priority="1"-
- 优先级(数字越大,优先级越高)。
android:requiredSystemPropertyName="ro.vendor.overlay"-
- 控制 Overlay 是否启用(适用于机型适配)。
📌 2.4 编译和安装
🔨 方式1:AOSP 编译
m SystemUIOverlay
🔨 方式2:手动 Push
adb root
adb remount
adb push SystemUIOverlay.apk /system/product/overlay/
adb reboot
🔹 3. 动态 Overlay(Runtime Overlay)
📌 3.1 动态 Overlay 的特点
✅ 系统运行时可修改(无需重启)。
✅ 支持动态切换 UI(如深色模式、地区定制化) 。
✅ 不需要系统编译支持,可随时安装/卸载。
✅ 可以通过 cmd overlay 命令或代码 OverlayManager 进行控制。
📌 3.2 动态 Overlay 的实现
🔧 动态 Overlay 也是一个 APK,但不需要 system 分区权限,可以直接安装:
adb install MyDynamicOverlay.apk
然后 启用:
cmd overlay enable com.example.overlay
🔍 查看 Overlay 状态:
cmd overlay list
🛠 禁用 Overlay:
cmd overlay disable com.example.overlay
🔹 4. 动态 Overlay 代码实现
📌 4.1 Java 代码启用/禁用 Overlay
OverlayManager overlayManager = (OverlayManager) getSystemService(Context.OVERLAY_SERVICE);
overlayManager.setEnabled("com.example.overlay", true); // 启用
overlayManager.setEnabled("com.example.overlay", false); // 禁用
🔹 5. 静态 Overlay vs 动态 Overlay 对比
| 对比项 | 静态 Overlay | 动态 Overlay |
|---|---|---|
| 是否支持运行时修改 | ❌ 需要重启 | ✅ 运行时可切换 |
| 是否需要 /system 权限 | ✅ 需要 | ❌ 不需要 |
| 适用场景 | ROM 级别修改(如 SystemUI、Settings) | 运行时修改(如深色模式、主题切换) |
| 生效方式 | 编译时决定 | 运行时决定 |
🔹 6. 总结
- 静态 Overlay 适合 修改 SystemUI、Settings 等系统级资源,需要 AOSP 编译支持。
- 动态 Overlay 适合 运行时切换主题/样式,无需重启,直接
cmd overlay控制。 - 厂商 ROM 适配 通常结合 静态 Overlay(用于 ROM 定制)+ 动态 Overlay(用于个性化切换)。
- OverlayManager API 可以在代码中 动态切换 Overlay,实现 UI 适配方案。
🔥 你学会了吗?欢迎留言交流! 🚀