Maintenant que les composants et les ressources de la bibliothèque Car UI dans les applications, afin de personnaliser ces applications, les OEM doivent fournir deux superpositions:
-
La superposition au moment de la compilation ajoute toutes les ressources nécessaires pour la superposition de ressources d'exécution (RRO). Par exemple :
- Drawables
- les styles (par exemple, l'apparence du texte) ;
- Ressources partagées (par exemple, les couleurs)
-
Le dossier RRO superposition contient les ressources utilisées pour générer une RRO par application cible. Ces ressources ne peuvent faire référence qu'aux éléments suivants:
- 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
). - Une ressource définie dans la superposition de temps de compilation ci-dessus.
Structure générale
La structure de superposition proposée est la suivante:
-
<path-to-OEM-overlays>/
-
overlay/framework/base/core/res/
Ressources des superpositions au moment de la compilation -
rro/
-
Android.mk
Makefile utilisé pour générer les RRO pour chaque package cible en fonction des ressources contenues dans ce dossier. -
AndroidManifest.xml
Modèle de fichier manifeste utilisé par les éléments ci-dessus makefile. -
res/
Superpositions d'environnement d'exécution à appliquer à toutes les applications cibles.
-
-
Les OEM peuvent disposer de plusieurs de ces structures, en fonction du nombre de marques qu'ils souhaitent dans une cible de compilation unique (voir Gérer plusieurs marques).
Superpositions de ressources d'exécution
Le dossier RRO du dossier en superposition OEM doit contenir des ressources à appliquer à toutes les applications cibles. Les RRO présentent des limites affectant leur capacité à superposer des ressources composées. En résumé, une RRO:
-
ne peuvent pas faire référence à des identifiants de ressource définis dans l'APK cible ou dans le la RRO elle-même. Cela signifie que les RRO ne peuvent pas ajouter de nouveaux identifiants, tels que de nouveaux drawables, de nouvelles couleurs ou .
-
Peut faire référence aux identifiants de ressource définis dans le que ces ressources soient définies dans
/frameworks/base/core/res
ou par des moyens d'une superposition au moment de la compilation. Ces identifiants doivent être référencés à l'aide de l'android:
espace de noms:-
Pour les RRO publiques DeviceDefault, utilisez
android
.
Exemple :@android:style/TextAppearance.DeviceDefault.Large
. -
Pour toutes les autres (ressources non publiques ou ressources ajoutées via superposition au moment de la compilation), utilisez
*android
.
Exemple :@*android/style:TextAppearance.OEM.Brand1.Title
.
-
En plus des ressources, le dossier RRO doit contenir les éléments suivants:
-
AndroidManifest.xml
Dans l'exemple ci-dessous,RRO_PACKAGE_NAME
et LesTARGET_PACKAGE_NAME
sont des espaces réservés pour les fichiers 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
, oùoem
dans le fichier makefile suivant définit le préfixe que tous les RRO générés.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 des RRO
overlayable.xml
est compatible avec un nouveau fichier de configuration que vous pouvez utiliser pour définir
des contrôles d'accès. Par exemple, vous pouvez spécifier qui peut superposer des ressources et quelles ressources
peuvent être superposées. Par conséquent, les ressources peuvent désormais être regroupées de différentes manières
peuvent être superposées
par différents RRO.
Pour configurer le contrôle des accès RRO:
- Dans le dossier
res/values
, créezoverlayable.xml
. - Créez les tags de ressource
<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 de superposition. - 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 RRO:
- Dans le dossier
res/xml
, créezoverlays.xml
. Consultez l'entrée exemple de code ci-dessous pouroverlay
. - Définissez les ressources à remplacer.
- Ajouter
android:resourcesMap="@xml/overlays"
à<overlay>
dansAndroidManifest.xml
. Par exemple, dans l'exemple de code ci-dessous, reportez-vous à l'entrée pour<overlay>
- Définissez
android:isStatic=”true”
pour une superposition statique. Chaque superposition ne peut cibler l'un des groupes qui peuvent être superposés.
Prenons 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>
Sachez toutefois que les RRO déjà existants fonctionnent sous Android 10. La mise en garde
étant qu'ils doivent être installés avec PackageManagerRRO, les packages doivent être soit préinstallés, soit
signé avec la même clé que l'application cible. Sous Android 10, les fichiers de mise en page peuvent être superposés. Toutefois,
Pour cela, vous devez utiliser requireViewById()
pour obtenir la vue au lieu de
findViewById()
Dans Android 10, ce changement a été implémenté dans car-ui-lib pour
prennent en charge les superpositions de mise en page.
La prochaine version majeure d'Android vous permettra de superposer un fichier de mise en page et définir de nouvelles ressources dans le package RRO et s'y référer en interne.
Ajouter des ressources spécifiques aux OEM
Pour contourner les limites de la RRO qui empêchent l'ajout de ressources OEM:
- Étendez les frameworks/base à l'aide d'une superposition au moment de la compilation et ajoutez les éventuels éléments nécessaires. ressources.
- Reportez-vous à ces ressources provenant des RRO OEM en utilisant l'espace de noms
*android:
.
Par exemple, voici un moyen d'ajouter un drawable spécifique à l'OEM et de l'utiliser dans une 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 permet de les appliquer de manière conditionnelle en fonction du système propriétés. Pour gérer plusieurs marques dans une seule image système, les OEM peuvent l'utiliser comme (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
Avec android:requiredSystemPropertyValue
, cette RRO n'est activée que
si la propriété système correspondante correspond à la valeur fournie. Les OEM peuvent alors définir plusieurs
ces RRO, toutes activées de manière statique et
n'ayant qu'une seule activité active à la fois.
Ajouter la bibliothèque Car UI à une cible
Pour intégrer 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 \ ...
- </ph>
-
En effet,
<path-to-OEM-overlays>/rro/Android.mk
génère un RRO pour chaque 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 informations spécifiques à l'OEM ressources.
Pour connaître les packages compatibles avec car-ui-lib
, consultez Liste des packages contenant car-ui-lib.