android framework Overlay 完全指南:静态 Overlay vs 动态 Overlay

991 阅读6分钟

📢 1. 职业规划篇

来聊聊安卓职业规划?整机开发大专能做么?

📢 2.基础篇

基础篇.前言

基础篇.编译环境搭建

基础篇.源码目录简介

基础篇.系统 mk_bp 讲解

基础篇.开机动画定制

基础篇.定制桌面壁纸、导航方式

基础篇.系统属性、api 使用

基础篇.名称修改、名词介绍

基础篇.用 bugreport 带你看 Crash 和 ANR

基础篇.Provision 源码分析

 

📢 3. 系统应用篇

系统应用篇.开机向导制作一

系统应用篇.开机向导制作二

系统应用篇.Settings 导航切换分析

系统应用篇.开机向导导航切换一

系统应用篇.开机向导导航切换二

系统应用篇.gms 制作集成

系统应用篇.开机向导适配 GMS

系统应用篇.Launcher3 结构剖析一

系统应用篇.Launcher3 结构剖析二

系统应用篇.Launcher3 结构剖析三

系统应用篇.Launcher3 图标加载流程一

系统应用篇.Launcher3 图标加载流程二

系统应用篇.Launcher3 桌面布局定制

系统应用篇.解密 Partner、google PAI 机制

系统应用篇.Partner 机制预制壁纸、默认布局

系统应用篇.Launcher 双排 Hotseat 定制一

系统应用篇.Launcher 双排 Hotseat 定制二

系统应用篇.Launcher 双排 Hotseat 定制三

系统应用篇.Launcher Taskbar 简介以及调出

系统应用篇.SystemUI 篇_用工具教会你看布局、进程

系统应用篇.SystemUI 结构讲解一

系统应用篇.SystemUI 结构讲解二

系统应用篇.SystemUI 的启动流程

系统应用篇.SystemUI 导航栏创建一

系统应用篇.SystemUI 导航栏创建二

系统应用篇.SystemUI 自定义导航按键

系统应用篇.SystemUI 快捷面板下拉流程

系统应用篇.SystemUI 定制禁用锁屏下拉通知栏

系统应用篇.SystemUI 通知注册流程

系统应用篇.SystemUI 通知发送流程

 

📢 4. 系统篇

系统篇.SystemServer 篇_应用与系统进程间关系

系统篇.SystemServer 简介、自定义 Service 服务一

系统篇.SystemServer 简介、自定义 Service 服务二

系统篇.SystemServer 简介、自定义 Service 服务三

系统篇.SystemServer 简介、自定义 Service 服务四

系统篇.SELinux 问题解决套路一

系统篇.SELinux 问题解决套路二

系统篇.ActivityManagerService 简介

系统篇.WindowManagerService 简介一

系统篇.WindowManagerService 简介二

系统篇.PackageManagerService 简介一

系统篇.PackageManagerService 简介二

系统篇.FW 实战 - Letterbox 定制应用方向一

系统篇.FW 实战 - Letterbox 定制应用方向二

系统篇.分屏流程一

系统篇.分屏流程二

 

📢 5. 性能篇

(省)低内存优化

性能篇 (省). 低内存查杀机制

性能篇 (省).SystemServer 与 LMK 的 socket 通信

性能篇 (省). 内核进程 LMKD

性能篇 (省). 内存分析

性能篇 (省). 内存泄漏定位与解决

(稳)稳定性优化

性能篇 (稳).WatchDog 检测机制一

性能篇 (稳).WatchDog 检测机制二

性能篇 (稳). 深入 Crash 捕获器流程一

性能篇 (稳). 深入 Crash 捕获器流程二

性能篇 (稳). 深入炸弹 ANR 流程一

性能篇 (稳). 深入炸弹 ANR 流程二

(快)开机优化

性能篇 (快). 开机耗时分析

性能篇 (快). 开机耗时优化

性能篇.实战优化方案分享

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. 总结

  1. 静态 Overlay 适合 修改 SystemUI、Settings 等系统级资源,需要 AOSP 编译支持
  2. 动态 Overlay 适合 运行时切换主题/样式,无需重启,直接 cmd overlay 控制。
  3. 厂商 ROM 适配 通常结合 静态 Overlay(用于 ROM 定制)+ 动态 Overlay(用于个性化切换)。
  4. OverlayManager API 可以在代码中 动态切换 Overlay,实现 UI 适配方案。

 

🔥 你学会了吗?欢迎留言交流! 🚀