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_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
。次の 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
属性を定義します。この属性はパッケージ内で一意であることが必要です。各オーバーレイは、1 つのオーバーレイが可能なグループのみをターゲットにできます。<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”
を設定します。各オーバーレイは、オーバーレイ可能なグループのうち 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: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 がサポートするパッケージをご覧ください。