Ressources supplémentaires

Les ressources suivantes fournissent des informations sur les emplacements du code, les outils, les tests et les licences.

Emplacement du code interrogeable

Le code de l'objet d'interface du fournisseur interrogeable se trouve dans system/libvintf.

Les fichiers manifestes et les matrices de compatibilité pour l'écriture manuscrite peuvent être difficiles à gérer. Utilisez les outils suivants pour générer un fichier manifeste/une matrice de compatibilité standard à partir desquels commencer.

LSHAL

LSHAL est un outil côté appareil qui liste tous les HAL enregistrés sur hwservicemanager et toutes les implémentations de transfert disponibles (par exemple, android.hardware.foo@1.0-impl.so) sur l'appareil. Il peut également générer un fichier manifeste d'appareil en fonction de la liste :

adb shell su 0 /system/bin/lshal --init-vintf

Veuillez noter les points suivants :

  1. Si un package est à la fois enregistré auprès de hwservicemanager et trouvé en tant que HAL de transmission, <transport> est défini sur hwbinder.
  2. Aucune version SELinux n'est indiquée dans le fichier manifeste. Il est suggéré d'injecter l'élément via assemble_vintf, comme expliqué ci-dessous.
  3. Le fichier manifeste HAL généré peut être inexact. Une intervention humaine est nécessaire pour corriger les incohérences entre le fichier manifeste de l'appareil et ce que vendor.img fournit réellement.

ASSEMBLE_VINTF

assemble_vintf est un outil côté hôte qui :

  1. Vérifie qu'une matrice de compatibilité ou un fichier manifeste est valide.
  2. Injecte des variables dans les fichiers manifestes/matrices de compatibilité disponibles au moment de la compilation et génère un nouveau fichier à installer sur l'appareil.
  3. Vérifie la compatibilité entre le fichier généré et son double.
  4. Si un fichier manifeste est fourni, génère éventuellement une matrice de compatibilité standard compatible avec le fichier manifeste.

Exemple : Générer une matrice de compatibilité des appareils à partir d'un fichier manifeste du framework

assemble_vintf -m --hals-only \
    -i system/libhidl/manifest.xml \
    -o device/manufacturer/device_name/compatibility_matrix.xml

Notez que tous les HAL sont définis sur optional="true".

Exemple : Générer une matrice de compatibilité du framework squelette à partir d'un fichier manifeste de l'appareil

assemble_vintf -m --hals-only \
    -i device/foo/bar/manifest.xml \
    -o path/to/place/output/compatibility_matrix.xml

Notez que tous les HAL sont définis sur optional="true".

Exemple : Générer des fichiers XML manifestes d'appareil à partir de variables

Au moment de la compilation, si les variables suivantes sont définies dans device/manufacturer/device_name/BoardConfig.mk :

# Vendor manifest is named DEVICE_MANIFEST_FILE for legacy reasons.
DEVICE_MANIFEST_FILE := \
    device/manufacturer/device_name/vendor_manifest.xml
ODM_MANIFEST_FILES := \
    device/manufacturer/device_name/odm_manifest.xml
ODM_MANIFEST_SKUS := sku1 sku2
ODM_MANIFEST_SKU1_FILES := \
    device/manufacturer/device_name/odm_manifest_sku1.xml
ODM_MANIFEST_SKU2_FILES := \
    device/manufacturer/device_name/odm_manifest_sku2.xml

Les commandes suivantes sont ensuite exécutées (dans le système de compilation, modifiées pour omettre les détails de l'implémentation) afin de générer des fichiers XML de fichier manifeste de l'appareil :

# vendor manifest; only when DEVICE_MANIFEST_FILE is set
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) assemble_vintf \
    $(addprefix,-i ,$(DEVICE_MANIFEST_FILE)) \
    -o $(TARGET_OUT_VENDOR)/etc/vintf/manifest.xml

# ODM manifests
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest.xml

# ODM manifests for each sku
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_SKU1_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku1.xml
assemble_vintf \
    $(addprefix,-i ,$(ODM_MANIFEST_SKU2_FILES)) \
    -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku2.xml

