Setelah komponen dan resource library UI Mobil dimasukkan ke dalam aplikasi, untuk menyesuaikan aplikasi ini, OEM harus menyediakan dua overlay:
-
Overlay waktu build menambahkan resource yang diperlukan untuk runtime resource overlay (RRO). Hal ini mencakup:
- Drawable
- Gaya (misalnya, tampilan teks)
- Resource bersama (misalnya, warna)
-
Folder overlay RRO berisi resource yang digunakan untuk membuat satu RRO per aplikasi target. Resource ini hanya dapat merujuk ke:
- Nilai yang ditentukan dalam RRO yang sama (misalnya, untuk warna, ini akan berupa nilai heksadesimal).
- Resource framework Android (misalnya,
@android:color/accent
). - Resource yang ditentukan dalam overlay waktu build di atas.
Struktur umum
Struktur overlay penyesuaian yang diusulkan adalah sebagai berikut:
-
<path-to-OEM-overlays>/
-
overlay/framework/base/core/res/
. Resource overlay waktu build -
rro/
-
Android.mk
. Makefile yang digunakan untuk membuat RRO untuk setiap paket target berdasarkan resource yang terdapat dalam folder ini. -
AndroidManifest.xml
. Template file manifes yang digunakan oleh makefile di atas. -
res/
. Overlay runtime yang akan diterapkan ke semua aplikasi target.
-
-
OEM mungkin memiliki lebih dari satu struktur ini, bergantung pada jumlah merek yang ingin mereka tangani dalam satu target build (lihat Menangani beberapa merek).
Overlay resource runtime
Folder RRO di folder overlay OEM harus berisi resource yang akan diterapkan ke semua aplikasi target. RRO memiliki batasan yang memengaruhi kemampuannya untuk menempatkan resource gabungan. Singkatnya, RRO:
-
Tidak dapat merujuk ke ID resource yang ditentukan dalam APK target, atau dalam RRO itu sendiri. Artinya, RRO tidak dapat menambahkan ID baru seperti drawable, warna, atau gaya baru.
-
Dapat merujuk ke ID resource yang ditentukan dalam framework, baik resource tersebut ditentukan di
/frameworks/base/core/res
atau melalui overlay waktu build. ID ini harus dirujuk menggunakan namespaceandroid:
:-
Untuk RRO DeviceDefault publik, gunakan
android
.
Misalnya,@android:style/TextAppearance.DeviceDefault.Large
. -
Untuk semua yang lain (non-publik atau resource yang ditambahkan melalui overlay waktu build), gunakan
*android
.
Misalnya,@*android/style:TextAppearance.OEM.Brand1.Title
.
-
Selain resource, folder RRO harus berisi:
-
AndroidManifest.xml
. Dalam contoh di bawah,RRO_PACKAGE_NAME
danTARGET_PACKAGE_NAME
adalah placeholder untuk 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
denganoem
dalam makefile berikut menentukan awalan yang akan dimiliki semua RRO yang dihasilkan.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
Mengonfigurasi RRO
File konfigurasi baru didukung, overlayable.xml
, yang dapat Anda gunakan untuk menentukan kontrol akses. Misalnya, Anda dapat menentukan siapa yang dapat menempatkan overlay pada resource serta resource mana
yang dapat ditempatkan overlay. Akibatnya, resource kini dapat dikelompokkan dengan cara yang berbeda agar
tersedia untuk ditempatkan oleh RRO yang berbeda.
Untuk menyiapkan kontrol akses RRO:
- Di folder
res/values
, buatoverlayable.xml
. - Buat tag resource
<overlayable>
. - Tentukan atribut
name
untuk tag<overlayable>
, yang harus unik dalam paket. Setiap overlay dapat menargetkan hanya satu grup yang dapat di-overlay. - Tentukan tag
<policy>
di dalam<overlayable>
. - Tentukan grup resource yang dapat ditempatkan. Contoh:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Untuk menerapkan perubahan berikut pada project RRO Anda:
- Di folder
res/xml
, buatoverlays.xml
. Lihat entri dalam contoh kode di bawah untukoverlay
. - Tentukan resource yang akan diganti.
- Tambahkan
android:resourcesMap="@xml/overlays"
ke tag<overlay>
diAndroidManifest.xml
. Misalnya, dalam contoh kode di bawah, lihat entri untuk<overlay>
. - Tetapkan
android:isStatic=”true”
untuk overlay statis. Setiap overlay hanya dapat menarget salah satu grup yang dapat ditempatkan.
Perhatikan contoh berikut. Bagian pertama adalah milik AndroidManifest.xml
, sedangkan bagian kedua berkaitan dengan 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>
Dengan satu pengecualian, RRO yang ada sebelumnya berfungsi di Android 10. Namun,
untuk diinstal dengan PackageManagerRRO, paket harus diinstal sebelumnya atau
ditandatangani dengan kunci yang sama dengan aplikasi target. Di Android 10, file tata letak dapat ditempatkan. Namun,
melakukannya memerlukan penggunaan requireViewById()
saat mendapatkan tampilan, bukan
findViewById()
. Di Android 10, perubahan ini telah diterapkan ke car-ui-lib untuk
mendukung overlay tata letak.
Rilis utama Android berikutnya akan memungkinkan Anda menempatkan file tata letak dan menentukan resource baru dalam paket RRO serta merujuknya secara internal.
Menambahkan resource khusus OEM
Untuk mengatasi batasan RRO yang mencegah penambahan resource OEM:
- Memperluas framework/basis menggunakan overlay build-time, dengan menambahkan resource yang diperlukan.
- Lihat resource ini dari RRO OEM menggunakan namespace
*android:
.
Misalnya, berikut adalah cara menambahkan drawable khusus OEM dan menggunakannya di 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>
-
-
Menangani beberapa merek
File manifes RRO memiliki sintaksis untuk memungkinkannya diterapkan secara kondisional berdasarkan properti sistem. Untuk menangani beberapa merek dalam satu image sistem, OEM dapat menggunakannya sebagai berikut (lihat Struktur umum).
<?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>
Sintaksis untuk android:requiredSystemPropertyName
dan
android:requiredSystemPropertyValue
akan menyebabkan RRO ini diaktifkan hanya
jika properti sistem yang sesuai cocok dengan nilai yang diberikan. OEM kemudian dapat menentukan beberapa
RRO ini, semuanya diaktifkan secara statis, dan hanya memiliki satu yang aktif dalam satu waktu.
Menambahkan library UI Mobil ke target
Untuk menggabungkan library UI Mobil ke target Android, Anda harus menyertakan cuplikan kode berikut:
# 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 \ ...
-
Menyebabkan
<path-to-OEM-overlays>/rro/Android.mk
menghasilkan satu RRO untuk setiap paket yang diberi nama diCAR_UI_RRO_PACKAGE_NAMES
. -
Mencakup RRO yang dihasilkan di
PRODUCT_PACKAGES
. -
Menyertakan overlay waktu build di
PRODUCT_PACKAGE_OVERLAYS
untuk menambahkan resource khusus OEM.
Untuk mempelajari paket yang mendukung car-ui-lib
, lihat Daftar paket yang berisi car-ui-lib.