Risorse aggiuntive

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

Posizione del codice interrogabile

Il codice dell'oggetto dell'interfaccia del fornitore interrogabile va a system/libvintf.

I file manifest della scrittura a mano e le matrici di compatibilità possono essere difficili da gestire. Utilizza i seguenti strumenti per generare un manifest/una matrice di compatibilità standard da cui iniziare.

LSHAL

LSHAL è uno strumento lato dispositivo che elenca tutti gli HAL registrati in 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

Tieni presente quanto segue:

  1. Se un pacchetto è registrato sia su hwservicemanager sia trovato come HAL passthrough, <transport> è impostato su hwbinder.
  2. Nessuna versione di SELinux è scritta nel manifest. Ti consigliamo di inserire l'elemento tramite assemble_vintf come spiegato di seguito.
  3. Il file manifest HAL generato potrebbe essere impreciso. È necessaria l'attenzione umana per correggere le incongruenze tra il manifest del dispositivo e ciò che vendor.img fornisce effettivamente.

ASSEMBLE_VINTF

assemble_vintf è uno strumento lato host che:

  1. Verifica che una matrice di compatibilità o un file manifest sia valido.
  2. Inserisce le variabili nei manifest/nelle matrici di compatibilità disponibili al momento della build e genera un nuovo file da installare sul dispositivo.
  3. Verifica la compatibilità tra il file generato e la sua versione per persone con disabilità.
  4. Se viene fornito un file manifest, genera facoltativamente una matrice di compatibilità standard compatibile con il file manifest.

Esempio: genera una matrice di compatibilità dei dispositivi 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 i livelli di astrazione hardware sono impostati su optional="true".

Esempio: genera una matrice di compatibilità del framework scheletro 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 i livelli di astrazione hardware sono impostati su optional="true".

Esempio: genera file XML manifest del dispositivo dalle variabili

Al momento della creazione della build, 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 del 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 runtime, l'oggetto VINTF combina i manifest del fornitore e dell'ODM come manifest del dispositivo. Per ulteriori dettagli, consulta il manifest del dispositivo.

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

Al momento della creazione della build, 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

Per generare i file XML del manifest del framework vengono eseguiti i seguenti comandi (nel sistema di compilazione, modificati per omettere i dettagli di implementazione):

# 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 runtime, 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 i dettagli, 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 FCM prodotto e FCM di sistema specifico del 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

L'FCM system_ext deve essere installato con i moduli Soong. L'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 (sostituisci system_ext con product per FCM prodotto):
    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 in device/manufacturer/device_name/device.mk. Ad esempio:
    PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml

Per generare i file XML della matrice di compatibilità del framework, vengono eseguiti i seguenti comandi (nel sistema di compilazione, modificati per omettere i dettagli di implementazione):

# 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 runtime, l'oggetto VINTF combina un sottoinsieme di matrici di compatibilità del sistema e matrici di compatibilità del prodotto come matrice di compatibilità del framework. Per maggiori dettagli, consulta la matrice di compatibilità dei framework.

Esempio: Genera il manifest del fornitore dai frammenti

È possibile raggruppare più frammenti di 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

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

# 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 di compatibilità.

Licenze

  • tinyxml2 (external/tinyxml2) per la serializzazione/deserializzazione dell'oggetto da/a XML. Licenza simile a BSD.
  • libselinux (external/selinux/libselinux) per ottenere la versione di policydb. Licenza di pubblico dominio.
  • libz (external/zlib) for decompressing /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).