アプリのカスタマイズ

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 は、1 つのビルド ターゲットで処理するブランドの数に応じて複数の構造を持つ場合があります(複数のブランドを処理するをご覧ください)。

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

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. android:resourcesMap="@xml/overlays"AndroidManifest.xml<overlay> タグに追加します。たとえば、以下のコードサンプルで、<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 の制限を克服するには、次のように処理します。

  • build-time オーバーレイを使用してフレームワーク / ベースを拡張し、必要なリソースを追加します。
  • *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 マニフェスト ファイルには、システム プロパティに基づいて条件付きで適用できるようにするための構文があります。1 つのシステム イメージで複数のブランドを処理する際に、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 を複数定義し、それらのすべてを静的に有効にして、一度に 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 がサポートするパッケージをご覧ください。