Sekarang komponen perpustakaan UI Mobil dan sumber daya ke dalam aplikasi, untuk menyesuaikan aplikasi ini, OEM harus menyediakan dua overlay:
Overlay waktu pembuatan. Overlay ini akan menambah sumber daya yang dibutuhkan untuk RRO. Ini termasuk:
- dapat digambar
- Gaya (misalnya, tampilan teks)
Sumber daya bersama (misalnya, warna)
lapisan RRO. Folder ini berisi sumber daya yang digunakan untuk menghasilkan satu RRO per aplikasi target. Sumber daya ini hanya dapat merujuk ke:
- Nilai yang ditentukan dalam RRO yang sama (misalnya, untuk warna ini akan menjadi nilai heksadesimal).
- Sumber daya kerangka kerja Android (misalnya,
@android:color/accent
). - Resource yang ditentukan dalam overlay waktu build di atas.
Struktur Umum
Struktur overlay kustomisasi yang diusulkan adalah sebagai berikut:
<path-to-OEM-overlays>/
overlay/framework/base/core/res/
. Sumber daya overlay waktu pembuatanrro/
Android.mk
. Makefile digunakan untuk menghasilkan RRO untuk setiap paket target berdasarkan sumber daya yang terkandung dalam folder ini.AndroidManifest.xml
. Template 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 pembuatan (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 memengaruhi kemampuannya untuk melapisi sumber daya majemuk. Singkatnya, RRO:
Tidak dapat merujuk ke pengidentifikasi sumber daya yang ditentukan dalam APK target, atau di RRO itu sendiri. Ini berarti bahwa RRO tidak dapat menambahkan pengenal baru seperti sumber daya dapat digambar, warna, atau gaya baru.
Bisa merujuk ke pengidentifikasi sumber daya yang ditentukan dalam kerangka kerja, apakah sumber daya tersebut didefinisikan di
/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 semua yang lain (non-publik atau sumber daya ditambahkan melalui overlay waktu build), gunakan
*android
Misalnya,@*android/style:TextAppearance.OEM.Brand1.Title
Selain sumber daya, 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
di manaoem
dalam makefile berikut mendefinisikan awalan yang akan dimiliki oleh 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 Hamparan 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. Akibatnya, sumber daya sekarang dapat dikelompokkan dengan cara yang berbeda untuk membuatnya tersedia untuk dilapiskan oleh RRO yang berbeda.
Untuk menyiapkan 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 overlay hanya dapat menargetkan satu grup overlay. - Tentukan tag
<policy>
di dalam<overlayable>
. - Tentukan kelompok sumber daya yang dapat dilapis. Misalnya:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Untuk menerapkan perubahan berikut ke proyek RRO Anda:
- Di folder
res/xml
, buatoverlays.xml
. Lihat entri dalam contoh kode di bawah ini untukoverlay
. - Tentukan sumber daya yang akan ditimpa.
- Tambahkan
android:resourcesMap="@xml/overlays"
ke tag<overlay>
diAndroidManifest.xml
. Misalnya, dalam contoh kode di bawah ini, lihat entri untuk<overlay>
. - Setel
android:isStatic=”true”
untuk hamparan statis. Setiap hamparan hanya dapat menargetkan satu grup yang dapat dilapis.
Perhatikan contoh berikut. Bagian pertama 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 peringatan, RRO yang sudah ada sebelumnya akan terus berfungsi di Android 10. Peringatan 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, melakukannya memerlukan penggunaan requireViewById()
saat mendapatkan tampilan alih-alih findViewById()
. Di Android 10, perubahan ini telah diterapkan ke car-ui-lib untuk mendukung overlay tata letak.
Rilis utama Android berikutnya akan memungkinkan Anda untuk melapisi file tata letak dan menentukan sumber daya baru dalam paket RRO dan merujuknya secara internal.
Menambahkan Sumber Daya Khusus OEM
Untuk mengatasi batasan RRO yang mencegah sumber daya OEM ditambahkan:
- Perluas kerangka kerja/basis menggunakan overlay waktu pembuatan , dengan menambahkan sumber daya apa pun yang diperlukan.
- Lihat sumber daya ini dari OEM RRO menggunakan
*android:
namespace.
Misalnya, berikut ini adalah cara untuk menambahkan sumber daya dapat digambar 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 Beberapa Merek
File manifes RRO memiliki sintaks untuk memungkinkannya diterapkan secara kondisional berdasarkan properti sistem. Untuk menangani beberapa merek dalam satu citra sistem, OEM dapat menggunakan ini 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 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 Perpustakaan UI Mobil ke Target
Untuk menggabungkan perpustakaan 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
.Mencakup hamparan waktu pembuatan di
PRODUCT_PACKAGE_OVERLAYS
untuk menambahkan sumber daya khusus OEM.
Untuk mempelajari paket mana yang mendukung car-ui-lib
, lihat Paket yang Didukung oleh car-ui-lib .