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相同路径和文件名).