Weitere Ressourcen

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

Abfragbarer Codespeicherort

Der Code für das abfragbare Anbieterschnittstellenobjekt geht an system/libvintf .

Handschriftliche Manifestdateien und Kompatibilitätsmatrizen können schwierig sein. Verwenden Sie die folgenden Tools, um als Ausgangspunkt eine Boilerplate-Manifest-/Kompatibilitätsmatrix zu erstellen.

LSHAL

LSHAL ist ein geräteseitiges Tool, das alle bei hwservicemanager registrierten HALs und alle verfügbaren Passthrough-Implementierungen (z. B. android.hardware.foo@1.0-impl.so ) auf dem Gerät auflistet. Es kann auch eine Gerätemanifestdatei basierend auf der Liste generieren:

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

Beachte das Folgende:

  1. Wenn ein Paket sowohl bei hwservicemanager registriert ist 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 über assemble_vintf einzufügen, wie unten erläutert.
  3. Die generierte HAL-Manifestdatei ist möglicherweise ungenau. Es ist menschliches Eingreifen erforderlich, um Inkonsistenzen zwischen dem Gerätemanifest und dem, was vendor.img tatsächlich bereitstellt, zu beheben.

ASSEMBLE_VINTF

assemble_vintf ist ein hostseitiges Tool, das:

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

Beispiel: Generieren Sie eine Gerätekompatibilitätsmatrix aus einer Framework-Manifestdatei

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

Beachten Sie, dass alle HALs auf optional="true" gesetzt sind.

Beispiel: Generieren Sie eine Skelett-Framework-Kompatibilitätsmatrix aus einer Gerätemanifestdatei

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

Beachten Sie, dass alle HALs auf optional="true" gesetzt sind.

Beispiel: Generieren Sie Gerätemanifest-XML-Dateien aus Variablen

Wenn zur Erstellungszeit 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

Anschließend werden die folgenden Befehle ausgeführt (im Build-System, geändert, um Implementierungsdetails wegzulassen), um Gerätemanifest-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 Herstellermanifeste und ODM-Manifeste als Gerätemanifest. Weitere Informationen finden Sie unter Gerätemanifest .

Beispiel: Generieren Sie XML-Dateien mit einer Gerätekompatibilitätsmatrix aus Variablen

Wenn zur Erstellungszeit 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

Anschließend werden die folgenden Befehle ausgeführt (im Build-System, geändert, um Implementierungsdetails wegzulassen), 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 Herstellerkompatibilitätsmatrix als Gerätekompatibilitätsmatrix. Weitere Informationen finden Sie in der 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 wegzulassen), 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 Systemmanifest, die Systemmanifestfragmente, das Produktmanifest und die Produktmanifestfragmente als Framework-Manifest. Weitere Informationen finden Sie im Framework-Manifest .

Beispiel: Generieren Sie Framework-Kompatibilitätsmatrix-XML-Dateien aus Variablen

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. Das Produkt FCM kann auch mit Soong-Modulen installiert werden; Definieren Sie DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE nicht, wenn diese Methode verwendet wird. Darüber hinaus 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 das 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 ausgeführt (im Build-System, geändert, um Implementierungsdetails wegzulassen), 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 Systemkompatibilitätsmatrizen und Produktkompatibilitätsmatrizen als Framework-Kompatibilitätsmatrix. Weitere Informationen finden Sie in der Framework-Kompatibilitätsmatrix .

Beispiel: Generieren Sie das Anbietermanifest aus Fragmenten

Zur Erstellungszeit können mehrere Herstellermanifestfragmente gebündelt werden. Zum 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 assemble_vintf die IR-HAL zum Herstellermanifest 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 wegzulassen) 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

Einzelheiten finden Sie unter:

assemble_vintf --help

Testen

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

Lizenzierung

  • tinyxml2 (external/tinyxml2) zum Serialisieren/Deserialisieren des Objekts in/von XML. BSD-ähnliche Lizenz.
  • libselinux (external/selinux/libselinux) zum Abrufen der Policydb-Version. Public-Domain-Lizenz.
  • libz (external/zlib) zum Dekomprimieren /proc/config.gz . BSD-ähnliche Lizenz.
  • libvintf Projekt verwendet die Apache 2.0-Lizenz (mit den entsprechenden MODULE_LICENSE_APACHE2- und NOTICE-Dateien).