自訂應用程式

現在 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_NAMETARGET_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 存取權控管機制:

  1. res/values 資料夾中,建立 overlayable.xml
  2. 建立 <overlayable> 資源標記。
  3. <overlayable> 標記定義 name 屬性, 在套件中不得重複。每個疊加層只能指定一個可重疊的群組。
  4. 定義 <overlayable> 中的 <policy> 標記。
  5. 定義可重疊的資源群組。例如:
      <resources>
          <overlayable name="OverlayableResources">
              <policy type="public">
                  <item type="string" name="app_title" />
              </policy>
          </overlayable>
      </resources>
      

如要將下列變更套用至 RRO 專案:

  1. res/xml 資料夾中,建立 overlays.xml。請參閱 在下方 overlay 的程式碼範例。
  2. 定義要覆寫的資源。
  3. <overlay> 新增 android:resourcesMap="@xml/overlays" 標記在 AndroidManifest.xml 中。例如,在下列程式碼範例中,請參閱 <overlay>
  4. 為靜態疊加層設定 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:requiredSystemPropertyNameandroid: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 的套件清單