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_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
については、以下のコード サンプルのエントリを参照してください。 - オーバーライドするリソースを定義します。
-
AndroidManifest.xml
の<overlay>
タグにandroid:resourcesMap="@xml/overlays"
を追加します。たとえば、以下のコードサンプルでは、<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 制限を克服するには、次の手順を実行します。
- ビルド時のオーバーレイを使用してフレームワーク/ベースを拡張し、必要なリソースを追加します。
-
*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 を含むパッケージのリスト」を参照してください。