Ora che i componenti e le risorse della libreria dell'interfaccia utente dell'auto sono nelle app, per personalizzarle gli OEM devono fornire due overlay:
-
L'overlay in fase di compilazione aggiunge le risorse necessarie per il runtime resource overlay (RRO). tra cui:
- Drawable
- Stili (ad es. aspetto del testo)
- Risorse condivise (ad esempio i colori)
-
La cartella Overlay RRO contiene le risorse utilizzate per generare un RRO per ogni app di destinazione. Queste risorse possono fare riferimento solo a:
- Valori definiti all'interno della stessa RRO (ad esempio, per un colore si tratta di un valore esadecimale).
- Risorse del framework Android (ad es.
@android:color/accent
). - Una risorsa definita nell'overlay in fase di compilazione riportato sopra.
Struttura generale
La struttura dell'overlay di personalizzazione proposta è la seguente:
-
<path-to-OEM-overlays>/
-
overlay/framework/base/core/res/
. Risorse di overlay in fase di compilazione -
rro/
-
Android.mk
. Makefile utilizzato per generare gli RRO per ogni pacchetto di destinazione in base alle risorse contenute in questa cartella. -
AndroidManifest.xml
. Un modello di file manifest utilizzato dal makefile riportato sopra. -
res/
. Overlay di runtime da applicare a tutte le app target.
-
-
Gli OEM possono avere più di una di queste strutture, a seconda del numero di brand che vogliono gestire in un singolo target di compilazione (vedi Gestire più brand).
Overlay delle risorse di runtime
La cartella RRO nella cartella dell'overlay OEM deve contenere le risorse da applicare a tutte le app target. Le RRO presentano limitazioni che influiscono sulla loro capacità di sovrapporre risorse composte. In sintesi, un RRO:
-
Non è possibile fare riferimento agli identificatori delle risorse definiti nell'APK di destinazione o nell'RRO stesso. Ciò significa che gli RRO non possono aggiungere nuovi identificatori, come nuovi elementi grafici, colori o stili.
-
Può fare riferimento agli identificatori delle risorse definiti nel framework, indipendentemente dal fatto che queste risorse siano definite in
/frameworks/base/core/res
o tramite un overlay in fase di compilazione. Questi identificatori devono essere richiamati utilizzando lo spazio dei nomiandroid:
:-
Per i valori RRO DeviceDefault pubblici, utilizza
android
.
Ad esempio,@android:style/TextAppearance.DeviceDefault.Large
. -
Per tutte le altre (risorse non pubbliche o aggiunte tramite overlay al momento della compilazione), utilizza
*android
.
Ad esempio,@*android/style:TextAppearance.OEM.Brand1.Title
.
-
Oltre alle risorse, la cartella RRO deve contenere:
-
AndroidManifest.xml
. Nell'esempio seguente,RRO_PACKAGE_NAME
eTARGET_PACKAGE_NAME
sono segnaposto per i file make:<?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
in cuioem
nel seguente file make definisce il prefisso che avranno tutti gli RRO generati.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
Configurare gli RRO
È supportato un nuovo file di configurazione, overlayable.xml
, che puoi utilizzare per definire i controlli di accesso. Ad esempio, puoi specificare chi può sovrapporre le risorse e quali risorse possono essere sovrapposte. Di conseguenza, ora le risorse possono essere raggruppate in diversi modi per essere sovrapposte da diversi RRO.
Per configurare il controllo dell'accesso RRO:
- Nella cartella
res/values
, creaoverlayable.xml
. - Crea i tag delle risorse
<overlayable>
. - Definisci l'attributo
name
per il tag<overlayable>
, che deve essere univoco nel pacchetto. Ogni overlay può avere come target solo un gruppo sovrapponibile. - Definisci il tag
<policy>
all'interno di<overlayable>
. - Definisci i gruppi di risorse che possono essere sovrapposti. Ad esempio:
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Per applicare le seguenti modifiche al progetto RRO:
- Nella cartella
res/xml
, creaoverlays.xml
. Consulta la voce relativa aoverlay
nell'esempio di codice riportato di seguito. - Definisci le risorse da sostituire.
- Aggiungi
android:resourcesMap="@xml/overlays"
al tag<overlay>
inAndroidManifest.xml
. Ad esempio, nell'esempio di codice riportato di seguito, consulta la voce per<overlay>
. - Imposta
android:isStatic=”true”
per un overlay statico. Ogni overlay può avere come target solo uno dei gruppi che possono essere sovrapposti.
Considera l'esempio seguente. La prima sezione appartiene a AndroidManifest.xml
mentre la seconda a 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>
Con un'eccezione, le RRO esistenti in precedenza funzionano in Android 10. Il rovescio della medaglia è che, per essere installati con PackageManagerRRO, i pacchetti devono essere preinstallati o firmati con la stessa chiave dell'app di destinazione. In Android 10, i file di layout possono essere sovrapposti. Tuttavia,
per farlo è necessario utilizzare requireViewById()
durante l'ottenimento della visualizzazione anziché
findViewById()
. In Android 10, questa modifica è stata implementata in car-ui-lib per supportare gli overlay del layout.
La prossima release principale di Android ti consentirà di sovrapporre un file di layout e definire nuove risorse nel pacchetto RRO e farvi riferimento internamente.
Aggiungere risorse specifiche per l'OEM
Per superare le limitazioni RRO che impediscono l'aggiunta di risorse OEM:
- Espandi i framework/la base utilizzando un overlay in fase di compilazione, aggiungendo le risorse necessarie.
- Consulta queste risorse degli RRO OEM che utilizzano lo spazio dei nomi
*android:
.
Ad esempio, di seguito è riportato un modo per aggiungere un drawable specifico per l'OEM e utilizzarlo in un 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>
-
-
Gestire più brand
I file manifest RRO hanno una sintassi che consente di applicarli in modo condizionale in base alle proprietà del sistema. Per gestire più brand in un'unica immagine di sistema, gli OEM possono procedere come segue (vedi Struttura generale).
<?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>
La sintassi di android:requiredSystemPropertyName
e android:requiredSystemPropertyValue
fa sì che questo RRO venga attivato solo se la proprietà di sistema corrispondente corrisponde al valore fornito. Gli OEM possono quindi definire più di questi RRO, tutti attivati in modo statico, e averne uno attivo alla volta.
Aggiungere la libreria dell'interfaccia utente dell'auto a un target
Per incorporare la raccolta UI Car in un target Android, devi includere il seguente snippet di codice:
# 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 \ ...
-
Consente a
<path-to-OEM-overlays>/rro/Android.mk
di generare un RRO per ciascuno dei pacchetti indicati inCAR_UI_RRO_PACKAGE_NAMES
. -
Sono inclusi gli RRO generati in
PRODUCT_PACKAGES
. -
Include un overlay in fase di compilazione in
PRODUCT_PACKAGE_OVERLAYS
per aggiungere risorse specifiche per l'OEM.
Per scoprire quali pacchetti supportano car-ui-lib
, consulta l'elenco dei pacchetti contenenti car-ui-lib.