Android 运行时 Overlay 实践

前言

大家都知道 Android Overlay 是一种资源替换机制,就是说你可以替换掉原生应用的资源。那么 Overlay也分静态 Overlay(Static Resource Overlay)和运行时 Overlay(Runtime Resource Overlay)。 区别在于静态 Overlay 是需要在系统编译的阶段完成,比如修改 SystemUI 的资源等。而运行时 Overlay 可以通过安装一个 Overlay 的 apk 来完成资源替换。

创建 Overlay

新建 Overlay 之前我默认你的设备上已经存在你想 Overlay 的应用了。

  1. 新建一个普通应用工程,包名命名为 com.xx.xx.overlay ,其实包名上可以随意命名,这里为了可以更直观的看到这个应用是拿个应用的的overlay就在原应用包名后面添加 overlay。
  2. 修改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>
  1. 替换相应的res资源。

到这里 Overlay 的项目都配置完成了, 这里需要解释一下AndroidManifest.xml 中 overlay 下面几个标签的意思:

  • android:targetPackage: 需要overlay的项目的包名
  • android:priority: 设置overlay.apk的优先级,值越大,优先级越高,用于存在多个overlay.apk情况下的判断。
  • android:isStatic:静态导入,就是Overlay的应用push到系统,系统会自动应用。

验证

Overlay 应用的签名需要与原应用的签名一致,否则不会生效。

  1. 使用 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)
  2. 对overlay的apk重签名。(如果你确保的apk产物跟原Apk签名一致可以忽略这一步)
  3. 接下来就是安装了,安装分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目录下重启。
  4. 最后一步就是在确保overlay的包已经启用的情况下, 打开原应用看看资源是否替换成功。
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值