Weitere Ressourcen

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

Abfragbarer Codeort

Der Code für das abfragbare Schnittstellenobjekt des Anbieters geht an system/libvintf .

Handschriftliche Manifestdateien und Kompatibilitätsmatrizen können schwierig sein. Verwenden Sie die folgenden Tools, um eine Boilerplate-Manifest-/Kompatibilitätsmatrix zu erstellen, von der aus Sie beginnen 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. 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. In das Manifest wird keine SELinux-Version geschrieben. Es wird vorgeschlagen, dass das Element wie unten erklärt über assemble_vintf injiziert wird.
  3. Die generierte HAL-Manifestdatei ist möglicherweise ungenau. Menschliche Aufmerksamkeit ist erforderlich, um Inkonsistenzen zwischen dem Gerätemanifest und dem, was vendor.img tatsächlich bereitstellt, zu beheben.

MONTAGE_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 Erstellungszeit verfügbar sind, und generiert eine neue Datei, die auf dem Gerät installiert werden soll.
  3. Überprüft die Kompatibilität zwischen der generierten Datei und ihrem Dual.
  4. Wenn eine Manifestdatei angegeben ist, 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 Gerüst-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: XML-Dateien des Gerätemanifestes aus Variablen generieren

Zur Build-Zeit, wenn 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 ausgeführt (im Build-System, modifiziert, um Implementierungsdetails wegzulassen), 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 als Gerätemanifest. Einzelheiten finden Sie unter Gerätemanifest .

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

Zur Build-Zeit, wenn 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 ausgeführt (im Build-System, modifiziert, 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 Anbieterkompatibilitätsmatrix als Gerätekompatibilitätsmatrix. Einzelheiten finden Sie unter Gerätekompatibilitätsmatrix .

Beispiel: Generieren Sie Framework-Manifest-XML-Dateien aus Variablen

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, modifiziert, um Implementierungsdetails wegzulassen), um XML-Dateien des Framework-Manifests 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, Produktmanifest und Produktmanifestfragmente als Rahmenmanifest. Einzelheiten finden Sie unter Framework-Manifest .

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 das Produkt-FCM und das 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

Das system_ext FCM muss mit Soong-Modulen installiert werden. Das Produkt FCM kann auch mit Soong-Modulen installiert werden; Definieren 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 product 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 nach device/manufacturer/device_name/device.mk . Zum Beispiel:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml
    

Die folgenden Befehle werden ausgeführt (im Build-System, modifiziert, um Implementierungsdetails wegzulassen), um XML-Dateien für die 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 von Systemkompatibilitätsmatrizen und Produktkompatibilitätsmatrizen als Rahmenkompatibilitätsmatrix. Einzelheiten finden Sie in der Framework-Kompatibilitätsmatrix .

Beispiel: Generieren Sie das Lieferantenmanifest aus Fragmenten

Mehrere Herstellermanifestfragmente können zur Erstellungszeit 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 fügt 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 platform/system/libvintf Projekt verwendet GTest für die Serialisierung, Deserialisierung und Kompatibilitätsprüfung.

Lizenzierung

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