前言
大家都知道 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 下面幾個标簽的意思:
-
: 需要overlay的項目的包名android:targetPackage
-
: 設定overlay.apk的優先級,值越大,優先級越高,用于存在多個overlay.apk情況下的判斷。android:priority
-
:靜态導入,就是Overlay的應用push到系統,系統會自動應用。android:isStatic
驗證
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 如果沒有指定
,你是可以直接adb install安裝的,但是預設overlay是不會生效。可以通過下面這個指令來驗證:android:isStatic="true"
檢視是否有你的overlay的應用。然後你可以通過指令來啟用:adb shell cmd overlay list
adb shell cmd overlay enable com.sample.app.overlay
。
3.1 如果你指定了
, 你通過 adb install 時會報錯:android:isStatic="true"
。是以你需要将你的overlay的Apk push 到/system/vendor/overlay目錄下重新開機。Overlay com.ecarx.eas.daemon.overlay is static but not pre-installed
- 最後一步就是在確定overlay的包已經啟用的情況下, 打開原應用看看資源是否替換成功。