Personnaliser les applications

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 Les TARGET_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:

  1. Dans le dossier res/values, créez overlayable.xml.
  2. Créez les tags de ressource <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 de superposition.
  4. Définissez la balise <policy> dans <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. Consultez l'entrée exemple de code ci-dessous pour overlay.
  2. Définissez les ressources à remplacer.
  3. Ajouter android:resourcesMap="@xml/overlays" à <overlay> dans AndroidManifest.xml. Par exemple, dans l'exemple de code ci-dessous, reportez-vous à l'entrée pour <overlay>
  4. 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 \
      ...
  • En effet, <path-to-OEM-overlays>/rro/Android.mk génère un RRO pour chaque 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 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.