Risorse aggiuntive

Le seguenti risorse forniscono dettagli su posizioni del codice, strumenti, test e licenze.

Posizione del codice interrogabile

Il codice per l'oggetto dell'interfaccia del fornitore interrogabile viene inviato a system/libvintf.

I file manifest e le matrici di compatibilità per la scrittura a mano libera possono essere difficili da gestire. Utilizza i seguenti strumenti per generare un boilerplate manifest/matrice di compatibilità da utilizzare come punto di partenza.

LSHAL

LSHAL è uno strumento lato dispositivo che elenca tutte le HAL registrate per hwservicemanager e tutte le implementazioni passthrough disponibili (ad es. android.hardware.foo@1.0-impl.so) sul dispositivo. Può anche generare un file manifest del dispositivo in base all'elenco:

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

Nota:

  1. Se un pacchetto è registrato in hwservicemanager e trovato come HAL passthrough, <transport> viene impostato su hwbinder.
  2. Nel file manifest non è scritta alcuna versione SELinux. Si consiglia di iniettare l'elemento tramite assemble_vintf, come spiegato di seguito.
  3. Il file manifest HAL generato potrebbe non essere preciso. È necessaria l'attenzione di un essere umano per correggere le incoerenze tra il manifest del dispositivo e ciò che vendor.img fornisce effettivamente.

ASSEMBLE_VINTF

assemble_vintf è uno strumento lato host che:

  1. Verifica la validità di una matrice di compatibilità o di un file manifest.
  2. Inserisce variabili nei manifest/nelle matrici di compatibilità disponibili al momento della compilazione e genera un nuovo file da installare sul dispositivo.
  3. Controlla la compatibilità tra il file generato e il suo doppio.
  4. Se viene specificato un file manifest, facoltativamente genera una matrice di compatibilità boilerplate compatibile con il file manifest.

Esempio: genera la matrice di compatibilità del dispositivo da un file manifest del framework

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

Tieni presente che tutti gli HAL sono impostati su optional="true".

Esempio: genera una matrice di compatibilità del framework di base da un file manifest del dispositivo

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

Tieni presente che tutti gli HAL sono impostati su optional="true".

Esempio: genera file XML manifest del dispositivo dalle variabili

In fase di compilazione, se le seguenti variabili sono definite in 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

Vengono quindi eseguiti i seguenti comandi (nel sistema di compilazione, modificati per omettere i dettagli di implementazione) per generare i file XML manifest del dispositivo:

# 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

In fase di esecuzione, l'oggetto VINTF combina i manifest del fornitore e i manifest ODM come Il manifest del dispositivo. Per informazioni dettagliate, consulta File manifest del dispositivo.

Esempio: genera file XML della matrice di compatibilità dei dispositivi dalle variabili

In fase di compilazione, se le seguenti variabili sono definite in 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

Vengono quindi eseguiti i seguenti comandi (nel sistema di compilazione, modificati per omettere i dettagli di implementazione) per generare i file XML della matrice di compatibilità dei dispositivi:

# 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

In fase di runtime, l'oggetto VINTF utilizza la matrice di compatibilità del fornitore come matrice di compatibilità del dispositivo. Per maggiori dettagli, consulta la matrice di compatibilità dei dispositivi.

Esempio: genera file XML manifest del framework dalle variabili

Le seguenti variabili possono essere definite in 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

I seguenti comandi vengono eseguiti (nel sistema di compilazione, modificati per omettere i dettagli di implementazione) per generare file XML manifest del 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

In fase di esecuzione, l'oggetto VINTF combina il manifest di sistema, i frammenti del manifest di sistema, il manifest del prodotto e i frammenti del manifest del prodotto come manifest del framework. Per informazioni dettagliate, consulta il manifest del framework.

Esempio: genera file XML della matrice di compatibilità del framework dalle variabili

Le seguenti variabili possono essere definite in device/manufacturer/device_name/BoardConfig.mk per definire l'FCM del prodotto e l'FCM di sistema specifico per il dispositivo:

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

FCM system_ext deve essere installato con i moduli Soong. Il servizio FCM del prodotto può essere installato anche con i moduli Soong. Non definire DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE se viene utilizzato questo metodo. Inoltre, è possibile installare più versioni FCM del prodotto e versioni FCM di system_ext con i moduli Soong. Definisci quanto segue:

  • Definisci un modulo in device/manufacturer/device_name/Android.bp. Ad esempio (sostituire system_ext con product per il prodotto 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",
        ],
    }
  • Installa il modulo su device/manufacturer/device_name/device.mk. Ad esempio:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

I seguenti comandi vengono eseguiti (nel sistema di compilazione, modificati per omettere i dettagli di implementazione) per generare file XML della matrice di compatibilità del 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

In fase di esecuzione, l'oggetto VINTF combina un sottoinsieme di matrici di compatibilità del sistema e di matrici di compatibilità del prodotto come matrice di compatibilità del framework. Per maggiori dettagli, consulta la matrice di compatibilità del framework.

Esempio: Genera il manifest del fornitore dai frammenti

È possibile raggruppare più frammenti manifest del fornitore in fase di compilazione. Ad esempio:

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

Quindi, assemble_vintf aggiunge l'HAL IR al manifest del fornitore se BOARD_ENABLE_IR è definito e lo omette se BOARD_ENABLE_IR non è definito. Per generare il manifest del fornitore, vengono eseguiti i seguenti comandi (modificati per omettere i dettagli di implementazione):

# 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

Per informazioni dettagliate, vedere le sezioni:

assemble_vintf --help

Test

Il progetto platform/system/libvintf utilizza GTest per la serializzazione, la deserializzazione e il controllo della compatibilità.

Gestione licenze

  • tinyxml2 (esterno/tinyxml2) per la serializzazione/deserializzazione dell'oggetto in/da XML. Licenza simile a BSD.
  • libselinux (external/selinux/libselinux) per ottenere la versione di policydb. Licenza di dominio pubblico.
  • libz (esterno/zlib) per la decompressione /proc/config.gz. Licenza simile a BSD.
  • Il progetto libvintf utilizza la licenza Apache 2.0 (con i file MODULE_LICENSE_APACHE2 e NOTICE appropriati).