快速提示:使用執行時資源疊加框架主題Android
沒有多少人知道它,谷歌很少宣傳它,但Android作業系統已經內建了一個主題框架幾年了。它被稱為Runtime Resource Overlay框架,簡稱RRO,它大大減少了為手機建立自定義主題所需的工作量。
使用RRO,您可以快速建立可以改變幾乎安裝在Android裝置上的每個應用程式的外觀和感覺的主題。由於Android的系統使用者介面元件(包括導航欄,狀態列,通知托盤和快速設定托盤)本身屬於某個應用程式,因此您也可以更改其外觀。最好的部分是你不必編寫任何Java程式碼。
你問的問題是什麼?好吧,該框架只能由特權應用程式使用。更具體地說,通過安裝在只能由root使用者訪問的位置的應用程式,或者由建立自定義ROM的人員安裝的應用程式。
在這個快速提示中,我將向您展示如何使用框架建立一個簡單的主題,以更改快速設定托盤的外觀。
一 先決條件
為了能夠跟進,您需要以下內容:
- 執行Android Marshmallow或更高版本的Android模擬器
- 最新版本的 Android SDK
二 RRO真的做了什麼?
雖然Android應用程式的業務邏輯是用Java或Kotlin編寫的,但其使用者介面主要是使用XML檔案建立的。一個編寫良好的Android應用程式將具有單獨的XML資源,用於定義其佈局,顏色,字串和屬性。顧名思義,RRO框架允許您使用自己的自定義XML資源覆蓋這些XML資源。但是,它不僅限於XML資源。它還允許您更改應用程式的drawable和字型。
使用RRO框架的應用程式通常不包含任何Java程式碼。它僅由XML檔案組成,如果需要,還包含字型和影象。然而,與所有Android應用程式一樣,它必須是有效且已簽名的APK。
1.建立一個新專案
我們不需要Android Studio來建立使用RRO框架的專案。目前,您只需要一個新的專案目錄和一個AndroidManifest.xml 檔案。您可以使用檔案瀏覽器或終端自由建立它們。
mkdir MyOverlays && cd MyOverlays touch AndroidManifest.xml
清單檔案必須包含應用程式的包名稱,以及要為其建立疊加層的應用程式的包名稱。因為我們今天要更改快速設定托盤的外觀,所以我們必須使用com.android.systemui 目標包名稱。
<?``xml` `version``=``"1.0"` `encoding``=``"utf-8"``?>` `<``manifest` `xmlns:android``=``"[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android)"` `package``=``"com.tutsplus.myoverlays"``>` `<``overlay` `android:targetPackage``=``"com.android.systemui"` `android:priority``=``"1"``/>` `</``manifest``>`
此時,我們已準備好開始使用快速設定托盤以及Android系統UI的任何其他元件。
2.建立主題
要覆蓋目標應用程式的資源,您的應用程式必須具有同名的資源。例如,如果要更改目標應用程式的顏色,你通常必須覆蓋其 colors.xml 檔案用自己的 colors.xml 檔案。
為了方便您,RRO框架不希望疊加層是全面的,並且能夠處理原始資源中存在的所有細節。換句話說,您的疊加層只需要包含您想要更改的細節。
為了使事情更清楚,假設我們想要將快速設定托盤的背景顏色從預設的藍灰色更改為深橙色。顏色的 值 在系統UI應用程式的 res / values / colors.xml 檔案中指定。如果您對其內容感到好奇,可以檢視 官方Android Git儲存庫中的 檔案 。
要更改顏色,您現在必須 在專案中建立 res / values / colors.xml 檔案。
mkdir -p res/values touch res/values/colors.xml
在colors.xml 檔案中,要更改托盤的背景顏色,我們必須定位一個名為的顏色system_primary_color。因此,將以下XML新增到檔案中:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="system_primary_color">#FFBF360C</color> <!-- deep orange 900 --> </resources>
值得注意的是,上述XML與使用Android Studio建立普通應用時使用的XML沒有什麼不同。
我們的簡單主題準備就緒!如果需要,可以<color> 向檔案新增更多標籤以更改系統UI的其他顏色。
3.生成APK
我們現在將使用Android資產包裝工具(aapt 簡稱Android SDK),將簡單專案轉換為Android平臺可以使用的APK檔案。
要生成APK,您只需指向aapt 清單檔案,res 目錄和目標平臺的android.jar 檔案即可。當然,您還必須指定要為APK檔案指定的名稱。
aapt package -M AndroidManifest.xml -S res/ \ -I ~/Android/Sdk/platforms/android-23/android.jar \ -F myoverlays.apk.u
在上面的命令中,您可以看到我已選擇將APK檔案命名為myoverlays.apk.u。那是因為我們的APK目前都是未簽名且未對齊的。
要簽名,您必須使用該jarsigner 工具。目前,我建議您使用預設的Android除錯金鑰庫對其進行簽名。
jarsigner -keystore ~/.android/debug.keystore \ myoverlays.apk.u androiddebugkey
最後,您必須使用該zipalign 工具對齊並優化APK 。作為輸入,該工具需要未對齊和對齊的APK的名稱,以及指定對齊邊界的數字。截至2017年,這個數字可能只是4。
zipalign 4 myoverlays.apk.u myoverlays.apk
4.安裝APK
要安裝使用RRO框架的APK,您只需將其放在/ system / vendor / overlay 目錄中即可。預設情況下,該目錄屬於只讀檔案系統,只能由root使用者訪問。如果您是自定義ROM開發人員,或者已植根Android裝置,則安裝APK時應該沒有問題。
但是,在這個快速提示中,我將向您展示如何在模擬器上安裝APK。這樣,您可以在不危及手機的情況下測試疊加層。
首先使用emulator 命令列工具在可寫檔案系統模式下啟動模擬器 。
emulator -avd Nexus_5X_API_23 -writable-system
您現在可以使用該adb 工具在模擬器上獲得root許可權(如果您還沒有)。
adb root
接下來,將/ system 檔案系統重新安裝為可寫,再次使用adb。
adb remount
該/系統/供應商/覆蓋 目錄上不存在模擬器。您必須自己手動建立它。最簡單的方法是在模擬器上啟動一個shell。
adb shell mkdir -p /system/vendor/overlay exit
最後,使用APK將APK推送到目錄adb。
adb push myoverlays.apk /system/vendor/overlay
等待Android幾秒鐘以檢測並安裝APK,然後重新啟動模擬器以使主題生效。
重新啟動後,如果您拉下快速設定托盤,您應該能夠看到正在執行的主題。

應用主題前後的快速設定托盤
結論
在本快速提示中,您學習瞭如何使用Runtime Resource Overlay框架為Android建立主題。雖然我們建立的主題非常簡單,但您可以應用您今天獲得的技能來建立更復雜的主題。例如,您可以覆蓋 strings.xml 檔案以更改應用程式顯示的UI元素的標籤。同樣,您可以覆蓋 dimens.xml 檔案以更改應用程式UI元素的大小。
有關RRO框架的文件非常缺乏。儘管如此,通過研究Android平臺的 原始碼, 你可以瞭解很多。
當你在這裡時,請檢視我們在Android開發上的其他一些帖子!