Maintenant que les composants et les ressources de la bibliothèque Car UI sont intégrés aux applications, les OEM doivent fournir deux superpositions pour les personnaliser:
-
La superposition au moment de la compilation ajoute toutes les ressources nécessaires à la superposition de ressources d'exécution (RRO). Par exemple :
- Drawables
- Styles (par exemple, apparence du texte)
- Ressources partagées (couleurs, par exemple)
-
Le dossier RRO overlay 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, il s'agit d'une valeur hexadécimale).
- Ressources du framework Android (par exemple,
@android:color/accent
). - Ressource définie dans la superposition au moment de la compilation 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 compilation -
rro/
-
Android.mk
. Makefile utilisé pour générer les RRO pour chaque paquet cible en fonction des ressources contenues dans ce dossier. -
AndroidManifest.xml
: modèle de fichier manifeste utilisé par le fichier 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 même cible de compilation (voir la section Gérer plusieurs marques).
Superpositions de ressources d'exécution
Le dossier RRO du dossier de superposition OEM doit contenir des ressources à appliquer à toutes les applications cibles. Les RRO présentent des limites qui affectent leur capacité à superposer des ressources composées. En résumé, une interdiction de retour:
-
Ne peut pas faire référence aux identifiants de ressources définis dans l'APK cible ni dans le fichier RRO lui-même. Cela signifie que les RRO ne peuvent pas ajouter de nouveaux identifiants tels que de nouveaux drawables, couleurs ou styles.
-
Peut faire référence aux identifiants de ressources définis dans le framework, que ces ressources soient définies dans
/frameworks/base/core/res
ou à l'aide d'une superposition au moment de la compilation. 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 toutes les autres (ressources non publiques ou ajoutées via une superposition au moment de la compilation), 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 fichiers 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
, dans lequeloem
dans le fichier Makefile suivant définit le préfixe que tous les RRO générés auront.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, overlayable.xml
, est pris en charge. Vous pouvez l'utiliser pour définir des contrôles d'accès. Par exemple, vous pouvez spécifier qui peut superposer des ressources, ainsi que les ressources pouvant être superposées. Par conséquent, les ressources peuvent désormais être regroupées de différentes manières pour pouvoir être superposées par différentes RRO.
Pour configurer le contrôle des accès RRO:
- Dans le dossier
res/values
, créezoverlayable.xml
. - Créez les tags 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>
dans<overlayable>
. - Définissez les groupes de ressources pouvant être superposés. Exemple :
<resources> <overlayable name="OverlayableResources"> <policy type="public"> <item type="string" name="app_title" /> </policy> </overlayable> </resources>
Pour appliquer les modifications suivantes à votre projet de RRO:
- Dans le dossier
res/xml
, créezoverlays.xml
. Consultez l'entréeoverlay
dans l'exemple de code ci-dessous. - 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 pour<overlay>
. - Définissez
android:isStatic=”true”
pour une superposition statique. Chaque superposition ne peut cibler qu'un seul des groupes pouvant être superposés.
Prenons l'exemple suivant : La première section appartient à AndroidManifest.xml
, tandis que la seconde 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>
À une exception près : les RRO existants fonctionnent sous Android 10. La mise en garde est que pour être installés avec PackageManagerRRO, les packages doivent être préinstallés ou signés avec la même clé que l'application cible. Sous Android 10, les fichiers de mise en page peuvent être superposés. Toutefois, pour ce faire, vous devez utiliser requireViewById()
lors de l'obtention de la vue au lieu de findViewById()
. Dans Android 10, ce changement a été implémenté 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 à l'OEM
Pour contourner les limites des RRO qui empêchent l'ajout de ressources OEM:
- Étendez les frameworks/base à l'aide d'une superposition au moment de la compilation, en ajoutant les ressources nécessaires.
- Reportez-vous à ces ressources à partir des RRO OEM à l'aide de l'espace de noms
*android:
.
Par exemple, voici comment ajouter un drawable spécifique à l'OEM et 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 système. Pour gérer plusieurs marques dans une même image système, les OEM peuvent utiliser la méthode suivante (voir la section 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 cette 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 intégrer la bibliothèque d'UI pour voitures à 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 \ ...
-
Permet à
<path-to-OEM-overlays>/rro/Android.mk
de générer 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 compilation dans
PRODUCT_PACKAGE_OVERLAYS
pour ajouter des ressources spécifiques à l'OEM.
Pour savoir quels packages sont compatibles avec car-ui-lib
, consultez la liste des packages contenant car-ui-lib.