天天看點

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的包已經啟用的情況下, 打開原應用看看資源是否替換成功。