アプリのカスタマイズ

Car UI ライブラリのコンポーネントとリソースがアプリに組み込まれたので、これらのアプリをカスタマイズするには、OEM は 2 つのオーバーレイを提供する必要があります。

  • ビルド時オーバーレイは、ランタイム リソース オーバーレイ (RRO) に必要なリソースを追加します。これも:

    • ドローアブル
    • スタイル (テキストの外観など)
    • 共有リソース (色など)
  • RRO オーバーレイフォルダーには、ターゲット アプリごとに 1 つの RRO を生成するために使用されるリソースが含まれています。これらのリソースは以下のみを参照できます。

    • 同じ RRO 内で定義された値 (たとえば、色の場合、これは 16 進値になります)。
    • Android フレームワーク リソース (例: @android:color/accent )。
    • 上記のビルド時オーバーレイで定義されたリソース。

一般的な構造

提案されているカスタマイズ オーバーレイ構造は次のとおりです。

  • <path-to-OEM-overlays>/

    • overlay/framework/base/core/res/ 。ビルド時のオーバーレイ リソース

    • rro/

      • Android.mk 。このフォルダーに含まれるリソースに基づいて各ターゲット パッケージの RRO を生成するために使用される Makefile。

      • AndroidManifest.xml 。上記の Makefile で使用されるマニフェスト ファイル テンプレート。

      • res/ 。すべてのターゲット アプリに適用するランタイム オーバーレイ。

OEM は、単一のビルド ターゲットで処理したいブランドの数に応じて、これらの構造を複数持つ場合があります ( 「複数のブランドの処理」を参照)。

ランタイムリソースオーバーレイ

OEM オーバーレイ フォルダー内の RRO フォルダーには、すべてのターゲット アプリに適用されるリソースが含まれている必要があります。 RRO には、複合リソースをオーバーレイする機能に影響する制限があります。要約すると、RRO は次のようになります。

  • ターゲット APK または RRO 自体で定義されたリソース識別子を参照することはできません。これは、RRO が新しいドローアブル、色、スタイルなどの新しい識別子を追加できないことを意味します。

  • できる リソースが/frameworks/base/core/resで定義されているか、ビルド時のオーバーレイによって定義されているかに関係なく、フレームワークで定義されたリソース識別子を参照します。これらの識別子は、 android:名前空間を使用して参照する必要があります。

    • パブリックDeviceDefault RRO の場合は、 androidを使用します。
      たとえば、 @android:style/TextAppearance.DeviceDefault.Largeです。

    • その他すべて(非パブリックまたはビルド時のオーバーレイによって追加されたリソース) については、 *androidを使用します
      たとえば、 @*android/style:TextAppearance.OEM.Brand1.Title

RRO フォルダーには、リソースに加えて、以下が含まれている必要があります。

  • AndroidManifest.xml 。以下のサンプルでは、 RRO_PACKAGE_NAMETARGET_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では、次の 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属性を定義します。これはパッケージ内で一意である必要があります。各オーバーレイは、オーバーレイ可能なグループを 1 つだけターゲットにすることができます。
  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. AndroidManifest.xml<overlay>タグにandroid:resourcesMap="@xml/overlays"を追加します。たとえば、以下のコードサンプルでは、 <overlay>のエントリを参照してください。
  4. 静的オーバーレイの場合はandroid:isStatic=”true”を設定します。各オーバーレイは、オーバーレイできるグループのうち 1 つだけをターゲットにできます。

次の例を考えてみましょう。最初のセクションはAndroidManifest.xmlに属し、2 番目のセクションは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では、レイアウトファイルを重ねて表示できるようになりました。ただし、これを行うには、ビューを取得するときにfindViewById()の代わりにrequireViewById()を使用する必要があります。 Android 10 では、レイアウト オーバーレイをサポートするために、この変更が car-ui-lib に実装されました。

Android の次のメジャー リリースでは、レイアウト ファイルをオーバーレイし、RRO パッケージ内で新しいリソースを定義し、それらを内部で参照できるようになります。

OEM 固有のリソースを追加する

OEM リソースの追加を妨げる RRO 制限を克服するには、次の手順を実行します。

  • ビルド時のオーバーレイを使用してフレームワーク/ベースを拡張し、必要なリソースを追加します。
  • *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 を複数定義し、そのすべてを静的に有効にし、一度に 1 つだけをアクティブにすることができます。

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で指定されたパッケージごとに 1 つの RRO が生成されます。

  • 生成された RRO をPRODUCT_PACKAGESに含めます。

  • OEM 固有のリソースを追加するためのビルド時オーバーレイをPRODUCT_PACKAGE_OVERLAYSに含めます。

どのパッケージがcar-ui-libをサポートしているかについては、 「 car-ui-lib を含むパッケージのリスト」を参照してください。