Miui的多主題效果很是cool,但應該如何實現呢?有些人可能會想到使用Android系統提供的Overlay機制。可是Overlay機制可否實現多主題呢?經過調研,個人答案是:部分實現。 java
爲什麼是部分實現?究竟什麼是部分實現? android
部分實現指的是Overlay機制能夠實現framework資源的多主題替換,可是沒法作到App的多主題。Overlay機制自己的目的是爲OEM廠商提供一種替換原生系統資源的機制。經過閱讀framework的AssetManager.cpp代碼(addAssetPath)能夠知道,系統在加載framework資源時,會查找是否有framework-res.apk的overlay資源,他是在/vendor/overlay/framework目錄下進行查找的。這意味着只要替換/vendor/overlay/framework中的framework-res.apk就能實現framework資源的替換,固然前提須要重啓系統。 app
可是APP資源的Overlay只能在APP編譯時完成,一旦編譯完成,Overlayed資源也就固定在一個APP中了。固然framework-res.apk也支持這種overlay方式。看AssetManager.cpp代碼註釋中提到, // add overlay packages for /system/framework; apps are handled by the (Java) package manager。A HA!也就是說android系統將應用層的資源Overlay經過PackageManager來完成。究竟PackageManager是怎麼完成overlay呢?若是你搜索一下PackageManager.java的源代碼會驚異的發現,它根本不包含任何"overlay"關鍵字。這時,忽然會想到網上介紹的應用程序如何實現多主題。沒錯,就是經過PackageManager的getResourcesForApplication找到overlay apk的資源,使用overlay apk的資源代替自身app的資源。這就是apps are handled by the (Java) package manager的含義了。 ui
所以,我說Overlay機制是部分支持實現多主題的。那有沒有辦法實現徹底支持呢?既然找到了緣由也就找到了思路,那就是在PackageManager添加一層重定向機制。將APP的資源請求轉換爲對Overlay APP的資源請求。固然以上只是一種思路,還有不少具體細節須要解決,而其中最重要的一個就是如何使主題切換當即生效?思考吧,少年。。。 資源
補充資料:如何經過overlay機制對framework-res.apk進行替換,能夠參考Android系統源碼/framework/base/core/tests/overlaytests/OverlayTestOverlay項目。 get