Android Runtime Resource Overlay 简介

本文介绍了Android L推出的运行时资源覆盖(RRO)机制的工作原理及应用。RRO允许通过overlay APK替换现有应用资源,无需改动应用本身。文章还讨论了RRO的优缺点及其在系统中的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.简介

Runtime Resource Overlay:Android L后推出的运行时资源覆盖,简称RRO

2.原理

    应用运行时,通过 getString/getDrawable去调用某个资源,会将资源的resources ID 作为参数传给Framework层。同一名称但不同状态的资源他们的resources ID 是一样的,比如不同分辨率但名称相同的图片分别被放置在了drawable-hdpi/drawable-ldpi/drawable-mdpi下,但在编译时针对该图片生成的resources ID却只有一个。Framework层查找资源时会使用这个resources ID,同时结合当前系统的configuration(分辨率、语言、横竖屏),即通过resources ID 和 configuration,系统首先会调用我们通过RRO添加的资源文件,并根据configuration使用最匹配的资源文件,如果此时没有找到文件,则再调用应用原生的资源文件。其原理如下图所示:


结合上图可以看出应用只是负责提供resource ID,系统会根据configuration中的配置(语言、分辨率等)去获取适当的资源来加载,这是两个不连续和独立的过程。RRO就发生在系统检索资源的过程中,而应用使用资源的接口不变。因此,通过RRO无需对应用做任何修改。
3.应用

    RRO机制的运用是依靠overlay apk实现的,与普通的apk相比它不包含代码,只有资源一个overlay apk只能替换一个目标apk的资源,但一个目标apk的资源可以被多个overlay apk更改
    a.凡是对于存在资源的APK,RRO机制均可以依靠overlay apk来替换原有资源,包括系统的framework-res.apk.构建方式同普通apk,按照目标APK资源结构替换您需要替换的资源
    b.overlay apk需要push或编译至【/system/vendor/overlay】路径方能生效
    c.一个目标apk的资源可以被多个overlay apk更改,这个就说明多个针对于同一个APK的overlay apk必然存在优先级,它的优先级需要在overlay apk Mainfest中overlay标签中声明android:priority
数值,值越大优先级越高。overlay标签在overlay apk中很重要,这里面就有配置需要替换资源的targetPackage
    d.需要应用签名,所有APK在安装时均需要存在签名
    PS:附件为overlay APK及其目标APK的Demo

4.优缺点

【优点】:
    RRO机制的overlay apk可以在不改变原有应用的的情况下,实现资源替换。
【缺点】:
    不支持layout 和 AndroidManifest资源替换,这个可能同RRO机制相关,毕竟资源替换肯定指的是纯资源,不能替换包含于代码相关的的资源,譬如layout ID。随意变更会导致目标应用报停。
### Android Overlay 使用方法 #### 定义与概述 RRO (Runtime Resource Overlay) 是一种允许应用程序或系统资源被覆盖的技术,在不修改原始APK的情况下实现自定义外观或其他资源属性的功能[^1]。 #### 创建Overlay项目 为了创建一个新的overlay项目,首先需要设置`AndroidManifest.xml`文件来指定目标包名以及优先级。例如: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.overlay"> <overlay android:targetPackage="com.target.package.name" android:priority="1"/> </manifest> ``` 这里通过`android:targetPackage`指定了要覆盖的目标应用包名称,并设置了该overlay的优先级别为最高(数值越大越优先)[^2]。 #### 编译并安装Overlay APK 编译完成后得到的`.apk`文件应当放置于设备上的特定路径以便系统能够识别它作为有效的overlay。通常推荐的位置是`/vendor/overlay/`, 如果不存在此目录,则可以考虑将其放到`/system/app/`下[^3]。 #### 实现主题切换功能 利用上述配置好的overlay机制,可以通过动态加载不同的resource overlay达到即时改变UI样式的效果。这使得开发者能够在运行时轻松地更改颜色方案、图标集或者其他视觉元素而不必重新打包整个应用程序。 #### 示例代码展示如何构建一个简单的Resource Overlay模块 下面给出一段简化版的例子说明怎样编写这样一个module: ```gradle // build.gradle 文件片段 apply plugin: 'com.android.library' android { ... } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) } ``` ```java // res/values/colors.xml 中的内容 <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 自定义的颜色值 --> <color name="primaryColor">#FF009CDD</color> </resources> ``` 以上就是关于Android Overlay的基础介绍及其基本使用方式。对于更复杂的应用场景比如视频处理等方面则涉及到其他专门领域内的知识和技术细节[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值