1. 程式人生 > >Android Overlay機制(轉載)

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相同路徑和檔名).