Kini setelah komponen dan sumber daya pustaka UI Mobil dimasukkan ke dalam aplikasi, untuk menyesuaikan aplikasi ini, OEM harus menyediakan dua overlay:
Hamparan waktu build menambahkan sumber daya apa pun yang diperlukan untuk overlay sumber daya runtime (RRO). Ini termasuk:
- Sumber daya dapat digambar
- Gaya (misalnya, tampilan teks)
- Sumber daya bersama (misalnya, warna)
Folder overlay RRO berisi sumber daya yang digunakan untuk menghasilkan satu RRO per aplikasi target. Sumber daya ini hanya dapat merujuk pada:
- Nilai yang ditentukan dalam RRO yang sama (misalnya, untuk warna, nilainya adalah nilai heksadesimal).
- Sumber daya kerangka kerja Android (misalnya,
@android:color/accent
). - Sumber daya yang ditentukan dalam hamparan waktu pembangunan di atas.
Struktur umum
Struktur overlay kustomisasi yang diusulkan adalah sebagai berikut:
<path-to-OEM-overlays>/
overlay/framework/base/core/res/
. Sumber daya hamparan waktu pembangunanrro/
Android.mk
. Makefile digunakan untuk menghasilkan RRO untuk setiap paket target berdasarkan sumber daya yang terdapat dalam folder ini.AndroidManifest.xml
. Templat file manifes yang digunakan oleh makefile di atas.res/
. Hamparan waktu proses untuk diterapkan ke semua aplikasi target.
OEM mungkin memiliki lebih dari satu struktur ini, bergantung pada jumlah merek yang ingin mereka tangani dalam satu target pembangunan (lihat Menangani beberapa merek ).
Hamparan sumber daya waktu proses
Folder RRO di folder overlay OEM harus berisi sumber daya untuk diterapkan ke semua aplikasi target. RRO memiliki keterbatasan yang mempengaruhi kemampuannya untuk menggabungkan sumber daya. Singkatnya, RRO:
Tidak dapat merujuk ke pengidentifikasi sumber daya yang ditentukan dalam APK target, atau dalam RRO itu sendiri. Artinya, RRO tidak dapat menambahkan pengidentifikasi baru seperti sumber daya dapat digambar, warna, atau gaya baru.
Bisa mengacu pada pengidentifikasi sumber daya yang ditentukan dalam kerangka kerja, baik sumber daya tersebut ditentukan dalam
/frameworks/base/core/res
atau melalui overlay waktu pembangunan. Pengidentifikasi ini harus dirujuk menggunakanandroid:
name-space:Untuk RRO DeviceDefault publik , gunakan
android
.
Misalnya,@android:style/TextAppearance.DeviceDefault.Large
.Untuk yang lainnya (non-publik atau sumber daya yang ditambahkan melalui overlay waktu pembangunan), gunakan
*android
.
Misalnya,@*android/style:TextAppearance.OEM.Brand1.Title
.
Selain sumber daya, folder RRO harus berisi:
AndroidManifest.xml
. Pada 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
di makefile berikut mendefinisikan 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
Konfigurasikan RRO
File konfigurasi baru didukung, overlayable.xml
, yang dapat Anda gunakan untuk menentukan kontrol akses. Misalnya, Anda dapat menentukan siapa yang dapat melapisi sumber daya serta sumber daya mana yang dapat dilapis. Hasilnya, sumber daya kini dapat dikelompokkan dengan cara berbeda agar tersedia untuk dilapis oleh RRO berbeda.
Untuk mengatur kontrol akses RRO:
- Di folder
res/values
, buatoverlayable.xml
. - Buat tag sumber daya
<overlayable>
. - Tentukan atribut
name
untuk tag<overlayable>
, yang harus unik dalam paket. Setiap hamparan hanya dapat menargetkan satu grup yang dapat dihamparkan. - Tentukan tag
<policy>
di dalam<overlayable>
. - Tentukan kelompok sumber daya yang dapat dihamparkan. Misalnya:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Untuk menerapkan perubahan berikut pada proyek RRO Anda:
- Di folder
res/xml
, buatoverlays.xml
. Lihat entri dalam contoh kode di bawah untukoverlay
. - Tentukan sumber daya yang akan diganti.
- Tambahkan
android:resourcesMap="@xml/overlays"
ke tag<overlay>
diAndroidManifest.xml
. Misalnya, dalam contoh kode di bawah, lihat entri untuk<overlay>
. - Setel
android:isStatic=”true”
untuk overlay statis. Setiap overlay hanya dapat menargetkan satu grup yang dapat di-overlay.
Perhatikan contoh berikut. Bagian pertama milik AndroidManifest.xml
sedangkan bagian kedua milik 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 peringatan, RRO yang sudah ada sebelumnya berfungsi di Android 10. Peringatannya adalah bahwa untuk diinstal dengan PackageManagerRRO, paket harus sudah diinstal sebelumnya atau ditandatangani dengan kunci yang sama dengan aplikasi target. Di Android 10, file tata letak dapat di-overlay. Namun, hal tersebut memerlukan penggunaan requireViewById()
saat mendapatkan tampilan, bukan findViewById()
. Di Android 10, perubahan ini telah diterapkan pada car-ui-lib untuk mendukung overlay tata letak.
Rilis besar Android berikutnya akan memungkinkan Anda untuk menghamparkan file tata letak dan menentukan sumber daya baru dalam paket RRO dan merujuknya secara internal.
Tambahkan sumber daya khusus OEM
Untuk mengatasi keterbatasan RRO yang mencegah penambahan sumber daya OEM:
- Perluas kerangka kerja/basis menggunakan overlay waktu pembangunan , tambahkan sumber daya apa pun yang diperlukan.
- Lihat sumber daya ini dari OEM RRO menggunakan
*android:
namespace.
Misalnya, berikut ini adalah cara menambahkan drawable khusus OEM dan menggunakannya dalam 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 banyak merek
File manifes RRO memiliki sintaksis yang memungkinkannya diterapkan secara kondisional berdasarkan properti sistem. Untuk menangani beberapa merek dalam satu citra 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>
Sintaks untuk android:requiredSystemPropertyName
dan android:requiredSystemPropertyValue
akan menyebabkan RRO ini diaktifkan hanya jika properti sistem terkait cocok dengan nilai yang diberikan. OEM kemudian dapat menentukan beberapa RRO ini, semuanya diaktifkan secara statis, dan hanya satu yang aktif dalam satu waktu.
Tambahkan perpustakaan UI Mobil ke target
Untuk menggabungkan pustaka 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 \ ...
Penyebab
<path-to-OEM-overlays>/rro/Android.mk
menghasilkan satu RRO untuk setiap paket yang disebutkan dalamCAR_UI_RRO_PACKAGE_NAMES
.Termasuk RRO yang dihasilkan di
PRODUCT_PACKAGES
.Menyertakan hamparan waktu pembuatan di
PRODUCT_PACKAGE_OVERLAYS
untuk menambahkan sumber daya khusus OEM.
Untuk mempelajari paket mana yang mendukung car-ui-lib
, lihat Daftar paket yang berisi car-ui-lib .