前言
大家都知道 Android Overlay 是一种资源替换机制,就是说你可以替换掉原生应用的资源。那么 Overlay也分静态 Overlay(Static Resource Overlay)和运行时 Overlay(Runtime Resource Overlay)。 区别在于静态 Overlay 是需要在系统编译的阶段完成,比如修改 SystemUI 的资源等。而运行时 Overlay 可以通过安装一个 Overlay 的 apk 来完成资源替换。
创建 Overlay
新建 Overlay 之前我默认你的设备上已经存在你想 Overlay 的应用了。
- 新建一个普通应用工程,包名命名为 com.xx.xx.overlay ,其实包名上可以随意命名,这里为了可以更直观的看到这个应用是拿个应用的的overlay就在原应用包名后面添加 overlay。
- 修改AndroidManifest.xml。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sample.app.overlay">
<overlay
android:targetPackage="com.sample.app"
android:priority="1"
android:isStatic="true"
/>
</manifest>
- 替换相应的res资源。
到这里 Overlay 的项目都配置完成了, 这里需要解释一下AndroidManifest.xml 中 overlay 下面几个标签的意思:
android:targetPackage
: 需要overlay的项目的包名android:priority
: 设置overlay.apk的优先级,值越大,优先级越高,用于存在多个overlay.apk情况下的判断。android:isStatic
:静态导入,就是Overlay的应用push到系统,系统会自动应用。
验证
Overlay 应用的签名需要与原应用的签名一致,否则不会生效。
- 使用 AS 编译生成 APK。(我当前使用的AS版本是 4.1.1,这个版本下已经不用手动生成 APK,AS 已经帮我们做了。如果你的 AS 版本过低导致无法验证成功,可以试试这个命令:
aapt package -f -M ./overlay/src/main/AndroidManifest.xml -I $ANDROID_HOME/platforms/android-28/android.jar -S ./overlay/src/main/res -F overlay.apk)
- 对overlay的apk重签名。(如果你确保的apk产物跟原Apk签名一致可以忽略这一步)
- 接下来就是安装了,安装分2种情况:
3.1 如果没有指定android:isStatic="true"
,你是可以直接adb install安装的,但是默认overlay是不会生效。可以通过下面这个命令来验证:adb shell cmd overlay list
查看是否有你的overlay的应用。然后你可以通过命令来启用:adb shell cmd overlay enable com.sample.app.overlay
。
3.1 如果你指定了android:isStatic="true"
, 你通过 adb install 时会报错:Overlay com.ecarx.eas.daemon.overlay is static but not pre-installed
。所以你需要将你的overlay的Apk push 到/system/vendor/overlay目录下重启。 - 最后一步就是在确保overlay的包已经启用的情况下, 打开原应用看看资源是否替换成功。