Weitere Ressourcen

Die folgenden Ressourcen enthalten Details zu Codespeicherorten, Tools, Tests und Lizenzierung.

Abfragbarer Codespeicherort

Der Code für das abfragbare Vendor-Schnittstellenobjekt befindet sich unter system/libvintf.

Das manuelle Erstellen von Manifestdateien und Kompatibilitätsmatrizen kann schwierig sein. Verwenden Sie die folgenden Tools, um eine Boilerplate-Manifestdatei oder ‑Kompatibilitätsmatrix zu generieren, von der aus Sie starten können.

LSHAL

LSHAL ist ein geräteseitiges Tool, das alle registrierten HALs für hwservicemanager und alle verfügbaren Passthrough-Implementierungen (z.B. android.hardware.foo@1.0-impl.so) auf dem Gerät auflistet. Außerdem kann es basierend auf der Liste eine Geräte-Manifestdatei generieren:

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

Wichtige Hinweise:

  1. Wenn ein Paket sowohl bei hwservicemanager registriert als auch als Passthrough-HAL gefunden wird, wird <transport> auf hwbinder gesetzt.
  2. Es wird keine SELinux-Version in das Manifest geschrieben. Es wird empfohlen, das Element wie unten beschrieben über assemble_vintf einzufügen.
  3. Die generierte HAL-Manifestdatei ist möglicherweise nicht korrekt. Es ist eine manuelle Überprüfung erforderlich, um Inkonsistenzen zwischen dem Geräte-Manifest und dem, was vendor.img tatsächlich bietet, zu beheben.

ASSEMBLE_VINTF

assemble_vintf ist ein hostseitiges Tool, mit dem Folgendes möglich ist:

  1. Überprüfen, ob eine Kompatibilitätsmatrix oder Manifestdatei gültig ist.
  2. Variablen in Manifeste/Kompatibilitätsmatrizen einfügen, die zur Build-Zeit verfügbar sind, und eine neue Datei generieren, die auf dem Gerät installiert werden soll.
  3. Kompatibilität zwischen der generierten Datei und ihrem Dual überprüfen.
  4. Wenn eine Manifestdatei angegeben ist, optional eine Boilerplate-Kompatibilitätsmatrix generieren, die mit der Manifestdatei kompatibel ist.

Beispiel:Gerätekompatibilitätsmatrix aus einer Framework-Manifestdatei generieren

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

Alle HALs sind auf optional="true" gesetzt.

Beispiel:Skelett-Framework-Kompatibilitätsmatrix aus einer Geräte-Manifestdatei generieren

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

Alle HALs sind auf optional="true" gesetzt.

Beispiel:Geräte-Manifest-XML-Dateien aus Variablen generieren

Wenn zur Build-Zeit die folgenden Variablen in device/manufacturer/device_name/BoardConfig.mk definiert sind:

# 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

Dann werden die folgenden Befehle (im Build-System, geändert, um Implementierungsdetails auszulassen) ausgeführt, um Geräte-Manifest-XML-Dateien zu generieren:

# 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

Zur Laufzeit kombiniert das VINTF-Objekt Vendor-Manifeste und ODM-Manifeste als Geräte-Manifest. Weitere Informationen finden Sie unter Geräte Manifest.

Beispiel:Gerätekompatibilitätsmatrix-XML-Dateien aus Variablen generieren

Wenn zur Build-Zeit die folgenden Variablen in device/manufacturer/device_name/BoardConfig.mk definiert sind:

# 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

Dann werden die folgenden Befehle (im Build-System, geändert, um Implementierungsdetails auszulassen) ausgeführt, um Gerätekompatibilitätsmatrix-XML-Dateien zu generieren:

# 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

Zur Laufzeit verwendet das VINTF-Objekt die Vendor-Kompatibilitätsmatrix als Gerätekompatibilitätsmatrix. Weitere Informationen finden Sie unter Gerätekompatibilitätsmatrix.

Beispiel:Framework-Manifest-XML-Dateien aus Variablen generieren

Die folgenden Variablen können in device/manufacturer/device_name/BoardConfig.mk definiert werden:

# 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

Die folgenden Befehle werden ausgeführt (im Build-System, geändert, um Implementierungsdetails auszulassen), um Framework-Manifest-XML-Dateien zu generieren:

# 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

Zur Laufzeit kombiniert das VINTF-Objekt das System-Manifest, System-Manifestfragmente, Produkt-Manifest und Produkt-Manifestfragmente als Framework-Manifest. Weitere Informationen finden Sie unter Framework manifest.

Beispiel:Framework-Kompatibilitätsmatrix-XML-Dateien aus Variablen generieren

Die folgenden Variablen können in device/manufacturer/device_name/BoardConfig.mk definiert werden, um die Produkt-FCM und die gerätespezifische System-FCM zu definieren:

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

Die system_ext-FCM muss mit Soong-Modulen installiert werden. Die Produkt-FCM kann auch mit Soong-Modulen installiert werden. Definieren Sie DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE nicht, wenn diese Methode verwendet wird. Außerdem können mehrere Produkt-FCM-Versionen und system_ext-FCM-Versionen mit Soong-Modulen installiert werden. Definieren Sie Folgendes:

  • Definieren Sie ein Modul in device/manufacturer/device_name/Android.bp. Beispiel: Ersetzen Sie „system_ext“ durch „product“ für die Produkt-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",
        ],
    }
  • Installieren Sie das Modul in device/manufacturer/device_name/device.mk. Beispiel:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

Die folgenden Befehle werden ausgeführt (im Build-System, geändert, um Implementierungsdetails auszulassen), um Framework-Kompatibilitätsmatrix-XML-Dateien zu generieren:

# 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

Zur Laufzeit kombiniert das VINTF-Objekt eine Teilmenge von System-Kompatibilitätsmatrizen und Produkt-Kompatibilitätsmatrizen als Framework-Kompatibilitätsmatrix. Weitere Informationen finden Sie unter Framework Kompatibilitätsmatrix.

Beispiel:Vendor-Manifest aus Fragmenten generieren

Mehrere Vendor-Manifestfragmente können zur Build-Zeit gebündelt werden. Beispiel:

<!-- 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

Dann fügt assemble_vintf die IR-HAL dem Vendor-Manifest hinzu, wenn BOARD_ENABLE_IR definiert ist, und lässt sie weg, wenn BOARD_ENABLE_IR nicht definiert ist. Die folgenden Befehle (geändert, um Implementierungsdetails auszulassen) werden ausgeführt, um das Vendor-Manifest zu generieren:

# 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

Weitere Informationen finden Sie unter:

assemble_vintf --help

Test

Das platform/system/libvintf Projekt verwendet GTest für die Serialisierung, Deserialisierung und Kompatibilitätsprüfung.

Lizenzierung

  • tinyxml2 (external/tinyxml2) zum Serialisieren/Deserialisieren des Objekts in/aus XML. BSD-ähnliche Lizenz.
  • libselinux (external/selinux/libselinux) zum Abrufen der policydb-Version. Lizenz für gemeinfreie Inhalte.
  • libz (external/zlib) zum Dekomprimieren von /proc/config.gz. BSD-ähnliche Lizenz.
  • Das Projekt libvintf verwendet die Apache 2.0-Lizenz (mit entsprechenden MODULE_LICENSE_APACHE2- und NOTICE-Dateien).