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。随意变更会导致目标应用报停。