Android Overlay 机制
什么是overlay
Android Overlay是一种资源替换机制,它能在不重新打包apk的情况下,实现资源文件的替换(res目录非assert目录),Overlay又分为静态Overlay(Static Resource Overlay)与运行时Overlay(Runtime Resource Overlay)。是用来更好的实现packages下面、framework一些关于资源文件、主题、皮肤文件的定制修改,而不用动到app的源码的机制,满足客户化定制需求。
以下几类能够通过该机制定义:
(1),Configurations (string, bool, bool-array)
(2),Localization (string, string-array)
(3),UI Appearance (color, drawable, layout, style, theme, animation)
(4),Raw resources (audio, video, xml)
overlay资源替换的前提和原则
前提:资源所在路径必须与overlay下资源路径完全相同。如要替换 Settings 这个应用的String.xml里的资源,该资源文件所在路径为packages/apps/Settings/res/values/,则对应overlay的路径必须为overlay/packages/apps/Settings/res/values/。
原则:overlay替换的是资源,不是文件。
怎么正确的使用overlay
- 创建overlay目录,该目录下文件一定要与需要定制的文件目录一致
- 告诉android的mk系统,你要使用overlay去定制某个app的资源文件
举个例子
- 修改系统设置里的一些默认配置(不锁屏、关掉触摸提示音)
overlay/frameworks/base/packages/SettingsProvider/res/values/defaults.xml <?xml version="1.0" encoding="utf-8"?> <!-- /** * Copyright (c) 2009, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ --> <resources> <bool name="def_lockscreen_disabled">true</bool> <!-- Default for UI touch sounds enabled --> <bool name="def_sound_effects_enabled">false</bool> </resources>
会去覆盖系统源码资源文件里的配置。 而不是文件替换。
2.mk文件配置
device/rockchip/rk3288/BoardConfig.mk
PRODUCT_PACKAGE_OVERLAYS += device/rockchip/rk3288/overlay
为了添加一个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
多个overlay的优先级判定
在mk文件中通过定义PRODUCT_PACKAGE_OVERLAYS或DEVICE_PACKAGE_OVERLAYS变量,后面可以加上多个overlay目录路径,以此来实现多个overlay目录。但是这些目录是有优先级顺序的,PRODUCT_PACKAGE_OVERLAYS下的目录优先级高于DEVICE_PACKAGE_OVERLAYS下目录的优先级,写在前面的目录优先级高于写在后面目录的优先级,举个例子:
PRODUCT_PACKAGE_OVERLAYS = overlay_A overlay_B
DEVICE_PACKAGE_OVERLAYS = overlay_C overlay_D
如果要定义多个overlays目录,需要用空格隔开。如果有多个目录,并且都包含同一资源的定义,那么将使用第一个定义的目录中的资源。
上述overlay目录优先级顺序:overlay_A >overlay_B> overlay_C >overlay_D
refs:
https://blog.csdn.net/qq_28837389/article/details/105637737