Lors de l'exécution, l'objet VINTF combine les fichiers manifestes du fournisseur et de l'ODM en tant que fichier manifeste de l'appareil. Pour en savoir plus, consultez la section Manifeste de l'appareil.

Exemple : Générer des fichiers XML de matrice de compatibilité des appareils à partir de variables

Au moment de la compilation, si les variables suivantes sont définies dans device/manufacturer/device_name/BoardConfig.mk :

# vendor compatibility matrix is named DEVICE_MATRIX_FILE for legacy reasons.
DEVICE_MATRIX_FILE := \
    device/manufacturer/device_name/vendor_compatibility_matrix.xml \
    device/manufacturer/device_name/vendor_compatibility_matrix_additional.xml

Les commandes suivantes sont ensuite exécutées (dans le système de compilation, modifiées pour omettre les détails d'implémentation) afin de générer des fichiers XML de matrice de compatibilité des appareils :

# vendor compatibility matrix; only when DEVICE_MATRIX_FILE is set
assemble_vintf \
    $(addprefix,-i ,$(DEVICE_MATRIX_FILE)) \
    -o $(TARGET_OUT_VENDOR)/etc/vintf/compatibility_matrix.xml

Lors de l'exécution, l'objet VINTF utilise la matrice de compatibilité du fournisseur comme matrice de compatibilité de l'appareil. Pour en savoir plus, consultez la matrice de compatibilité des appareils.

Exemple : Générer des fichiers XML manifestes de framework à partir de variables

Les variables suivantes peuvent être définies dans device/manufacturer/device_name/BoardConfig.mk :

# Device-specific system manifest is named DEVICE_FRAMEWORK_MANIFEST_FILE for legacy reasons
DEVICE_FRAMEWORK_MANIFEST_FILE := \
    device/manufacturer/device_name/device_system_manifest.xml

# Product manifest
PRODUCT_MANIFEST_FILES := \
    device/manufacturer/device_name/product_manifest.xml

Les commandes suivantes sont exécutées (dans le système de compilation, modifiées pour omettre les détails d'implémentation) afin de générer des fichiers XML de fichier manifeste du framework :

# system manifest
assemble_vintf \
    -i system/libhidl/vintfdata/manifest.xml \
    $(addprefix,-i ,$(DEVICE_FRAMEWORK_MANIFEST_FILE)) \
    -o $(TARGET_OUT)/etc/vintf/manifest.xml

# product manifest
assemble_vintf \
    $(addprefix,-i ,$(PRODUCT_MANIFEST_FILES)) \
    -o $(TARGET_OUT_PRODUCT)/etc/vintf/manifest.xml

Lors de l'exécution, l'objet VINTF combine le fichier manifeste système, les fragments de fichier manifeste système, le fichier manifeste du produit et les fragments de fichier manifeste du produit en tant que fichier manifeste du framework. Pour en savoir plus, consultez Manifeste du framework.

Exemple : Générer des fichiers XML de matrice de compatibilité du framework à partir de variables

Les variables suivantes peuvent être définies dans device/manufacturer/device_name/BoardConfig.mk pour définir le FCM du produit et le FCM système spécifique à l'appareil :

DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE := \
    device/manufacturer/device_name/product_compatibility_matrix.xml
# Device-specific system compatibility matrix is named
# DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE for legacy reasons.
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := \
    device/manufacturer/device_name/device_system_compatibility_matrix.xml

Le FCM system_ext doit être installé avec les modules Soong. Le FCM du produit peut également être installé avec des modules Soong. Ne définissez pas DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE si cette méthode est utilisée. De plus, plusieurs versions FCM de produit et versions FCM de system_ext peuvent être installées avec les modules Soong. Définissez les éléments suivants :

  • Définissez un module dans device/manufacturer/device_name/Android.bp. Par exemple (remplacez system_ext par product pour le produit FCM) :
    vintf_compatibility_matrix {
        name: "system_ext_compatibility_matrix.xml",
        stem: "compatibility_matrix.xml",
        system_ext_specific: true,
        // product_specific: true, // for product FCM
        srcs: [
            "system_ext_compatibility_matrix.xml",
        ],
    }
  • Installez le module sur device/manufacturer/device_name/device.mk. Exemple :
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

Les commandes suivantes sont exécutées (dans le système de compilation, modifiées pour omettre les détails d'implémentation) afin de générer des fichiers XML de matrice de compatibilité du framework :

# common system compatibility matrix for each FCM version
BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) \
POLICYVERS=$(POLICYVERS) \
BOARD_AVB_VBMETA_VERSION=$(BOARD_AVB_VBMETA_VERSION)
assemble_vintf \
    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml
    $(addprefix,-i ,$(DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE)) \
    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.device.xml

# framework compatibility matrixes at each FCM version
assemble_vintf
    -i hardware/interfaces/compatibility_matrices/compatibility_matrix.{level}.xml \
    -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.{level}.xml \
    --kernel=...

# product framework compatibility matrix; only when
# DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE is set or when the Soong module for
# product FCM is defined
assemble_vintf
    -i $(DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE)
    -o $(TARGET_OUT_PRODUCT)/etc/vintf/compatibility_matrix.xml

# system_ext framework compatibility matrix; only when the Soong module for
# system_ext FCM is defined
assemble_vintf
    -i <srcs for the soong module>
    -o $(TARGET_OUT_SYSTEM_EXT)/etc/vintf/compatibility_matrix.xml

Lors de l'exécution, l'objet VINTF combine un sous-ensemble de matrices de compatibilité système et de matrices de compatibilité produit en tant que matrice de compatibilité du framework. Pour en savoir plus, consultez la matrice de compatibilité des frameworks.

Exemple : Générer le fichier manifeste du fournisseur à partir de fragments

Plusieurs fragments de fichier manifeste du fournisseur peuvent être regroupés au moment de la compilation. Exemple :

<!-- device/manufacturer/device_name/manifest_common.xml -->
<manifest version="1.0" type="device">
    <!-- common HALs here -->
</manifest>
<!-- device/manufacturer/device_name/ir.xml -->
<manifest version="1.0" type="device">
    <hal>
        <name>android.hardware.ir</name>
        <version>1.0</version>
        <!-- other fields -->
    </hal>
</manifest>
# device/manufacturer/device_name/BoardConfig.mk
DEVICE_MANIFEST_FILE := device/manufacturer/device_name/manifest_common.xml
ifdef BOARD_ENABLE_IR
    DEVICE_MANIFEST_FILE += device/manufacturer/device_name/ir.xml
endif

assemble_vintf ajoute ensuite le HAL IR au fichier manifeste du fournisseur si BOARD_ENABLE_IR est défini, et l'omet si BOARD_ENABLE_IR n'est pas défini. Les commandes suivantes (modifiées pour omettre les détails d'implémentation) sont exécutées pour générer le fichier manifeste du fournisseur :

# if BOARD_ENABLE_IR is defined
BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
    -i device/manufacturer/device_name/manifest_common.xml:device/manufacturer/device_name/ir.xml \
    -o $(TARGET_OUT_VENDOR)/manifest.xml

# if BOARD_ENABLE_IR is not defined
BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \
    -i device/manufacturer/device_name/manifest_common.xml \
    -o $(TARGET_OUT_VENDOR)/manifest.xml

Pour plus d'informations, consultez :

assemble_vintf --help

Tests

Le projet platform/system/libvintf utilise GTest pour la sérialisation, la désérialisation et la vérification de la compatibilité.

Licences

  • tinyxml2 (external/tinyxml2) pour sérialiser/désérialiser l'objet vers/depuis XML. Licence de type BSD.
  • libselinux (external/selinux/libselinux) pour obtenir la version de policydb. Licence du domaine public.
  • libz (external/zlib) pour décompresser /proc/config.gz. Licence de type BSD.
  • Le projet libvintf utilise la licence Apache 2.0 (avec les fichiers MODULE_LICENSE_APACHE2 et NOTICE appropriés).