現在 Car UI 程式庫元件和資源會加入應用程式,以便自訂 因此,原始設備製造商 (OEM) 必須提供兩種疊加元素:
-
建構時間疊加層:加入 會在執行階段資源重疊 (RRO) 內顯示。這類功能包括:
- 可繪項目
- 樣式 (例如文字外觀)
- 共用資源 (例如顏色)
-
「RRO 疊加層」資料夾包含用來為每個 GCP 產生一個 RRO 的資源 目標應用程式這些資源只能參照:
- 同一 RRO 內定義的值 (舉例來說,如果顏色的值就是十六進位值) 值)。
- Android 架構資源 (例如
@android:color/accent
)。 - 上述建構時間疊加層中定義的資源。
一般結構
建議的自訂疊加層結構如下:
-
<path-to-OEM-overlays>/
-
overlay/framework/base/core/res/
。建構時間疊加層資源 -
rro/
-
Android.mk
。用於為每個目標套件產生 RRO 的 Makefile 依據這個資料夾包含的資源而定 -
AndroidManifest.xml
。上述範例使用的資訊清單檔案範本 makefile, -
res/
。要套用至所有目標應用程式的執行階段重疊。
-
-
視所需品牌數量而定,原始設備製造商可能有多個結構物 處理單一建構目標 (詳情請參閱 處理多個品牌)。
執行階段資源重疊
原始設備製造商 (OEM) 疊加層資料夾中的 RRO 資料夾應包含要套用至所有目標應用程式的資源。 RRO 存在限制,因而影響了疊加複合資源的能力。總結來說,RRO:
-
「不得」參照目標 APK 或 RRO 本身。也就是說,RRO 無法新增 ID,例如新的可繪項目、顏色或 。
-
「可以」 參照 無論這些資源是由
/frameworks/base/core/res
還是方法定義 建構時間疊加層這類 ID 必須使用android:
來參照 命名空間:-
如果是公開的裝置預設 RRO,請使用
android
。
例如@android:style/TextAppearance.DeviceDefault.Large
。 -
針對「所有」 (非公開,或透過 建構時間疊加層),請使用
*android
。
例如@*android/style:TextAppearance.OEM.Brand1.Title
。
-
除了資源之外,RRO 資料夾還須包含:
-
AndroidManifest.xml
。在下方範例中,RRO_PACKAGE_NAME
和TARGET_PACKAGE_NAME
是 makefiles 的預留位置:<?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
,以下 makefile 中的oem
定義了前置字串 所有產生的 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
的程式碼範例。 - 定義要覆寫的資源。
- 為
<overlay>
新增android:resourcesMap="@xml/overlays"
標記在AndroidManifest.xml
中。例如,在下列程式碼範例中,請參閱<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) 專屬資源
如要克服導致無法新增原始設備製造商 (OEM) 資源的 RRO 限制,請按照下列指示操作:
- 使用「建構時間」疊加擴充架構/基礎,並新增任何必要項目 再複習一下,機構節點 是所有 Google Cloud Platform 資源的根節點
- 請使用
*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 都會以靜態方式啟用,且一次只能使用一個。
將 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
會為每個類型產生一個 RRO 名稱為CAR_UI_RRO_PACKAGE_NAMES
的套件。 -
包含在
PRODUCT_PACKAGES
中產生的 RRO。 -
在
PRODUCT_PACKAGE_OVERLAYS
中加入建構時間疊加層,新增原始設備製造商 (OEM) 專屬 再複習一下,機構節點 是所有 Google Cloud Platform 資源的根節點
如要瞭解哪些套件支援 car-ui-lib
,請參閱包含 car-ui-lib 的套件清單。