Android源码学习之Overlay

【Android】【学习笔记】运行时资源替换-Runtime Resource Overlay 学习实践 Android 资源替换-----Runtime Resource Overlay(RRO)。RRO它能在 apk 运行时,自动加载需要定制的资源,而不加载原有的资源。RRO的应用场景主要是在方案开发时用到,学习实践只是替换了drawable图片和strings.xml资源,实际上RRO能支持除了 layout 和 AndroidManifest 外的所有资源定制,在做ROM定制开发时还是非常有用的。 阅读详情
AI摘要

在Android Framework开发中,Overlay用于修改和替换系统或应用资源,与源码解耦。它分为静态Overlay(SRO)和动态Overlay(RRO)。SRO在编译时覆盖资源,适用于系统级修改;RRO在运行时动态替换资源,适用于应用级修改。文中还给出了定制壁纸等示例。

在 Android Framework 开发中,Overlay 主要用于修改和替换系统或应用的资源,而无需直接修改源码,与源码解耦。Overlay 机制可以分为 两种类型:

静态 Overlay(Static Resource Overlay, SRO)

  • 在 编译时 覆盖资源。
  • 适用于系统级资源修改(如默认壁纸、配置文件等)。
  • 需要在 PRODUCT_PACKAGE_OVERLAYS 中指定 Overlay 目录。

动态 Overlay(Runtime Resource Overlay, RRO)

  • 运行时 动态替换资源。
  • 适用于应用级资源修改(如主题更换、颜色调整等)。
  • 通过 Manifest 声明 overlay,可在 运行时启用/禁用。

静态 Overlay(Static Resource Overlay, SRO)

系统在编译的时候会生成两个 APK,一个Overlay,一个是原来的 APK。在运行时,系统会解析这个应用是否有Overlay,如果有的话,会先去Overlay中查找,而不是向原来的 APK 中查找资源(比如 res 目录下的:文字、图片、配置等资源)。静态Overlay要求有源码的情况才能使用,一般用在修改系统源码应用属性时使用。

在系统源码中,静态 Overlay 通常以独立的模块(APK 或资源包)形式存在,放置在 vendor/overlay 或 product/overlay 目录下。

示例(定制壁纸)

打开 android/frameworks/base/core/res 目录,其中当前目录下就是一个完整的 APK 源码文件,其中系统的权限、弹框字符、配置参数等资源都会从这个应用读取。打开该目录下的 Android.pb 文件可以看到,该应用编译后的应用名叫 framework-res:

android_app {
    name: "framework-res",
    ....
}

可以在 android/frameworks/base/core/res/res/drawable-nodpi/ 等其他资源文件夹下找到 default_wallpaper.png 系统默认壁纸图片。如果直接在这些目录下替换图片的话,就和源码耦合度太高了,不推荐。为了解耦,就可以使用 SRO 进行编译覆盖。


创建 overlay 文件目录

首先在源码根目录创建 vendor 文件夹,然后创建 overlay 文件夹,接着 overlay 下的文件目录要和源码中的文件目录保持一致,创建一个 frameworks/base/core/res/res/drawable-nodpi/ 目录结构,将包含 default_wallpaper.png 图片的目录都创建出来。例如:res 目录下有 drawable-sw600dp-hdpi、drawable-sw720dp-nodpi 等文件夹包含默认壁纸,就需要将这些文件夹都创建出来,每个文件夹都放一份要替换的默认壁纸图片(注意文件类型要保持一致,如果默认是 png,你替换的也要是 png 格式)。至此资源文件创建完成。


添加到编译文件

资源文件创建完成了,需要让系统去知道你有这个文件夹,那么就需要在 .mk 文件中去把这个文件夹添加上。在上篇文章中 vendor 目录下的 vendor_product.mk 中增加如下代码:

# overlay
PRODUCT_PACKAGE_OVERLAYS := \
vendor/overlay

这样,overlay 文件夹就被 MK 文件知道了,编译的时候系统就知道它是 overlay 的文件了。编译过程中就会把相应的目录资源进行覆盖操作,这样在开机的时候就会展示我们定制的壁纸了 😃

同样,如果想要修改系统默认的导航方式,则需要创建 values/config.xml 文件,因为系统导航的默认配置在 android/frameworks/base/core/res/res/values/config.xml 文件中:

<resources>
    <!-- Controls the navigation bar interaction mode:
         0: 3 button mode (back, home, overview buttons)
         1: 2 button mode (back, home buttons + swipe up for overview) 
         2: gestures only for back, home and overview -->
    <integer name="config_navBarInteractionMode">0</integer>
</resources>

效果如下:

默认壁纸:
在这里插入图片描述
替换壁纸:
在这里插入图片描述
最终效果:
在这里插入图片描述

动态 Overlay(Runtime Resource Overlay, RRO)

