Recursos adicionales

En los siguientes recursos, se proporcionan detalles sobre las ubicaciones, las herramientas, las pruebas y las licencias de código.

Ubicación del código consultable

El código del objeto de interfaz de proveedor consultable va a system/libvintf.

Los archivos de manifiesto de escritura a mano y las matrices de compatibilidad pueden ser difíciles. Usa las siguientes herramientas para generar una matriz de compatibilidad o un manifiesto de plantilla desde la que comenzar.

LSHAL

LSHAL es una herramienta del dispositivo que enumera todos los HAL registrados 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 en función de la lista:

adb shell su 0 /system/bin/lshal --init-vintf

Ten en cuenta lo siguiente:

  1. Si un paquete está registrado en hwservicemanager y se encuentra como un HAL de transferencia, <transport> se establece en hwbinder.
  2. 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.
  3. Es posible que el archivo de manifiesto de HAL generado no sea preciso. Se requiere atención humana para corregir las inconsistencias entre el manifiesto del dispositivo y lo que vendor.img proporciona.

ASSEMBLE_VINTF

assemble_vintf es una herramienta del host que tiene las siguientes características:

  1. Verifica si una matriz de compatibilidad o un archivo de manifiesto son válidos.
  2. Inyecta 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.
  3. Verifica la compatibilidad entre el archivo generado y su duplicado.
  4. Si se proporciona un archivo de manifiesto, genera de manera opcional una matriz de compatibilidad de texto modelo que sea compatible con el archivo de manifiesto.

Ejemplo: Genera una matriz de compatibilidad del dispositivo 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 todos los HAL se configuran como optional="true".

Ejemplo: Genera una matriz de compatibilidad del 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 todos los HAL se configuran como optional="true".

Ejemplo: Genera archivos en formato XML de manifiesto de dispositivos a partir de variables

En el tiempo de 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, modificados para omitir detalles de implementación) para generar archivos en formato XML del 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

Durante el tiempo de ejecución, el objeto VINTF combina los manifiestos de proveedores y los manifiestos de ODM como el manifiesto del dispositivo. Consulta Manifiesto del dispositivo para obtener más información.

Ejemplo: Genera archivos XML de la matriz de compatibilidad de dispositivos a partir de variables

En el tiempo de 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 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 la matriz de compatibilidad del dispositivo. Consulta la matriz de compatibilidad de dispositivos para obtener más información.

Ejemplo: Genera archivos XML de manifiesto de 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 detalles de implementación) para generar archivos XML de manifiesto de 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

Durante 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 el manifiesto del framework para obtener más información.

Ejemplo: Genera archivos XML de la 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 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 product para FCM de productos):
    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 detalles de implementación) para generar archivos XML de la 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

Durante el tiempo de ejecución, el objeto VINTF combina un subconjunto de matrices de compatibilidad del sistema y matrices de compatibilidad de productos como la matriz de compatibilidad del framework. Consulta la matriz de compatibilidad del framework para obtener más información.

Ejemplo: Genera el manifiesto del proveedor a partir de fragmentos

Se pueden agrupar varios fragmentos de manifiestos de proveedores 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 el HAL de IR al manifiesto del proveedor si se define BOARD_ENABLE_IR y lo omite si no se define BOARD_ENABLE_IR. Para generar el manifiesto del proveedor, se ejecutan los siguientes comandos (modificados para omitir los detalles de la implementación):

# 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 (externo/tinyxml2) para serializar o deserializar el objeto desde o hacia XML. Licencia similar a BSD.
  • libselinux (external/selinux/libselinux) para obtener la versión de policydb. Licencia de dominio público.
  • libz (externo/zlib) para descomprimir /proc/config.gz. Licencia similar a BSD.
  • El proyecto libvintf usa la licencia Apache 2.0 (con los archivos MODULE_LICENSE_APACHE2 y NOTICE adecuados).