尚学堂【官网】-西安Java培训|c++培训|Android培训|安卓培训|java视频教程|软件工程师|-西安雁塔尚学堂计算机学校
 陕西科技大学-实习就业项训基地        陕西师范大学-实习就业项训基地
 西安财经学院-实习就业项训基地        西安工业大学-实习就业项训基地
  试听热线:
  029-62258374
Android安卓教程  尚学堂首页Java学院Android安卓教程

Android 系统 overlay 机制重点小结

www.xasxt.com 发布人:java  |  来自:本站  |  发布时间:2017-09-28 15:27:42  |  点击次数:33

静态 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">aaaString><String name="b">bbbString><String name="c">cccString>
  • 1
  • 2
  • 3

 

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

<String name="a">abcString>
  • 1

 

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

<String name="a">abcString><String name="b">bbbString><String name="c">cccString>
  • 1
  • 2
  • 3

 

而不是想象的如下:

<String name="a">abcString>
  • 1

 

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

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等资源的值是有他们的键确定的,比如

abc

该字符串资源通过键 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_BDEVICE_PACKAGE_OVERLAYS = overlay_C overlay_D
  • 1
  • 2

 

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

overlay用于新增资源

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

 

当前文:Android 系统 overlay 机制重点小结
上一页:Android Manifest内容解析
下一页:Android源码分析之备忘录模式
在线报名(*为必填项)
在线咨询