系統(tǒng)換膚方案來源于2014年sony在Android 5.0上針對定制化的Theme所提供的換膚方案,并且該方案被Google收入,并集成在 android 6.0之后的版本上,因為權(quán)限的問題,目前這個方案暫時只公開給了OEM。

這是一個完整的換膚項目創(chuàng)建的過程:
https://code.tutsplus.com/tutorials/quick-tip-theme-android-with-the-runtime-resource-overlay-framework--cms-29708
做完了demo的所有的步驟發(fā)現(xiàn)overlay 還是不起作用,這里還缺少一些步驟:
1. 查看overlay資源包是否被正常解析
adb shell cmd overlay list
如果沒有正常解析,你可以通過以下命令查看報錯日志
logcat | grep overlay
2. 將某個overlay設(shè)置成生效,可以用以下命令
adb exec-out cmd overlay enable <PackageName>
當(dāng)然也可以禁用某個 overlay
adb exec-out cmd overlay disable <PackageName>
PackageName 就是demo中的overlay 包名,也就是 com.tutsplus.myoverlays
這里主要說明幾點:
第一:adb root , adb remount 執(zhí)行報錯
這里需要注意的是,運行的模擬器必須是已經(jīng)有root權(quán)限的,adb remount 是為了掛在/system 目錄,不然是無法訪問的,如果是android sdk 下載創(chuàng)建的模擬器,測試下來是無法獲取root權(quán)限的。
第二:如何 framework-res.apk 配置
給出的demo 是針對SystemUI的,可以替換成任意的應(yīng)用,如果需要針對framework-res.apk 目錄,需要將targetPackage 換成 android,這就是針對系統(tǒng)進行了overlay配置。
第三:重啟問題
把overlay的包push到了指定的目錄,一定要重啟嗎?現(xiàn)有的這樣的,因為這個方案是給OEM,只提供了最基礎(chǔ)的功能,所有的overlay apk資源包都會預(yù)先配置好,所以是沒有動態(tài)加載的功能需求的,而PackageManagerService(pms)只有在初始化的時候才會去掃描解析apk資源包,所以目前來說,只能通過重啟進行生效apk資源包
第四:刷新問題
這里我就只給出結(jié)論吧,后面幾篇文章會具體分析刷新策略和加載策略
1.如果是應(yīng)用資源的overlay,包括系統(tǒng)應(yīng)用、或者普通應(yīng)用只刷新對應(yīng)的應(yīng)用也就是targetPackage 指明的應(yīng)用,不刷新其他應(yīng)用
2.如果是系統(tǒng)資源的overlay,刷新所有的應(yīng)用。
3.刷新應(yīng)用會將所有的activity 重新走一次生命周期