望远山,知近路,而后自得其乐!

Android Overlay机制

Android Overlay是一种资源替换机制,它能在不重新打包apk的情况下,实现资源文件的替换(res目录非assert目录),Overlay又分为静态Overlay(Static Resource Overlay)与运行时Overlay(Runtime Resource Overlay)

静态Overlay

静态Overlay,简称为SRO,发生在编译时,需要在Android系统源码环境中进行配置。

配置步骤
官方源码示例Demo如下:

1.修改产品(backup应用)的mk文件,添加如下代码

示例文件路径:
android-6.0.0_r1devicesampleproductsbackup_overlay.mk

PRODUCT_PACKAGE_OVERLAYS := device/sample/overlays/backup

其中,AndroidProducts.mk定义了哪些APP会被编译打包,其他mk文件则是对应APP的配置文件。
一般厂商都会有一些个性化定制的产品,会参照device目录结构创建一个vendor目录,所以有的产品的overlay需要在这个vendor目录中进行修改。

2.在overlays目录下添加对应产品的overlay项目,overlay项目实际上就是源项目剔除代码和替换资源后的项目,注意包名路径需要与源项目保持一致。

运行时Overlay

运行时Overlay,简称RRO,顾名思义,该机制的资源替换发生在运行时。

与SRO的区别:

1.RRO能直接定制替换第三方APK的资源,而不需要其源码。SRO如上节所述,则需要对应APK的源码才能完成,一般而言,第三方是不会提供项目源码的。

2.RRO的编译结果会得到一个xxx_overlay.apk,加上原项目的apk,总共会有2个apk,而SRO最终只会得到一个已经完成资源替换的apk。得到的overlay.apk可以视为一个正常的apk,因为它能被安装,含有自己的AndroidManifest.xml文件,当然正常下,overlay.apk是不含有执行代码的。

  1. RRO不能替换AndroidManifest.xml文件及reference resource 类型的文件,如layout、anim、xml目录中的xml文件。虽然RRO具有自己的AndroidManifest.xml文件,但它却不能替换源项目中的AndroidManifest.xml文件。关于layout目录中的xml文件,SRO是可以替换的。

配置步骤

下面以创建Launcher3的RRO为例进行说明

1.创建一个新项目,包名命名为com.android.launcher3.overlay,事实上包名可以随意命名,这样命名可读性高,一看包名就知道是哪个项目的overlay。

2.编辑overlay项目的AndroidManifest.xml文件,文件内容如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.launcher3.overlay"> 
    <overlay android:targetPackage="com.android.launcher3"  android:priority="1"/> 
</manifest>

其中,
android:targetPackage:需要overlay的项目的包名
android:priority:设置overlay.apk的优先级,值越大,优先级越高,用于存在多个overlay.apk情况下的判断。

3.替换相应的res资源
编写mk文件,编译、打包、签名,并将生成的overlay.apk输出到/vendor/overlay目录下,其中签名需要与源项目签名一致,否则不会生效。

注意:
把app放到vendor/overlay下面以后,还要activate,默认是disable的
activate有两种方式:
一种是overlay的app的清单文件中,overlay标签写 isStatic="true"
一种是加系统属性ro.boot.vendor.overlay.theme=overlay的app的包名,分号分割

文章评论已关闭!