Maintenant que les composants et les ressources de la bibliothèque Car UI sont intégrés dans les applications, afin de personnaliser ces applications, les constructeurs OEM doivent fournir deux superpositions :
La superposition de ressources d'exécution ajoute toutes les ressources nécessaires à la superposition de ressources d'exécution (RRO). Ceci comprend:
- Dessinables
- Styles (par exemple, apparences de texte)
- Ressources partagées (par exemple, couleurs)
Le dossier de superposition RRO contient les ressources utilisées pour générer un RRO par application cible. Ces ressources ne peuvent faire référence qu’à :
- Valeurs définies dans le même RRO (par exemple, pour une couleur, ce serait une valeur hexadécimale).
- Ressources du framework Android (par exemple,
@android:color/accent
). - Une ressource définie dans la superposition de build ci-dessus.
Structure générale
La structure de superposition de personnalisation proposée est la suivante :
<path-to-OEM-overlays>/
overlay/framework/base/core/res/
. Ressources de superposition au moment de la constructionrro/
Android.mk
. Makefile utilisé pour générer les RRO pour chaque package cible en fonction des ressources contenues dans ce dossier.AndroidManifest.xml
. Un modèle de fichier manifeste utilisé par le makefile ci-dessus.res/
. Superpositions d'exécution à appliquer à toutes les applications cibles.
Les OEM peuvent avoir plusieurs de ces structures, en fonction du nombre de marques qu'ils souhaitent gérer dans une seule cible de build (voir Gérer plusieurs marques ).
Superpositions de ressources d'exécution
Le dossier RRO dans le dossier de superposition OEM doit contenir des ressources à appliquer à toutes les applications cibles. Les RRO ont des limitations affectant leur capacité à superposer des ressources composées. En résumé, un RRO :
Impossible de faire référence aux identifiants de ressources définis dans l'APK cible ou dans le RRO lui-même. Cela signifie que les RRO ne peuvent pas ajouter de nouveaux identifiants tels que de nouveaux dessinables, couleurs ou styles.
Peut faites référence aux identifiants de ressources définis dans le framework, que ces ressources soient définies dans
/frameworks/base/core/res
ou au moyen d'une superposition au moment de la construction. Ces identifiants doivent être référencés à l'aide de l'espace de nomsandroid:
: :Pour les RRO DeviceDefault publics , utilisez
android
.
Par exemple,@android:style/TextAppearance.DeviceDefault.Large
.Pour tous les autres (non publics ou ressources ajoutées via la superposition au moment de la construction), utilisez
*android
.
Par exemple,@*android/style:TextAppearance.OEM.Brand1.Title
.
En plus des ressources, le dossier RRO doit contenir :
AndroidManifest.xml
. Dans l'exemple ci-dessous,RRO_PACKAGE_NAME
etTARGET_PACKAGE_NAME
sont des espaces réservés pour les makefiles :<?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
dans lequeloem
dans le makefile suivant définit le préfixe que tous les RRO générés auraient.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
Configurer les RRO
Un nouveau fichier de configuration est pris en charge, overlayable.xml
, que vous pouvez utiliser pour définir les contrôles d'accès. Par exemple, vous pouvez spécifier qui peut superposer des ressources ainsi que quelles ressources peuvent être superposées. En conséquence, les ressources peuvent désormais être regroupées de différentes manières afin de pouvoir être superposées par différents RRO.
Pour configurer le contrôle d'accès RRO :
- Dans le dossier
res/values
, créezoverlayable.xml
. - Créez les balises de ressources
<overlayable>
. - Définissez l'attribut
name
pour la balise<overlayable>
, qui doit être unique dans le package. Chaque superposition ne peut cibler qu'un seul groupe superposable. - Définissez la balise
<policy>
à l'intérieur<overlayable>
. - Définissez les groupes de ressources pouvant être superposés. Par exemple :
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Pour appliquer les modifications suivantes à votre projet RRO :
- Dans le dossier
res/xml
, créezoverlays.xml
. Voir l'entrée dans l'exemple de code ci-dessous pouroverlay
. - Définissez les ressources à remplacer.
- Ajoutez
android:resourcesMap="@xml/overlays"
à la balise<overlay>
dansAndroidManifest.xml
. Par exemple, dans l’exemple de code ci-dessous, consultez l’entrée<overlay>
. - Définissez
android:isStatic=”true”
pour une superposition statique. Chaque superposition ne peut cibler qu'un seul des groupes pouvant être superposés.
Considérez l'exemple suivant. La première section appartient à AndroidManifest.xml
tandis que la deuxième section concerne 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>
Avec une mise en garde, les RRO existants fonctionnent sous Android 10. La mise en garde étant que pour être installés avec PackageManagerRRO, les packages doivent être soit préinstallés, soit signés avec la même clé que l'application cible. Sous Android 10, les fichiers de mise en page peuvent être superposés. Cependant, cela nécessite l'utilisation de requireViewById()
lors de l'obtention de la vue au lieu de findViewById()
. Dans Android 10, cette modification a été implémentée dans car-ui-lib pour prendre en charge les superpositions de mise en page.
La prochaine version majeure d'Android vous permettra de superposer un fichier de mise en page, de définir de nouvelles ressources dans le package RRO et de vous y référer en interne.
Ajouter des ressources spécifiques aux OEM
Pour surmonter les limitations RRO qui empêchent l’ajout de ressources OEM :
- Étendez les frameworks/base à l'aide d'une superposition au moment de la construction , en ajoutant toutes les ressources nécessaires.
- Reportez-vous à ces ressources des RRO OEM en utilisant
*android:
espace de noms.
Par exemple, voici un moyen d'ajouter un dessin spécifique à l'OEM et de l'utiliser dans 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>
Gérer plusieurs marques
Les fichiers manifestes RRO ont une syntaxe qui leur permet d'être appliqués de manière conditionnelle en fonction des propriétés du système. Pour gérer plusieurs marques dans une seule image système, les OEM peuvent l'utiliser comme suit (voir Structure générale ).
<?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 syntaxe de android:requiredSystemPropertyName
et android:requiredSystemPropertyValue
entraînerait l'activation de ce RRO uniquement si la propriété système correspondante correspond à la valeur fournie. Les OEM peuvent ensuite définir plusieurs de ces RRO, tous activés de manière statique, et n’en avoir qu’un seul actif à la fois.
Ajouter la bibliothèque Car UI à une cible
Pour incorporer la bibliothèque Car UI à une cible Android, vous devez inclure l'extrait de code suivant :
# 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
génère un RRO pour chacun des packages nommés dansCAR_UI_RRO_PACKAGE_NAMES
.Inclut les RRO générés dans
PRODUCT_PACKAGES
.Inclut une superposition au moment de la construction dans
PRODUCT_PACKAGE_OVERLAYS
pour ajouter des ressources spécifiques aux OEM.
Pour savoir quels packages prennent en charge car-ui-lib
, consultez Liste des packages contenant car-ui-lib .