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

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android动态overlay是一种在运行时修改应用程序的外观和行为的方法。通过动态overlay,您可以在不修改原始应用程序代码的情况下,通过叠加(overlay)外部资源文件来修改应用程序的界面元素、样式、布局和其他属性。 动态overlay的实现依赖于Android的资源覆盖机制。您可以创建一个独立的Overlay包(通常是一个apk文件),其中包含您想要叠加到目标应用程序上的资源文件。这些资源文件包括布局文件、样式文件、字符串等。 要使用动态overlay,您需要完成以下步骤: 1. 创建Overlay包:创建一个新的Android项目,将要覆盖的资源文件添加到该项目中。 2. 定义Overlay配置:在Overlay包的res/values目录下创建一个名为"config.xml"的文件,并定义Overlay的配置信息,例如目标应用程序的包名和版本号。 3. 打包Overlay:将Overlay项目打包成apk文件。 4. 安装Overlay:将Overlay apk安装到设备上。 5. 激活Overlay:通过调用OverlayManagerService API,将Overlay应用程序与目标应用程序关联起来,并将Overlay应用程序激活。 一旦激活了Overlay,它将会覆盖目标应用程序的相应资源,从而修改应用程序的外观和行为。您可以使用不同的Overlay应用程序来实现不同的修改效果,并且可以在运行时根据需要切换不同的Overlay。 请注意,动态overlay需要系统级权限才能进行操作,因此只有经过授权的应用程序才能够使用此功能。使用动态overlay时,务必小心处理和确保安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值