OverlayManagerServer
1. 基础知识
Android Overlay是一种资源替换机制,在不需要打包apk的情况下,替换res目录,通常用来为不同厂商或者主题做的定制化定制
1.1 基础理论
Overlay分为静态的和运行时的Overlay
- Static Resource Overlay简称SRO需要在安卓的源码环境中配置,而且需要对应的apk源码才能完成,一般第三方应用不提供源码
- Runtime Resource Overlay简称RRO,由sonny贡献,从M版本开始支持,不需要提供源码,只需要提供资源路径和名称,RRO不能替换清单文件和引用文件,比如layout、xml目录中的xml文件
1.2 原理
-
SRO原理 在通过AAPT打包成APK时,通过-S命令多加了一个资源目录也就是overlay目录,将这个额外的目录替换为了原来的资源重名文件
打包过程:
一般情况下,先把res下的java文件编译成class文件打包成dex,运行的时候进行load。lib目录下的静态jar文件加动态的so文件以及res目录下的资源文件加上清单一起打包成apk文件
-
RRO原理 资源文件在打包之后会生成一个R.java文件,平时在应用层调用各种资源也是通过R.XXX.XXX来调用,R.java中会生成一个对应的int类型的资源id,实际上平时调用的资源都是这个int,这个id有如下规则: 0xppttiiiii pp:01为系统资源,7f为应用资源 tt:用于 表示资源类型,比如string、array等 iiii:用于区分同类型不同文件 如果是系统资源,会在framework-res.apk中查找并返回资源,一般位于/system/framework目录下;如果是应用资源,则会在overlay和app中查找并返回(如果overlay有明确指出资源则具有优先级)
2. OMS
主要研究ROO,也就是android的动态资源查找
OMS和Android通过AIDL进行通信,它有一个实现类,实现类有两个辅助类
OMS是由system_server进程拉起的,且必然存在跨进程通信,需要借助AIDL接口
在接口IOverlayManager.setEnabledExclusive接口中,设置targetpackage的overlayPackage是否为enable,如果有多个op,也就是多套主题,只有设置了其中一个为enable,那其余的所有都是disable,
3.配置方案
3.1 SRO流程
一般在AndroidProducts.mk中定义了哪些APP会被编译打包,其他的mk文件规则是APP的配置文件
PRODUCT_PACKAGE_OVERLAYS := device/sample/overlays/backup
一般厂商为了定制都会参照device目录新建一个vendor目录,overlay需要在这个vendor目录下进行修改,包名路径一定要和源项目保持一致
3.2 RRO流程
通过一个新的apk来个更改原来apk中的资源文件
例如,原来apk的包名为com.ford.sync.controllerlauncher
则新包名为com.ford.sync.controllerlauncher.overlay1,包名随意
-
如果是mk版本,则需要在包下创建AndroidManifest.xml和Android.mk以及要替换的res包下的文件 -
如果是AndroidStudio版本,更新了资源文件后,只需要在build.gradle中修改打包位置,修改为只打包Manifest和res目录 sourceSets {
main{
manifest.srcFile 'src/main/AndroidManifest.xml'
resources.srcDirs = ['src/main/res']
res.srcDirs = ['src/main/res']
}
}
-
修改overlay的清单文件 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ford.sync.controllerlauncher.overlay1">
<overlay android:targetPackage="com.ford.sync.controllerlauncher"
android:priority="1"
android:isStatic="false"/>
<application android:hasCode="false"/>
</manifest>
-
添加overlay资源文件 在相同路径下res包下相同资源位置名称相同地点写不同的值,如果是硬编码资源是无法替换的 -
编译打包 如果是mk编译,编写Android.mk文件 LOCAL _PATH := $(call my-dir)
include $(CLEAR_ VARS)
LOCAL_ MODULE_ TAGS := optional
#平台签名
LOCAL_ CERTIFICATE := platform
#调用本目录res文件夹资源
LOCAL_ RESOURCE DIR := $(LOCAL _PATH)/res
# overlay. apk输出路径,必须在vendor/overlay/ 目录下,否则不生效
LOCAL MODULE_ PATH := $(PRODUCT_ OUT)/vendor/overlay
LOCAL_ SDK_ _VERSION = current
LOCAL_ PACKAGE_ NAME := Launcher0verlay1
include $(BUILD_ PACKAGE)
-
安装apk 编译生成的apk需要push到vendor/overlay,如果isStatic不为true,需要activate,默认是disable的
4.调试方式
4.1 SRO调试
需要整编系统
4.2 RRO调试
如果isStatic为true就可以,这个时候只能设置一套主题
如果不为true,则需要adb命令实现切换
启用该overlay如下
adb exec-out cmd overlay enable com.ford.sync.controllerlauncher.overlay1
禁用如下
adb exec-out cmd overlay disenable com.ford.sync.controllerlauncher.overlay1
|