Personnaliser les applications

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 construction

    • 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 . 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 noms android: : :

    • 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 et TARGET_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 lequel oem 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 :

  1. Dans le dossier res/values , créez overlayable.xml .
  2. Créez les balises de ressources <overlayable> .
  3. 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.
  4. Définissez la balise <policy> à l'intérieur <overlayable> .
  5. 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 :

  1. Dans le dossier res/xml , créez overlays.xml . Voir l'entrée dans l'exemple de code ci-dessous pour overlay .
  2. Définissez les ressources à remplacer.
  3. Ajoutez android:resourcesMap="@xml/overlays" à la balise <overlay> dans AndroidManifest.xml . Par exemple, dans l’exemple de code ci-dessous, consultez l’entrée <overlay> .
  4. 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 dans CAR_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 .