Los siguientes recursos proporcionan detalles sobre las ubicaciones del código, las herramientas, las pruebas y las licencias.
Ubicación del código consultable
El código del objeto de interfaz de proveedor consultable va a system/libvintf.
Herramientas
Escribir archivos de manifiesto y matrices de compatibilidad puede ser difícil. Usa las siguientes herramientas para generar una matriz de manifiesto o de compatibilidad de código estándar para comenzar.
LSHAL
LSHAL es una herramienta del dispositivo que muestra 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 del dispositivo basado en la lista:
adb shell su 0 /system/bin/lshal --init-vintf
Ten en cuenta lo siguiente:
- Si un paquete está registrado en
hwservicemanagery se encuentra como una HAL de transferencia,<transport>se establece enhwbinder. - No se escribe ninguna versión de SELinux en el manifiesto. Se sugiere que el elemento se inserte a través de
assemble_vintf, como se explica a continuación. - El archivo de manifiesto de HAL generado puede ser impreciso. Se requiere atención humana para corregir las incoherencias entre el manifiesto del dispositivo y lo que
vendor.imgproporciona en realidad.
ASSEMBLE_VINTF
assemble_vintf es una herramienta del host que hace lo siguiente:
- Verifica que una matriz de compatibilidad o un archivo de manifiesto sean válidos.
- Inserta variables en los manifiestos o las matrices de compatibilidad disponibles en el momento de la compilación y genera un archivo nuevo que se debe instalar en el dispositivo.
- Verifica la compatibilidad entre el archivo generado y su archivo doble.
- Si se proporciona un archivo de manifiesto, genera de forma opcional una matriz de compatibilidad de código estándar que sea compatible con el archivo de manifiesto.
Ejemplo: Genera una matriz de compatibilidad del dispositivo a partir de un archivo de manifiesto del framework
assemble_vintf -m --hals-only \
-i system/libhidl/manifest.xml \
-o device/manufacturer/device_name/compatibility_matrix.xml
Ten en cuenta que todas las HAL están configuradas como optional="true".
Ejemplo: Genera una matriz de compatibilidad del framework esqueleto a partir de un archivo de manifiesto del dispositivo
assemble_vintf -m --hals-only \
-i device/foo/bar/manifest.xml \
-o path/to/place/output/compatibility_matrix.xml
Ten en cuenta que todas las HAL están configuradas como optional="true".
Ejemplo: Genera archivos XML de manifiesto del dispositivo a partir de variables
En el tiempo de compilación, si se definen las siguientes variables 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, modificados 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 el tiempo de ejecución, el objeto VINTF combina los manifiestos del proveedor y los manifiestos de ODM como el manifiesto del dispositivo. Consulta Manifiesto del dispositivo para obtener más detalles.
Ejemplo: Genera archivos XML de matriz de compatibilidad del dispositivo a partir de variables
En el tiempo de compilación, si se definen las siguientes variables 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 del dispositivo:
# 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 el tiempo de ejecución, el objeto VINTF usa la matriz de compatibilidad del proveedor como la matriz de compatibilidad del dispositivo. Consulta Matriz de compatibilidad del dispositivo para obtener más detalles.
Ejemplo: Genera archivos XML de manifiesto del framework 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
Se ejecutan los siguientes comandos (en el sistema de compilación, modificados para omitir los detalles de implementación) para generar archivos XML de manifiesto 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
En el 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 framework. Consulta Manifiesto del framework para obtener más detalles.
Ejemplo: Genera archivos XML de matriz de compatibilidad del framework 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 de system_ext se debe instalar con módulos de Soong. El FCM del producto también se puede instalar con módulos de Soong; no definas DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE si se usa este método. Además, se pueden instalar varias versiones de FCM del producto y versiones de FCM de system_ext con módulos de Soong.
Define lo siguiente:
-
Define un módulo en
device/manufacturer/device_name/Android.bp. Por ejemplo (reemplaza system_ext por producto para el FCM del producto):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", ], }
-
Instala el módulo en
device/manufacturer/device_name/device.mk. Por ejemplo:PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml
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 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
En el tiempo de ejecución, el objeto VINTF combina un subconjunto de matrices de compatibilidad del sistema y matrices de compatibilidad del producto como la matriz de compatibilidad del framework. Consulta Matriz de compatibilidad del framework para obtener más detalles.
Ejemplo: Genera el manifiesto del proveedor a partir de fragmentos
Se pueden agrupar varios fragmentos de manifiesto del proveedor en el tiempo de 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 la HAL de IR al manifiesto del proveedor si se define BOARD_ENABLE_IR y la omite si no se define.BOARD_ENABLE_IR Se ejecutan los siguientes comandos (modificados para omitir los detalles de implementación) 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 obtener detalles, consulta:
assemble_vintf --help
Prueba
El proyecto platform/system/libvintf usa
GTest para
la serialización, la deserialización y la verificación de compatibilidad.
Licencias
tinyxml2(external/tinyxml2) para serializar o deserializar el objeto a XML o desde XML. Licencia similar a 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 similar a BSD.- El proyecto
libvintfusa la licencia Apache 2.0 (con los archivos MODULE_LICENSE_APACHE2 y NOTICE correspondientes).