Android overlay

sancaiodm Android源码学习 2023-03-12 1360 0

1. SRO–Static resource overly(静态替换)

2. RRO–Runtime resource overlay (运行时替换)

-----------------------

静态 overlay 和动态 overlay

静态 overlay:又称为编译时 overlay,编译时资源就已经覆盖了,一般用在有源码的apk中。

动态 overlay:又称为运行时 overlay,当 apk 在手机中运行时才发生资源覆盖,一般用在无源码的apk中


overlay资源替换的前提和原则

前提:资源所在路径必须与overlay下资源路径完全相同。

如要替换 Settings 这个应用的String.xml里的资源,该资源文件所在路径为packages/apps/res/values/,则对应overlay的路径必须为overlay/packages/apps/res/values/。


原则:overlay替换的是资源,不是文件。举个例子,应用中String.xml里的内容如下:

<String name="a">aaa</String>

<String name="b">bbb</String>

<String name="c">ccc</String>

overlay中的String.xml里的内容如下:

<String name="a">abc</String>

则最终,apk调用的资源如下:

<String name="a">abc</String>

<String name="b">bbb</String>

<String name="c">ccc</String>

而不是想象的只剩下:

<String name="a">abc</String>


1.对于color,bool,String,array,style等资源的值是由他们的键确定的,比如

<String name="a">abc</String>

该字符串资源通过键 name = “a” 来唯一确定值 abc 。

也就是说,overlay里的这类资源文件的文件名不需要与应用包里的资源文件的文件名保持一致。只需要,资源文件里的键保持一致就行了


2.对于布局文件,动画文件,图片资源文件等,这些资源文件是通过文件名来唯一确定,所以overlay里的这类资源文件需要与应用包里的资源文件的文件名保持一致

总结:

对于可以根据key区分的资源,我们的overlay文件名字可以不和源包里的文件名字一致;

[例如]string, string, array, bool, style,dimen等。

对于依靠文件名字区分的资源, 我们的overlay文件名字必须和源包里的文件名字一致;

[例如]drawable,layout,menu,animation,raw等。


多个overlay的优先级判定

mk文件中通过定义PRODUCT_PACKAGE_OVERLAYS或DEVICE_PACKAGE_OVERLAYS变量,后面可以加上多个overlay目录路径,以此来实现多个overlay目录。

[1]PRODUCT_PACKAGE_OVERLAYS:用于一个指定的产品,即某个品牌的某个型号。

[2]DEVICE_PACKAGE_OVERLAYS: 用于某个品牌的所有产品。


一般"device/" 路径下的overlay使用DEVICE_PACKAGE_OVERLAYS,

而"vendor/"路径下的overlay使用PRODUCT_PACKAGE_OVERLAYS。

但是这些目录是有优先级顺序的,PRODUCT_PACKAGE_OVERLAYS下的目录优先级高于DEVICE_PACKAGE_OVERLAYS下目录的优先级,写在前面的目录优先级高于写在后面目录的优先级,举个例子:

PRODUCT_PACKAGE_OVERLAYS = overlay_A overlay_B

DEVICE_PACKAGE_OVERLAYS = overlay_C overlay_D

上述overlay目录优先级顺序:overlay_A >overlay_B> overlay_C >overlay_D


overlay用于新增资源

默认情况下,overlay目录的资源文件内容只能覆盖原有软件包中的资源,而不能新增资源。不让会造成编译错误。如要允许增加资源,可以将资源放入标签中,或者一种更加简便的方法是给aapt命令增加–auto-add-overlay选项。

--------------------------------------

如下mk文件中的有

DEVICE_PACKAGE_OVERLAYS := device/generic/x86/overlay  ,则表示此device/generic/x86/overlay是一个overlay机制,

image.png

则此目录的device/generic/x86/overlay/frameworks下的文件是覆盖aosp/frameworks下的文件

androidoverlay.png

评论