Android Overlay機制(轉載)
Android overlay 機制允許在不修改packages中apk的情況下,來自定義 framework和package中的資原始檔,實現資源的定製。來達到顯示不同的UI得目的(如MIUI)。
以下幾類能夠通過該機制定義:
Configurations (string, bool, bool-array)
Localization (string, string-array)
UI Appearance (color, drawable, layout, style, theme, animation)
Raw resources (audio, video, xml)
1 為產品新增Overlay目錄
1.1 Product Overlays與Device Overlays
有兩種不同的overaly目錄定義,來影響最終的效果:
PRODUCT_PACKAGE_OVERLAYS: used by a particular product
DEVICE_PACKAGE_OVERLAYS: used several products that share a common device model
如果包含同一資源,那麼PRODUCT_PACKAGE_OVERLAYS將覆蓋 DEVICE_PACKAGE_OVERLAYS 中的。
PRODUCT_PACKAGE_OVERLAYS & DEVICE_PACKAGE_OVERLAYS 功能是一樣的,只是優先順序不一樣:
**PRODUCT_PACKAGE_OVERLAYS 優先於 DEVICE_PACKAGE_OVERLAYS**
1.2 改變makefile來新增overlays的編譯項
為了新增一個overlay目錄, 需要修改產品的makefile
(for example: device/vendor-name/device-name/product-name.mk)
新增以下幾行:
PRODUCT_PACKAGE_OVERLAYS := device/vendor-name/device-name/product-name/overlay $(PRODUCT_PACKAGE_OVERLAYS)
Or:
DEVICE_PACKAGE_OVERLAYS := device/vendor-name/device-name/common/overlay $(DEVICE_PACKAGE_OVERLAYS)
(如: device/vendor-name/device-name/device_base.mk)中新增:
LOCAL_PATH := device/vendor-name/device-name
DEVICE_PACKAGE_OVERLAYS := $(LOCAL_PATH)/overlay
如果要定義多個overlays目錄,需要用空格隔開.
如果有多個目錄,並且都包含同一資源的定義,那麼將使用第一個定義的目錄中的資源。
1.3 在overlay目錄下建立資原始檔
想覆蓋Android系統自帶package中資原始檔, 那麼在overlay目錄下必須包含和要替換package相同的路徑, 該路徑是Android原始碼目錄的相對路徑.
For example, 如果我們想要替換以下目錄的資原始檔:
packages/apps/Settings/res/
那麼在overlay目錄下面必須建立一樣的目錄:
……/overlay目錄/packages/apps/Settings/res/
然後放入想要替換的資源(必須和系統package相同路徑和檔名).