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 del proveedor consultable se dirige a
system/libvintf
Herramientas
Escribir a mano los archivos de manifiesto y las matrices de compatibilidad pueden ser difíciles. Usa el las siguientes herramientas para generar un manifiesto estándar o una matriz de compatibilidad para comenzar de la imagen de la que se originó.
LSHAL
LSHAL es una herramienta 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
Genera 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
hwservicemanager
y encontrado como HAL de transferencia,<transport>
se establece enhwbinder
- No se escribió ninguna versión de SELinux en el manifiesto. Se sugiere que el
se inserta a través de
assemble_vintf
como se explica a continuación. - Es posible que el archivo de manifiesto de la HAL que se generó no sea correcto. La atención humana es
necesario para corregir inconsistencias entre el manifiesto del dispositivo y lo que
vendor.img
proporciona.
ASSEMBLE_VINTF
assemble_vintf
es una herramienta del host que:
- Verifica que una matriz de compatibilidad o un archivo de manifiesto sea válido.
- Inyecta variables a las matrices de compatibilidad o manifiestos disponibles en la compilación. y genera un archivo nuevo que debe instalarse en el dispositivo.
- Comprueba la compatibilidad entre el archivo generado y el archivo doble.
- Si se proporciona un archivo de manifiesto, se puede generar un código estándar de compatibilidad estándar que sea compatible con el archivo de manifiesto.
Ejemplo: Genera compatibilidad de dispositivos. matrix a partir de un archivo de manifiesto de 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 se configuran en optional="true"
.
Ejemplo: Genera compatibilidad con el framework de 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 se configuran en optional="true"
.
Ejemplo: Genera archivos en formato XML de manifiesto del dispositivo a partir de variables
Durante el tiempo de compilación, si se cumplen las siguientes variables
definido 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, se modificaron para omitir la 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 manifiestos del proveedor y los manifiestos del ODM, como el manifiesto del dispositivo. Consulta Dispositivo para obtener más información.
Ejemplo: Genera archivos en formato XML de la matriz de compatibilidad de dispositivos a partir de variables
Durante el tiempo de compilación, si se cumplen las siguientes variables
definido 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, se modificaron para omitir la implementación ) para generar archivos en formato XML de la 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 el tiempo de ejecución, el objeto VINTF usa la matriz de compatibilidad del proveedor como de compatibilidad con dispositivos. Consulta Dispositivo matriz de compatibilidad para obtener más detalles.
Ejemplo: Genera archivos en formato 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 la 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, el manifiesto del sistema el manifiesto del producto y los fragmentos del manifiesto del producto como el manifiesto del framework. Consulta Marco de trabajo para obtener más información.
Ejemplo: Genera archivos en formato XML de la matriz de compatibilidad del marco de trabajo a partir de variables
Las siguientes variables se pueden definir en
device/manufacturer/device_name/BoardConfig.mk
para definir el producto FCM y
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 los módulos de Soong. Es posible que el producto FCM también esté instalado.
con módulos de Soong; no definas DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE
si este
. Además, es posible que se apliquen varias versiones de FCM del producto y system_ext
instalada con módulos de Soong.
Define lo siguiente:
-
Define un módulo en
device/manufacturer/device_name/Android.bp
. Por ejemplo (reemplaza system_ext con el producto para el 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", ], }
-
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 la implementación ) para generar archivos XML de la matriz de compatibilidad del marco de trabajo:
# 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 compatibilidad del sistema. y las de compatibilidad de productos como marco de compatibilidad de salida. Consulta Marco de trabajo matriz de compatibilidad para obtener más detalles.
Ejemplo: Cómo generar el manifiesto del proveedor a partir de fragmentos
Se pueden agrupar varios fragmentos de manifiesto del proveedor durante 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
BOARD_ENABLE_IR
está definido y se omite si
No se definió BOARD_ENABLE_IR
. Los siguientes comandos
(modificado 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 obtener detalles, consulta:
assemble_vintf --help
Prueba
El proyecto platform/system/libvintf
usa
GTest para
la serialización, deserialización y verificación de compatibilidad.
Licencias
tinyxml2
(external/tinyxml2) para serializar/deserializar el objeto en XML. Licencia similar a BSD.libselinux
(external/selinux/libselinux) para obtener policydb versión. Licencia de dominio públicolibz
(externo/zlib) para descomprimir/proc/config.gz
Licencia similar a BSD.- El proyecto
libvintf
usa una licencia Apache 2.0 (con las MODULE_LICENSE_APACHE2 y AVISO).