用在只有应用包的情况下使用,应用是以 APK 包的形式直接放到系统源码中的,不会再进行重新编译了。要覆盖应用里面的内容,就只能使用 RRO,动态去修改应用中的资源内容。

RRO 的工作原理是将叠加层软件包中定义的资源映射到目标软件包中定义的资源。当应用尝试解析目标软件包中资源的值时,系统转而会返回目标资源映射到的叠加层资源的值。


设置清单文件

如果某个软件包包含 <overlay> 标记作为 <manifest> 标记的子项,该软件包将被视为 RRO 软件包。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.dynamictheme.overlay">
    <application android:hasCode="false" />
    <overlay
        android:targetPackage="com.example.myapp"
        android:isStatic="true"
        android:priority="1"/>
</manifest>
  • 必要 android:targetPackage 属性的值用于指明 RRO 想要叠加(覆盖)的软件包的名称。
  • 可选 android:targetName 属性的值用于指明 RRO 想要叠加的目标软件包的可叠加资源子集的名称。如果目标未定义可叠加资源集,此属性就不会显示。
  • android:isStatic,当此布尔值属性的值设置为 true 时,叠加层会默认处于启用状态并且不可变,这会导致叠加层无法停用。
  • android:priority,当多个静态叠加层以相同的资源值为替换目标时,此数字属性的值(仅影响静态叠加层)将配置叠加层的优先级。数值越大表示优先级越高。

APK 包

假设现在有一个已经打包好的 APK 包名为 com.example.myapp,其首页标题显示使用 res/values/strings.xml 中的文字资源:

  <string name="hello_word">Hello word!</string>

即首页标题显示 my app。

在 vendor 目录下创建 apps/MyApplication/ 和 apps/MyApplicationOverlay/ 文件目录,将上面写好的 AndroidManifest.xml 文件放到 apps/MyApplicationOverlay/ 目录下,将编译好的 APK 和其对应的 Android.mk 文件放到 apps/MyApplication/ 目录下,如图:

Overlay目录结构

接着在 apps/MyApplicationOverlay/ 目录下,创建与原 APK 对应的文件资源目录 res/values/strings.xml,然后修改文字资源:

<resources>
  <string name="hello_word">Hello word Overlay!</string>
</resources>

现在 overlay 包已经制作好了,需要把 MyApplicationOverlay 这个应用参与到编译中去,就需要在 apps/MyApplicationOverlay/ 目录下创建对应的 Android.mk 文件,来告诉源码该如何进行编译:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 资源目录
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
# 模块标签
LOCAL_MODULE_TAGS := optional
# Java 源文件(通常不需要)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# SDK 版本
LOCAL_SDK_VERSION := current
# 模块名称
LOCAL_PACKAGE_NAME := MyApplicationOverlay
# 输出路径
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/overlay
# 签名方式
LOCAL_CERTIFICATE := shared
# AAPT 标志
LOCAL_AAPT_FLAGS := --auto-add-overlay
# 构建规则
include $(BUILD_PACKAGE)

然后编辑 product.mk ,将 MyApplication 和 MyApplicationOverlay 文件夹添加到编译环境中去:

注意:product.mk 已经在 vendor_product.mk 中被引用,而 vendor_product.mk 又在系统build/target/product/sdk_phone_x86_64.mk 文件中引用,所以 product.mk 一定会被执行。

PRODUCT_PACKAGES+=\
MyApplication
MyApplicationOverlay

然后单编push或者整编验证即可!
在这里插入图片描述

Android Overlay 机制解析 android Overlay 阅读详情

相关推荐

Android Overlay机制总结

Android Overlay机制 动态加载资源

android_hl的博客 3471

Android-Overlay机制

Android原生Framework和一些系统App大量的使用了资源文件,如配置config.xml,字符string.xml,布局layout.xml等。我们在定制Android时,往往需要定制其中的一些内容,但又不希望破坏原有的结构,这时候就可以使用Overlay机制。一般用于修改frameworks和packages目录。Overlay有两种方案,静态Overlay和动态Overlay。

不定时记录分享一些有用没用的东西 5210

