Google is committed to advancing racial equity for Black communities. See how.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Recursos adicionales

Los siguientes recursos proporcionan detalles sobre ubicaciones de código, herramientas, pruebas y licencias.

Ubicación del código consultable

El código del objeto de interfaz de proveedor consultable va a system/libvintf (consulte la API consultable ).

Escribir a mano archivos de manifiesto y matrices de compatibilidad puede resultar complicado. Utilice las siguientes herramientas para generar un manifiesto repetitivo / matriz de compatibilidad para comenzar.

LSHAL

LSHAL es una herramienta del lado del dispositivo que enumera todos los HAL registrados en hwservicemanager y todas las implementaciones de paso disponibles (por ejemplo, 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:

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

ASSEMBLE_VINTF

assemble_vintf es una herramienta del lado del host que:

  1. Verifica que una matriz de compatibilidad o un archivo de manifiesto sea válido.
  2. Inyecta variables a manifiestos / matrices de compatibilidad disponibles en el momento de la compilación y genera un nuevo archivo que debe instalarse en el dispositivo.
  3. Comprueba la compatibilidad entre el archivo generado y su dual.
  4. Si se proporciona un archivo de manifiesto, opcionalmente genera una matriz de compatibilidad estándar que es compatible con el archivo de manifiesto.

Ejemplo: generar una matriz de compatibilidad de dispositivos a partir de un archivo de manifiesto de marco

assemble_vintf -m --hals-only \
    -i system/libhidl/manifest.xml \
    -o device/manufacturer/device_name/compatibility_matrix.xml

Tenga en cuenta que todos los HAL se establecen en optional="true" .

Ejemplo: generar una matriz de compatibilidad del marco 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 todos los HAL se establecen 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, 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 tiempo de ejecución, el objeto VINTF combina los manifiestos del proveedor y los manifiestos ODM como el manifiesto del dispositivo. Consulte el 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 la 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

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 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 detalles.

Ejemplo: generar archivos XML de matriz de compatibilidad del 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 system_ext FCM 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 múltiples 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 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",
        ],
    }
    
  • Instale 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 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 de productos como la matriz de compatibilidad del marco. Consulte la matriz de compatibilidad del marco para obtener más detalles.

Ejemplo: generar el manifiesto del proveedor a partir de fragmentos

Se pueden agrupar varios fragmentos de manifiesto 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 el IR HAL al manifiesto del proveedor si BOARD_ENABLE_IR está definido, y lo omite si BOARD_ENABLE_IR no está definido. 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 obtener más detalles, consulte:

assemble_vintf --help

Pruebas

El proyecto platform/system/libvintf usa 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 similar a BSD.
  • libselinux (externo / selinux / libselinux) para obtener la versión policydb. Licencia de dominio público.
  • libz (externo / zlib) para descomprimir /proc/config.gz . Licencia similar a BSD.
  • libvintf proyecto libvintf usa la licencia Apache 2.0 (con los archivos MODULE_LICENSE_APACHE2 y NOTICE apropiados).