在將 Car UI 程式庫元件和資源加入應用程式後,為了自訂這些應用程式,原始設備製造商 (OEM) 必須提供兩個疊加層:
-
建構時間覆蓋層會新增執行階段資源覆蓋 (RRO) 所需的任何資源。蒐集的資料包括:
- 可繪項目
- 樣式 (例如文字外觀)
- 共用資源 (例如顏色)
-
RRO 疊加層資料夾包含用於為每個目標應用程式產生一個 RRO 的資源。這些資源只能參照下列項目:
- 在同一個 RRO 中定義的值 (例如,對於顏色,這會是十六進位值)。
- Android 架構資源 (例如
@android:color/accent
)。 - 在上述建構時間疊加層中定義的資源。
一般結構
建議的自訂疊加結構如下:
-
<path-to-OEM-overlays>/
-
overlay/framework/base/core/res/
. 建構時間覆蓋資源 -
rro/
-
Android.mk
. Makefile:用於根據這個資料夾中的資源,為每個目標套件產生 RRO。 -
AndroidManifest.xml
. 上述 makefile 使用的資訊清單檔案範本。 -
res/
:要套用至所有目標應用程式的執行階段重疊項目。
-
-
視單一建構目標中要處理的品牌數量而定,原始設備製造商可能會有多個這類結構 (請參閱「處理多個品牌」)。
執行階段資源覆蓋
OEM 重疊資料夾中的 RRO 資料夾應包含要套用至所有目標應用程式的資源。RRO 有限制,會影響其重疊複合資源的能力。簡單來說,RRO 是:
-
無法參照在目標 APK 或 RRO 中定義的資源 ID。也就是說,RRO 無法新增新的 ID,例如新的可繪項目、顏色或樣式。
-
可 參照在架構中定義的資源 ID,無論這些資源是在
/frameworks/base/core/res
中定義,還是透過建構時間重疊方式定義。這些 ID 必須使用android:
命名空間參照:-
針對公開的 DeviceDefault RRO,請使用
android
。
例如@android:style/TextAppearance.DeviceDefault.Large
。 -
對於所有其他資源 (非公開資源或透過建構時間重疊新增的資源),請使用
*android
。
例如@*android/style:TextAppearance.OEM.Brand1.Title
。
-
除了資源之外,RRO 資料夾還必須包含:
-
AndroidManifest.xml
。在下方範例中,RRO_PACKAGE_NAME
和TARGET_PACKAGE_NAME
是 makefile 的預留位置:<?xml version=“1.0” encoding=“utf-8”?> <manifest xmlns:android=“http://schemas.android.com/apk/res/android” package=“{{RRO_PACKAGE_NAME}}” /> <application android:hasCode=“false” /> <overlay android:priority=“10” android:targetPackage=“{{TARGET_PACKAGE_NAME}}” android:requiredSystemPropertyName=“ro.product.sku” android:requiredSystemPropertyValue=“<your-product-sku>” /> </manifest>
Android.mk
中的oem
會在下列 makefile 中定義所有產生的 RRO 會使用的前置字串。LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) CAR_UI_RRO_SET_NAME := oem CAR_UI_RESOURCE_DIR := $(LOCAL_PATH)/res CAR_UI_RRO_TARGETS := $(CAR_UI_RRO_PACKAGE_NAMES) include packages/apps/Car/libs/car-ui-lib/generate_rros.mk
設定 RRO
系統支援新的設定檔 overlayable.xml
,您可以使用該檔案定義存取控管機制。舉例來說,您可以指定誰可以疊加資源,以及哪些資源可以疊加。因此,現在可以透過不同的方式將資源分組,讓這些資源可由不同的 RRO 重疊。
如要設定 RRO 存取權控管,請按照下列步驟操作:
- 在
res/values
資料夾中建立overlayable.xml
。 - 建立
<overlayable>
資源標記。 - 為
<overlayable>
標記定義name
屬性,該屬性在套件中不得重複。每個疊加層只能指定一個可疊加的群組。 - 在
<overlayable>
中定義<policy>
標記。 - 定義可重疊的資源群組。例如:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
如要對 RRO 專案套用下列變更:
- 在
res/xml
資料夾中建立overlays.xml
。請參閱下方程式碼範例中overlay
的項目。 - 定義要覆寫的資源。
- 將
android:resourcesMap="@xml/overlays"
新增至AndroidManifest.xml
中的<overlay>
標記。例如,在下方程式碼範例中,請查看<overlay>
的項目。 - 將
android:isStatic=”true”
設為靜態疊加畫面。每個疊加層只能指定一個可疊加的群組。
請參考以下範例。第一個部分屬於 AndroidManifest.xml
,第二個部分屬於 overlays.xml
。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.car.ui.rro" android:versionCode="1" android:versionName="1.0"> <overlay android:targetName="OverlayableResources" android:resourcesMap="@xml/overlays" android:targetPackage="com.android.car.ui" android:priority="1" android:isStatic="false" /> </manifest> <overlay> <item target="string/app_title" value="@ string/app_title" /> </overlay>
不過,先前存在的 RRO 可在 Android 10 中運作。但要注意的是,如果要使用 PackageManagerRRO 安裝,套件必須預先安裝,或使用與目標應用程式相同的金鑰簽署。在 Android 10 中,版面配置檔案可以重疊。不過,您必須在取得檢視畫面時使用 requireViewById()
,而非 findViewById()
。在 Android 10 中,這項變更已實作至 car-ui-lib,以支援版面配置疊加層。
在下一個主要的 Android 版本中,您將能夠重疊版面配置檔案,並在 RRO 套件中定義新的資源,並在內部參照這些資源。
新增 OEM 專屬資源
如要克服 RRO 限制,避免新增 OEM 資源,請按照下列步驟操作:
- 使用建構時間重疊層擴充架構/基礎,新增任何必要的資源。
- 使用
*android:
命名空間,從 OEM RRO 參照這些資源。
舉例來說,以下是新增 OEM 專屬可繪製項目並在 RRO 中使用的方法:
-
<path-to-OEM-overlays>
-
overlay/framework/base/core/res/res/drawable/
-
oem_background_drawable.xml
-
-
rro/res/values
-
drawables.xml
<resources> <item type="drawable" name="car_ui_toolbar_background"> @*android:drawable/oem_background_drawable </item> </resources>
-
-
處理多個品牌
RRO 資訊清單檔案具有語法,可根據系統屬性有條件地套用。如要在單一系統映像檔中處理多個品牌,原始設備製造商 (OEM) 可以使用以下方式 (請參閱「一般結構」)。
<?xml version=“1.0” encoding=“utf-8”?> <manifest xmlns:android=“http://schemas.android.com/apk/res/android” package=“{{RRO_PACKAGE_NAME}}”/> <application android:hasCode=“false”/> <overlay android:priority=“10” android:targetPackage=“{{TARGET_PACKAGE_NAME}}” android:requiredSystemPropertyName=“ro.product.sku” android:requiredSystemPropertyValue=“<your-product-sku>”/> </manifest>
android:requiredSystemPropertyName
和 android:requiredSystemPropertyValue
的語法會導致此 RRO 只在對應的系統屬性與提供的值相符時啟用 。之後,原始設備製造商 (OEM) 可以定義多個此類 RRO,並將所有 RRO 以靜態方式啟用,且一次只啟用一個。
將 Car UI 程式庫新增至目標
如要將 Car UI 程式庫納入 Android 目標,您必須加入下列程式碼片段:
# Include build-time overlays PRODUCT_PACKAGE_OVERLAYS += \ <path-to-oem-overlays>/overlay # Define package names to generate RROs for CAR_UI_RRO_PACKAGE_NAMES += \ com.android.car.ui.paintbooth \ com.android.car.media \ com.android.car.dialer \ com.android.car.linkviewer \ com.android.car.settings \ com.android.car.systemupdater \ com.google.android.apps.automotive.inputmethod \ com.google.android.apps.automotive.templates.host \ ... # Include generated RROs PRODUCT_PACKAGES += \ oem-com-android-car-ui-paintbooth \ oem-com-android-car-media \ oem-com-android-car-dialer \ oem-com-android-car-linkviewer \ oem-com-android-car-settings \ oem-com-android-car-systemupdater \ oem-com-google-android-apps-automotive-inputmethod \ oem-com-google-android-apps-automotive-templates-host \ ...
-
讓
<path-to-OEM-overlays>/rro/Android.mk
為CAR_UI_RRO_PACKAGE_NAMES
中每個命名的套件產生一個 RRO。 -
包含
PRODUCT_PACKAGES
中產生的 RRO。 -
在
PRODUCT_PACKAGE_OVERLAYS
中加入建構時間疊加層,以便新增 OEM 專屬資源。
如要瞭解哪些套件支援 car-ui-lib
,請參閱「含有 car-ui-lib 的套件清單」。