Android 系统 overlay 机制重点小结
2017-09-25 15:47
369 查看
静态 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>
注意,关于替换,查询相关英文文档发现有如下描述
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下目录的优先级,写在前面的目录优先级高于写在后面目录的优先级,举个例子: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选项。相关文章推荐
- Android系统Surface机制的SurfaceFlinger服务的启动过程分析
- Android 6.0 新特性剖析【深度优化内存机制"秒杀"IOS系统】
- android的窗口机制分析------UI管理系统
- Android的Message机制(简单小结)
- Android系统的Binder机制
- Android系统架构(重点)
- Android系统中长按事件的实现机制解析
- Android窗口系统机制之KEYGUARD机制
- Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
- Android系统的Binder机制之一——Service Manager
- Android系统的Binder机制之三——服务代理对象(2)
- Android系统默认Home(Launcher)的启动过程小结
- Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
- Android的Message机制(简单小结)
- Android 系统时间自动更新机制
- Android系统Binder机制之一(Service Manager篇)
- Android系统机制解析-公共服务
- Android平台Overlay机制
- Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路