Zusätzliche Ressourcen

In den folgenden Ressourcen finden Sie Details zu Codespeicherorten, Tools, Tests und Lizenzierung.

Abfragbarer Codespeicherort

Der Code für das abfragbare Anbieter-Interface-Objekt wird an system/libvintf gesendet.

Manifestdateien und Kompatibilitätsmatrizen per Hand zu schreiben, kann schwierig sein. Mit den folgenden Tools können Sie ein Manifest-/Kompatibilitäts-Muster generieren, das Sie als Ausgangspunkt verwenden 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 eine Gerätemanifestdatei basierend auf der Liste generiert werden:

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

Beachten Sie Folgendes:

  1. Wenn ein Paket sowohl bei hwservicemanager registriert als auch als Passthrough-HAL gefunden wird, wird <transport> auf hwbinder gesetzt.
  2. Es ist keine SELinux-Version in das Manifest geschrieben. Wir empfehlen, das Element wie unten beschrieben über assemble_vintf einzuschleusen.
  3. Die generierte HAL-Manifestdatei ist möglicherweise ungenau. Inkonsistenzen zwischen dem Gerätemanifest und den tatsächlichen Angaben von vendor.img müssen manuell behoben werden.

ASSEMBLE_VINTF

assemble_vintf ist ein hostseitiges Tool, das:

  1. Prüft, ob eine Kompatibilitätsmatrix oder Manifestdatei gültig ist.
  2. Fügt Manifesten/Kompatibilitätsmatrizen, die zum Zeitpunkt des Builds verfügbar sind, Variablen hinzu und generiert eine neue Datei, die auf dem Gerät installiert werden soll.
  3. Prüft die Kompatibilität zwischen der generierten Datei und ihrem Dual.
  4. Wenn eine Manifestdatei angegeben ist, wird optional eine Vorlage für eine Kompatibilitätsmatrix generiert, 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" eingestellt.

Beispiel:Eine Skeleton-Framework-Kompatibilitätsmatrix aus einer Gerätemanifestdatei 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" eingestellt.

Beispiel:XML-Dateien für Gerätemanifeste aus Variablen generieren

Wenn die folgenden Variablen zum Zeitpunkt des Builds 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

Anschließend werden die folgenden Befehle im Build-System ausgeführt (geändert, um Implementierungsdetails auszuschließen), um XML-Dateien für das Gerätemanifest 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 Anbietermanifeste und ODM-Manifeste zum Gerätemanifest. Weitere Informationen finden Sie unter Gerätemanifest.

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

Wenn die folgenden Variablen zum Zeitpunkt des Builds 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

Anschließend werden die folgenden Befehle im Build-System ausgeführt (geändert, um Implementierungsdetails auszuschließen), um XML-Dateien für die Gerätekompatibilitätsmatrix 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 Anbieterkompatibilitätsmatrix als Gerätekompatibilitätsmatrix. Weitere Informationen finden Sie in der Kompatibilitätsmatrix für Geräte.

Beispiel:XML-Dateien für das Framework-Manifest 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 im Build-System ausgeführt (um Implementierungsdetails zu entfernen), um XML-Manifestdateien für das Framework 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 Systemmanifest, Systemmanifestfragmente, das Produktmanifest und Produktmanifestfragmente zum Framework-Manifest. Weitere Informationen finden Sie im Manifest des Frameworks.

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

Die folgenden Variablen können in device/manufacturer/device_name/BoardConfig.mk definiert werden, um den Produkt-FCM und den gerätespezifischen 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

Der system_ext-FCM muss mit Soong-Modulen installiert werden. Der 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 FCM-Versionen für Produkte 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 den 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 unter device/manufacturer/device_name/device.mk. Beispiel:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

Die folgenden Befehle werden im Build-System ausgeführt (geändert, um Implementierungsdetails auszuschließen), um XML-Dateien der Framework-Kompatibilitätsmatrix 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 der System- und Produktkompatibilitätsmatrizen als Framework-Kompatibilitätsmatrix. Weitere Informationen finden Sie in der Kompatibilitätsmatrix für das Framework.

Beispiel:Anbietermanifest aus Fragmenten generieren

Mehrere Manifestfragmente von Anbietern können zum Zeitpunkt der Erstellung 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

Anschließend fügt assemble_vintf die IR HAL dem Anbietermanifest hinzu, wenn BOARD_ENABLE_IR definiert ist, und lässt sie aus, wenn BOARD_ENABLE_IR nicht definiert ist. Die folgenden Befehle (geändert, um Implementierungsdetails auszuschließen) werden ausgeführt, um das Anbietermanifest 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 erhalten Sie hier:

assemble_vintf --help

Testen

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

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 urheberrechtsfreie Inhalte.
  • libz (external/zlib) zum Dekomprimieren von /proc/config.gz. BSD-ähnliche Lizenz.
  • Für das libvintf-Projekt wird die Apache 2.0-Lizenz mit den entsprechenden Dateien „MODULE_LICENSE_APACHE2“ und „NOTICE“ verwendet.