Android-悬浮窗功能的实现(附Java、KT实现源码,安卓framework层

@author Huanglinqing */ class Main2Activity : AppCompatActivity() { private val chronometer: Chronometer? = null private var hasBind = false private val rangeTime: Long = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstance.

m0_64382868的博客 1135

android overlay机制实践

前言 最近在做launcher时有一个需求是通过overlay机制实现替换主题,中间遇到了不少问题,这里记录一下自己以后能用到,也希望能帮助有需要的同学。我使用的是android11系统,参考官方文档 https://source.android.google.cn/devices/architecture/rros?hl=zh-cn 概述 android overlay是一种资源的动态替换机制,它的工作原理是将叠加层软件包中定义的资源映射到目标软件包中定义的资源。当应用尝试解析目标软件包中资源的值时,系

qq_41818873的博客 7726

Android-悬浮窗功能的实现(附Java、KT实现源码)

为什么很多程序员做不了架构师?1、良好健康的职业规划很重要,但大多数人都忽略了2、学习的习惯很重要,持之以恒才是正解。3、编程思维没能提升一个台阶,局限在了编码,业务,没考虑过选型、扩展4、身边没有好的架构师引导、培养。所处的圈子对程序员的成长影响巨大。金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

2401_84121588的博客 1124

从源码到刷机:深度定制LineageOS 17的完整实践指南

Android系统定制是移动开发领域的一项核心技术实践,它允许开发者基于开源AOSP框架进行深度修改与功能扩展。其核心原理在于通过修改系统源码、资源叠加层和设备树配置,实现对系统行为、界面交互乃至内核参数的全面控制。这项技术的价值在于能够突破官方系统的限制,打造高度个性化、性能优化或功能强化的专属设备,在极客社区、老旧设备焕新、特定行业应用及隐私强化等场景中具有重要实践意义。本文聚焦于基于Android 10的经典版本LineageOS 17,详细解析其定制流程,涵盖从编译环境搭建、源码获取,到功能模块修改

weixin_30588675的博客 431

Docker overlay2磁盘使用100%处理方法_overlay 100%,网络安全程序员春招三面蚂蚁金服

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算**网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。首先先进入**/home。错误.在 根目录使用。

m0_60667406的博客 862

Android源代码定制:Overlay目录定制|调试Overlay资源是否生效

在本文中介绍了Android源代码定制的一些机制和工具,包括: -介绍了overlay的概念和目录结构,以及如何自定义overlay目录和资源。 介绍了`aapt`工具的用法,以及如何查看系统镜像中的资源信息。

我其实什么都不会 1809

安卓源码学习之【导航方式切换分析及实战】

继续使用上篇文章的 OOBE 项目,新建一个,当进入欢迎界面后点击进入该界面布局如下:点击该界面的 OK 按钮,则结束开机向导流程,需要将中的结束开机向导流程代码拷贝过来,选择导航方式调用代码即可,所以@Override@Override} else {});break;break;break;} });

WriteBug001的博客 618

Kotlin安卓悬浮球录屏工程:MediaProjection与MediaRecorder全链路解析

MediaProjection是安卓系统提供的屏幕采集授权机制,通过VirtualDisplay将屏幕内容镜像到Surface,再由MediaRecorder编码为视频文件。悬浮窗则基于WindowManager的TYPE_APPLICATION_OVERLAY实现跨应用显示。这套技术组合的价值在于,开发者无需依赖第三方SDK即可构建完整的录屏工具,广泛应用于游戏录制、教学演示和自动化测试等场景。本文围绕一个可直接运行的Kotlin安卓工程,深入剖析从MediaProjection授权、MediaRecor

weixin_28721917的博客 246

Android悬浮窗功能实现源码分析

Android平台上的悬浮窗技术,作为增强型用户界面的一部分,允许应用程序在其他应用的顶部显示自定义视图。这种技术能够提供更加互动和丰富的用户体验,例如聊天应用中的消息弹窗,或者工具类应用的快捷操作界面。然而,悬浮窗技术的应用也引发了安全和隐私方面的关注,因此Android系统对其进行了严格的权限控制,开发者必须获得用户授权才能实现悬浮窗功能。1.1 悬浮窗的发展背景最初,Android系统对悬浮窗的支持有限,且仅限于系统应用。

weixin_28721743的博客 833

《精通Android 5 多媒体开发》——第6章,第6.3节实现Overlay硬件抽象层

本节书摘来自异步社区《精通Android 5 多媒体开发》一书中的第6章,第6.3节实现Overlay硬件抽象层,作者 王石磊,更多章节内容可以访问云栖社区“异步社区”公众号查看 6.3 实现Overlay硬件抽象层精通Android 5 多媒体开发在前面的内容中,了解了Overlay系统的基本知识和硬件抽象层的原理。在接下来的内容中,将详细讲解实现O...

weixin_34037515的博客 141

深入解析Android悬浮窗实现机制与源码分析

悬浮窗可以理解为一种浮动的UI组件,它悬浮在应用的最顶层,不影响用户对其他应用的操作。在Android系统中,悬浮窗由类型的WindowManager组成。开发者需要使用来定义悬浮窗的样式、大小和位置等属性。Service是Android中用于执行长时间运行操作而不提供用户界面的组件。它可以运行在后台,进行数据处理、播放音乐、执行网络操作等任务。Service与Activity类似,也是Context的一个子类,这使得Service可以进行与Activity类似的系统操作。

weixin_35811662的博客 1152

