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
.
Strumenti
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:
- Se un pacchetto è registrato in
hwservicemanager
e trovato come HAL passthrough,<transport>
viene impostato suhwbinder
. - Nel file manifest non è scritta alcuna versione SELinux. Si consiglia di iniettare l'elemento tramite
assemble_vintf
, come spiegato di seguito. - 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:
- Verifica la validità di una matrice di compatibilità o di un file manifest.
- Inserisce variabili nei manifest/nelle matrici di compatibilità disponibili al momento della compilazione e genera un nuovo file da installare sul dispositivo.
- Controlla la compatibilità tra il file generato e il suo doppio.
- 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).