目录
一、SRO–Static resource overly(静态替换)
二、 RRO–Runtime resource overlay(运行时替换)
SRO是在编译时完成的,为app或者framework加载不同的资源,这样可以针对不同项目使用不同的资源
编写overlay文件时注意一下:
将路径添加到PRODUCT_PACKAGE_OVERLAYS或DEVICE_PACKAGE_OVERLAYS变量中。
PRODUCT_PACKAGE_OVERLAYS:用于一个指定的产品,即某个品牌的某个型号。
DEVICE_PACKAGE_OVERLAYS: 用于某个品牌的所有产品。
一般"device/" 路径下的overlay使用DEVICE_PACKAGE_OVERLAYS,而"vendor/"路径下的overlay使用 PRODUCT_PACKAGE_OVERLAYS。
如果我们在编译时PRODUCT_PACKAGE_OVERLAYS和DEVICE_PACKAGE_OVERLAYS都被加载而且overlay了源包中的相 同的资源,那么PRODUCT_PACKAGE_OVERLAYS中的overlay资源会被最终使用。
例
DEVICE_PACKAGE_OVERLAYS += think/overlay
我们可以将Android资源类型分为三类:
RRO apk中不包含code,只有资源配置。AndroidMenifest.xml文件是重点。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhuang.demo">
<overlay android:targetPackage="com.zhuang.demo" android:priority="1"/>
</manifest>
“android:targetPackage"是我们要替换资源的目标apk的包名,如果要替换framework下的资源,可以将"android:targetPackage"写成"android”。
由于RRO 可以修改资源,所以出于安全方面的考虑,只有"vendor/overlay"和“product/overlay”目录下的overlay apk才被接收(system/vendor/overlay和vendor/overlay是相关联的; 基于Android P)。资源ID是在apk编译过程中生成的,而overlay apk的编译时不用目标apk, 所以overlay apk中的资源并不会和目标apk中的资源分配同样的ID。这样资源的匹配只能通过我们定义的字符名称来完成,而字符匹配比较慢。在apk安装的过程中,“idmap"工具会帮忙生成map, 用来帮助overlay apk和目标apk同步资源。这个map数据存储在手机的”/data/resource-cache"目录中