Los siguientes recursos brindan detalles sobre ubicaciones de códigos, herramientas, pruebas y licencias.
Ubicación del código consultable
El código para el objeto consultable de la interfaz del proveedor va a system/libvintf
(consulte la API consultable ).
Instrumentos
La escritura a mano de archivos de manifiesto y matrices de compatibilidad puede ser difícil. Utilice las siguientes herramientas para generar una matriz de compatibilidad/manifiesto repetitivo para comenzar.
LSHAL
LSHAL es una herramienta del lado del dispositivo que enumera todas las HAL registradas en hwservicemanager
y todas las implementaciones de transferencia disponibles (p. ej., android.hardware.foo@1.0-impl.so
) en el dispositivo. También puede generar un archivo de manifiesto de dispositivo basado en la lista:
adb shell su 0 /system/bin/lshal --init-vintf
Tenga en cuenta lo siguiente:
- Si un paquete está registrado en
hwservicemanager
y se encuentra como HAL de paso,<transport>
se establece enhwbinder
. - No se escribe ninguna versión de SELinux en el manifiesto. Se sugiere que el elemento se inyecte a través de
assemble_vintf
como se explica a continuación. - El archivo de manifiesto HAL generado puede ser inexacto. Se requiere la atención humana para corregir las incoherencias entre el manifiesto del dispositivo y lo que realmente proporciona
vendor.img
.
ENSAMBLAJE_VINTF
assemble_vintf
es una herramienta del lado del host que:
- Verifica que una matriz de compatibilidad o un archivo de manifiesto sean válidos.
- Inyecta variables en manifiestos/matrices de compatibilidad disponibles en el momento de la compilación y genera un nuevo archivo que debe instalarse en el dispositivo.
- Comprueba la compatibilidad entre el archivo generado y su dual.
- Si se proporciona un archivo de manifiesto, opcionalmente genera una matriz de compatibilidad repetitiva que es compatible con el archivo de manifiesto.
Ejemplo: Generar matriz de compatibilidad de dispositivos a partir de un archivo de manifiesto del marco
assemble_vintf -m --hals-only \ -i system/libhidl/manifest.xml \ -o device/manufacturer/device_name/compatibility_matrix.xml
Tenga en cuenta que todas las HAL están configuradas en optional="true"
.
Ejemplo: Generar una matriz de compatibilidad de marco de esqueleto a partir de un archivo de manifiesto de dispositivo
assemble_vintf -m --hals-only \ -i device/foo/bar/manifest.xml \ -o path/to/place/output/compatibility_matrix.xml
Tenga en cuenta que todas las HAL están configuradas en optional="true"
.
Ejemplo: generar archivos XML de manifiesto de dispositivo a partir de variables
En el momento de la compilación, si las siguientes variables están definidas en 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
Luego, se ejecutan los siguientes comandos (en el sistema de compilación, modificado para omitir los detalles de implementación) para generar archivos XML de manifiesto 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
En tiempo de ejecución, el objeto VINTF combina manifiestos de proveedores y manifiestos de ODM como el manifiesto del dispositivo. Consulte Manifiesto del dispositivo para obtener más detalles.
Ejemplo: generar archivos XML de matriz de compatibilidad de dispositivos a partir de variables
En el momento de la compilación, si las siguientes variables están definidas en 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
Luego, se ejecutan los siguientes comandos (en el sistema de compilación, modificados para omitir los detalles de implementación) para generar archivos XML de matriz de compatibilidad de dispositivos:
# 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
En tiempo de ejecución, el objeto VINTF utiliza la matriz de compatibilidad del proveedor como matriz de compatibilidad del dispositivo. Consulte Matriz de compatibilidad de dispositivos para obtener más detalles.
Ejemplo: generar archivos XML de manifiesto de marco a partir de variables
Las siguientes variables se pueden definir en 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
Los siguientes comandos se ejecutan (en el sistema de compilación, modificados para omitir los detalles de implementación) para generar archivos XML de manifiesto del marco:
# 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
En tiempo de ejecución, el objeto VINTF combina el manifiesto del sistema, los fragmentos del manifiesto del sistema, el manifiesto del producto y los fragmentos del manifiesto del producto como el manifiesto del marco. Consulte el manifiesto de Framework para obtener más información.
Ejemplo: generar archivos XML de matriz de compatibilidad de marco a partir de variables
Las siguientes variables se pueden definir en device/manufacturer/device_name/BoardConfig.mk
para definir el FCM del producto y el FCM del sistema específico 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
El FCM system_ext debe instalarse con módulos Soong. El producto FCM también se puede instalar con módulos Soong; no defina DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE
si se utiliza este método. Además, se pueden instalar varias versiones de FCM de productos y versiones de system_ext FCM con módulos Soong. Defina lo siguiente:
- Defina un módulo en
device/manufacturer/device_name/Android.bp
. Por ejemplo (reemplace system_ext con producto por producto 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", ], }
- Instale el módulo en
device/manufacturer/device_name/device.mk
. Por ejemplo:PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml
Los siguientes comandos se ejecutan (en el sistema de compilación, modificados para omitir los detalles de implementación) para generar archivos XML de matriz de compatibilidad de marco:
# 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
En tiempo de ejecución, el objeto VINTF combina un subconjunto de matrices de compatibilidad del sistema y matrices de compatibilidad del producto como matriz de compatibilidad del marco. Consulte la matriz de compatibilidad de Framework para obtener más detalles.
Ejemplo: generar el manifiesto del proveedor a partir de fragmentos
Se pueden agrupar varios fragmentos de manifiestos de proveedores en el momento de la compilación. Por ejemplo:
<!-- 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
Luego, assemble_vintf
agrega IR HAL al manifiesto del proveedor si se define BOARD_ENABLE_IR
y lo omite si no se define BOARD_ENABLE_IR
. Los siguientes comandos (modificados para omitir los detalles de implementación) se ejecutan para generar el manifiesto del proveedor:
# 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
Para más detalles, consulte:
assemble_vintf --help
Pruebas
El proyecto platform/system/libvintf
utiliza GTest para la serialización, deserialización y verificación de compatibilidad.
Licencia
-
tinyxml2
(externo/tinyxml2) para serializar/deserializar el objeto a/desde XML. Licencia tipo BSD. -
libselinux
(external/selinux/libselinux) para obtener la versión de policydb. Licencia de dominio público. -
libz
(external/zlib) para descomprimir/proc/config.gz
. Licencia tipo BSD. - El proyecto
libvintf
usa la licencia Apache 2.0 (con los archivos MODULE_LICENSE_APACHE2 y NOTICE apropiados).