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

  1. 創建overlay目錄,該目錄下文件一定要與需要定製的文件目錄一致
  2. 告訴android的mk系統,你要使用overlay去定製某個app的資源文件

舉個例子

  1. 修改系統設置裏的一些默認配置(不鎖屏、關掉觸摸提示音)
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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章