Android 系统 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里的内容如下:

1
2
3
<String name="a">aaa</String>
<String name="b">bbb</String>
<String name="c">ccc</String>

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

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

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

1
2
3
<String name="a">abc</String>
<String name="b">bbb</String>
<String name="c">ccc</String>

而不是想象的如下:

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

注意,关于替换,查询相关英文文档发现有如下描述

For color, bool, string, array, style/theme types, the resource values are identifed by their keys, so for these types, there is no need to put the resources in a file with the same name as in the original base package.

For layout, animation, picture drawables and raw types, the resources are indentifed by their file name, and overlay for these resources should keep the file name same as in the base packages.

翻译成中文的大概意思就是:
1.对于color,bool,String,array,style等资源的值是有他们的键确定的,比如

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

该字符串资源通过键 name = “a” 来唯一确定值 abc 。也就是说,overlay里的这类资源文件的文件名不需要与应用包里的资源文件的文件名保持一致。只需要,资源文件里的键保持一致就行了。

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

多个overlay的优先级判定

在mk文件中通过定义PRODUCT_PACKAGE_OVERLAYS或DEVICE_PACKAGE_OVERLAYS变量,后面可以加上多个overlay目录路径,以此来实现多个overlay目录。但是这些目录是有优先级顺序的,PRODUCT_PACKAGE_OVERLAYS下的目录优先级高于DEVICE_PACKAGE_OVERLAYS下目录的优先级,写在前面的目录优先级高于写在后面目录的优先级,举个例子:

1
2
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选项。

文章目录
  1. 1. 静态 overlay 和动态 overlay
  2. 2. overlay资源替换的前提和原则
  3. 3. 多个overlay的优先级判定
  4. 4. overlay用于新增资源
|