AnkiDroid 多模块主题化(Multimodule Theming)方案解析:XML-Views 下的主题分层与 theme-overlay 机制

AnkiDroid 在转向 Compose-first 之前,其 XML-Views 体系的主题系统需要支持多模块架构下的资源隔离、主题切换(Light / Dark / Black / Plain / Eink)以及未来向 Compose 的平滑迁移。[docs/development/theming-modularization.md](https://link.gitcode.com/i/a

gitblog_00149的博客 668

在ros里给机械臂加上夹爪和底盘后,控制真实机械臂

使用ur3_bringup 可以连接真实机械臂 使用官方的ur3_moveit_planning_execution.launch 可以对机械臂 moveit规划。 但是只有机械臂,没有夹爪。 官方如图: 我把原来的ur3_moveit_config 复制出来,修改 然后把ur3.xacro 等模型文件复制出来修改,修改完之后,有了夹爪,有了底盘。 规划组什么的使用moveit setup assistant 配置过了。 在rviz中可以笛卡尔空间规划了。 ...

超级菜 2716

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

Flutter-Notebook 实战:用 Overlay 优雅实现屏幕叠加与浮动控件

Overlay 是 Flutter 中用于在当前页面之上再叠加一层组件的机制,它让你无需像使用 Stack 那样精确计算每个子部件的坐标,就能以更简洁、侵入性更低的方式实现弹层、提示气泡、浮动控件等效果。本文以 Flutter-Notebook 仓库中 [overlay 示例项目](https://link.gitcode.com/i/d91d5b90a25c069dc283a900f74770a

gitblog_00005的博客 215

深入解析SAP F4帮助函数F4IF_INT_TABLE_VALUE_REQUEST的回调机制

本文深入解析了SAP ABAP开发中F4IF_INT_TABLE_VALUE_REQUEST函数的回调机制。通过剖析其工作原理与核心参数,详细阐述了如何利用回调函数实现F4帮助的多值返回、动态数据过滤及选择后校验等高级定制功能,并提供了实用的代码示例与调试技巧,帮助开发者高效应对复杂的屏幕交互需求。

weixin_29213827的博客 198

React Native安卓源码学习(一 )

Android加载jsbundle详解。前段时间做了个 React Native的项目,也没时间好好研究下React Native 安卓端的代码。现在闲下来了,看了看Android端的源码,感受颇深。做下总结,也方便自己以后回顾学习。首先看主Activitypublic class MainActivity extends ReactActivity { /** * Returns

BingHongChaZuoAn的专栏 971

关系代数表达式优化步骤

关系代数表达式优化步骤 本篇主要讲解怎么画查询语法树并对其优化,因为我在学关系代数的语法树的时候,在网上找不到比较详细的教法或者技巧,最后通过答案反推原理,所以想写一篇技巧来描述一下这类题的解题方法。 先上书内讲解 1、构造查询树 第一步:把用高级语言定义的查询转换为关系代数表达式 ★ 以 SELECT子向对应投影操作,以FROM字向对应笛卡尔积以 WHERE子句对应选择操作,生成原始查询树 ★ SQL语句转化为原始查询树 第二步:把关系代数表达式转换为查询树。 注: 查询树是一种表示关系代数表达式的树形结

m0_51718449的博客 7016

skywalking各项指标说明

skywalking各项指标说明

没有简介 2487

Docker overlay2磁盘使用100%处理方法_overlay 100%,详解Linux运维架构进阶面试题

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

m0_60667406的博客 595

CA(载波聚合)

文章目录CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell(Primary Cell)Scell(Secondary Cell)3. Pcell、Scell部署场景场景1场景2场景3场景44. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management/SCell Addition/Release:4.3 Handover/Measurements:4.4 SCell激活 CA基本概念 CA也就是我们中文

你又来看我了,一起学习吧 4万+

Docker overlay2磁盘使用100%处理方法_overlay 100%(1)

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

m0_60667406的博客 706

Kali Linux实战:用Impacket的secretsdump.py快速提取Windows域控哈希(附避坑指南)

本文详细介绍了如何在Kali Linux中使用Impacket的secretsdump.py脚本快速提取Windows域控哈希,包括环境准备、原理剖析、实战操作及常见问题解决方案。特别适合CTF竞赛和网络信息安全爱好者学习,提升渗透测试效率。

weixin_33670786的博客 410

华为OD机试真题2025双机位C卷 Java&Go 实现【卡牌游戏】

小明正在尝试一种新的牌游戏。游戏规则只如下:首先,小明拿到一张写有数字m的牌。 然后,他会拿到另外n张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m整除。你的任务是判断小明是否可以完成这个目标。

MISAYAONE的博客 392
上一篇: Android源码学习之开机动画
下一篇: 安卓源码学习之【系统属性与 ContentObserver】
_蓝橙
博客等级 码龄7年 1179粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值