Un objeto VINTF agrega datos del manifiesto del dispositivo y archivos de manifiesto del marco (XML). Ambos manifiestos comparten un formato, aunque no todos los elementos se aplican a ambos (para obtener detalles sobre el esquema, consulte Esquema del archivo de manifiesto ).
Manifiesto del dispositivo
El manifiesto del dispositivo (proporcionado por el dispositivo) consta del manifiesto del proveedor y el manifiesto del ODM.
- El manifiesto del proveedor especifica HAL, versiones de políticas de SELinux, etc. comunes a un SoC. Se recomienda colocarlo en el árbol de fuentes de Android en
device/ VENDOR / DEVICE /manifest.xml
, pero se pueden usar varios archivos de fragmentos. Para obtener más información, consulte Fragmentos de manifiesto y Generar DM a partir de fragmentos . - El manifiesto de ODM enumera las HAL específicas del producto en la partición de ODM . El objeto VINTF carga el manifiesto ODM en este orden:
- Si se define
SKU
(dondeSKU
es el valor de la propiedadro.boot.product.hardware.sku
),/odm/etc/vintf/manifest_ SKU .xml
-
/odm/etc/vintf/manifest.xml
- Si se define
SKU
,/odm/etc/manifest_ SKU .xml
-
/odm/etc/manifest.xml
- Si se define
- El manifiesto del proveedor enumera las HAL específicas del producto en la partición del proveedor. El objeto VINTF carga el manifiesto del proveedor en este orden:
- Si se define
SKU
(dondeSKU
es el valor de la propiedadro.boot.product.vendor.sku
),/vendor/etc/vintf/manifest_ SKU .xml
-
/vendor/etc/vintf/manifest.xml
- Si se define
- El objeto VINTF carga el manifiesto del dispositivo en este orden:
- Si existe el manifiesto del proveedor, combine lo siguiente:
- El manifiesto del proveedor
- Fragmentos de manifiesto de proveedor opcionales
- Manifiesto ODM opcional
- Fragmentos de manifiesto ODM opcionales
- De lo contrario, si existe el manifiesto ODM, combine el manifiesto ODM con los fragmentos opcionales del manifiesto ODM.
-
/vendor/manifest.xml
(heredado, sin fragmentos)
Tenga en cuenta que:
- En los dispositivos heredados, se utilizan el manifiesto del proveedor heredado y el manifiesto ODM. El manifiesto ODM puede anular por completo el manifiesto del proveedor heredado.
- En los dispositivos lanzados con Android 9, el manifiesto de ODM se combina con el manifiesto del proveedor.
- Al combinar una lista de manifiestos, los manifiestos que aparecen más adelante en la lista pueden anular las etiquetas en los manifiestos que aparecen antes en la lista, siempre que las etiquetas en el último manifiesto tengan el atributo
override="true"
. Por ejemplo, el manifiesto ODM puede anular algunas etiquetas<hal>
del manifiesto del proveedor. Consulte la documentación para laoverride
de atributos a continuación.
- Si existe el manifiesto del proveedor, combine lo siguiente:
Esta configuración permite que varios productos con la misma placa compartan la misma imagen de proveedor (que proporciona HAL comunes) pero que tengan diferentes imágenes ODM (que especifican HAL específicas del producto).
Este es un manifiesto de proveedor de ejemplo.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
Aquí hay un manifiesto ODM de ejemplo.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device"> <!-- camera 3.4 in vendor manifest is ignored --> <hal override="true"> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.5</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> </interface> </hal> <!-- NFC is declared to be disabled --> <hal override="true"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> </hal> <hal> <name>android.hardware.power</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> </manifest>
Aquí hay un manifiesto de dispositivo de ejemplo en un paquete OTA.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device" target-level="1"> <!-- hals ommited --> <kernel version="4.4.176"> <config> <key>CONFIG_ANDROID</key> <value>y</value> </config> <config> <key>CONFIG_ARM64</key> <value>y</value> </config> <!-- other configs ommited --> </kernel> </manifest>
Para obtener más detalles, consulte Desarrollo de manifiestos de dispositivos .
Manifiesto del marco
El archivo de manifiesto del marco consta del manifiesto del sistema, el manifiesto del producto y el manifiesto system_ext.
- El manifiesto del sistema (proporcionado por Google) se genera manualmente y se encuentra en el árbol de fuentes de Android en
/system/libhidl/manifest.xml
. - El manifiesto del producto (proporcionado por el dispositivo) enumera las HAL atendidas por los módulos instalados en la partición del producto.
- El manifiesto system_ext (proporcionado por el dispositivo) enumera lo siguiente:
- HAL atendidos por módulos instalados en la partición system_ext;
- versiones VNDK;
- Versión del SDK del sistema.
De forma similar al manifiesto del dispositivo, se pueden utilizar varios archivos de fragmentos. Para obtener más información, consulte Fragmentos de manifiesto .
Aquí hay un manifiesto de framework de ejemplo.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="framework"> <hal> <name>android.hidl.allocator</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <transport arch="32+64">passthrough</transport> <version>1.0</version> <interface> <name>IMapper</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.manager</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.frameworks.sensorservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <hal max-level="5"> <name>android.frameworks.schedulerservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISchedulingPolicyService</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </manifest>
Fragmentos manifiestos
En Android 10 y versiones posteriores, puede asociar una entrada de manifiesto con un módulo HAL en el sistema de compilación. Esto facilita la inclusión condicional del módulo HAL en el sistema de compilación.
Ejemplo
En su archivo Android.bp
o Android.mk
, agregue vintf_fragments
a cualquier módulo. Por ejemplo, puede modificar el módulo con su implementación de su HAL ( my.package.foo@1.0-service-bar
).
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
En un archivo llamado manifest_foo.xml
, cree el manifiesto para este módulo. En el momento de la compilación, este manifiesto se agrega al dispositivo. Agregar una entrada aquí es lo mismo que agregar una entrada en el manifiesto principal del dispositivo. Esto permite que los clientes usen la interfaz y permite que VTS identifique qué implementaciones de HAL están en el dispositivo. Todo lo que hace un manifiesto regular, este manifiesto también lo hace.
El siguiente ejemplo implementa android.hardware.foo@1.0::IFoo/default
, que se instala en la partición del vendor
o del odm
. Si está instalado en la partición system
, product
o system_ext
, use type framework
en lugar de type device
.
<manifest version="1.0" type="device"> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <fqname>@1.0::IFoo/default</fqname> </hal> </manifest>
Esquema de archivo de manifiesto
Esta sección describe el significado de estas etiquetas XML. Algunas etiquetas "obligatorias" pueden faltar en el archivo de origen en el árbol de fuentes de Android y pueden estar escritas por assemble_vintf
en el momento de la compilación. Las etiquetas requeridas deben estar presentes en los archivos correspondientes en el dispositivo.
-
?xml
- Opcional. Solo proporciona información al analizador XML.
-
manifest.version
- Requerido. Meta-versión de este manifiesto. Describe los elementos esperados en el manifiesto. No relacionado con la versión XML.
-
manifest.type
- Requerido. Tipo de este manifiesto. Tiene el
device
de valor para el archivo de manifiesto del dispositivo y elframework
para el archivo de manifiesto del marco. -
manifest.target-level
- Obligatorio para el manifiesto del dispositivo. Especifica la versión de la matriz de compatibilidad del marco (FCM) con la que este manifiesto de dispositivo está destinado a ser compatible. Esto también se llama la versión FCM de envío del dispositivo.
-
manifest.hal
- Opcional, se puede repetir. Un solo HAL (HIDL o nativo, como GL), según el atributo de
format
. -
manifest.hal.format
- Opcional. El valor puede ser uno de:
-
hidl
: HAL HIDL. Este es el valor predeterminado. -
aidl
: AIDL HAL . Solo es válido en el manifiesto meta-versión 2.0 y superior. -
native
: HAL nativos.
-
-
manifest.hal.max-level
- Opcional. Solo es válido en los manifiestos del marco. Si se establece, se deshabilitan las HAL con un nivel máximo inferior a la versión de FCM de destino en el manifiesto del marco.
-
manifest.hal.override
- Opcional. El valor puede ser uno de:
-
true
: anula otros elementos<hal>
con el mismo<name>
y versión principal. Si no hay<version>
o<fqname>
en este elemento<hal>
, entonces el elemento<hal>
declara que esta HAL está deshabilitada. -
false
: no anule otros elementos<hal>
con el mismo<name>
y versión principal.
-
-
manifest.hal.name
- Requerido. Nombre de paquete completo de la HAL. Múltiples entradas HAL pueden usar el mismo nombre. Ejemplos:
-
android.hardware.camera
(HIDL o AIDL HAL) -
GLES
(HAL nativo, solo requiere nombre)
-
-
manifest.hal.transport
- Requerido cuando
manifest.hal.format == "hidl"
. NO debe estar presente de lo contrario. Indica qué transporte se usa cuando se consulta una interfaz de este paquete desde el administrador de servicios. El valor puede ser uno de:-
hwbinder
: modo encuadernado -
passthrough
: modo de paso
-
- Opcional cuando
manifest.hal.format == "aidl"
. NO debe estar presente de lo contrario. Indica qué transporte se utiliza cuando una interfaz se sirve de forma remota. El valor debe ser:-
inet
: enchufe Inet
manifest.hal.transport.ip
ymanifest.hal.transport.port
para especificar más la información de conexión Inet. -
-
manifest.hal.transport.arch
- Obligatorio para
passthrough
y no debe estar presente parahwbinder
. Describe el valor de bits del servicio de transferencia que se proporciona. El valor puede ser uno de:-
32
: modo de 32 bits -
64
: modo de 64 bits -
32+64
: Ambos
-
-
manifest.hal.transport.ip
- Requerido para
inet
y NO debe estar presente de otra manera. Describe la dirección IP desde la que se sirve la interfaz remota. -
manifest.hal.transport.port
- Requerido para
inet
y NO debe estar presente de otra manera. Describe el puerto desde el que se sirve la interfaz remota. -
manifest.hal.version
- Opcional, se puede repetir. Una versión para las etiquetas
hal
en un manifiesto.
Para HIDL y HAL nativas, el formato esMAJOR . MINOR
. Para ver ejemplos, consultehardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
osystem/hardware/interfaces
.
HIDL y las HAL nativas pueden usar varios campos de versión, siempre que representen distintas versiones principales , y solo se proporciona una versión secundaria por versión principal. Por ejemplo, 3.1 y 3.2 no pueden coexistir, pero 1.0 y 3.4 sí. Esto se aplica a todos los elementoshal
con el mismo nombre, a menos queoverride="true"
. Los valores de<version>
no están asociados con<fqname>
porque<fqname>
lleva una versión.
Para las HAL de AIDL, la<version>
no debe estar presente en los dispositivos que ejecutan Android 11 y versiones anteriores.<version>
debe ser un entero único en dispositivos con Android 12 y superior. Debe haber como máximo una<version>
para cada tupla(package, interface, instance)
. Si no está presente, el valor predeterminado es1
. El valor de<version>
está asociado con todos los<fqname>
en el mismo<hal>
porque un<fqname>
no lleva una versión. -
manifest.hal.interface
- Requerido, se puede repetir sin duplicados. Indique una interfaz en el paquete que tenga un nombre de instancia. Puede haber múltiples elementos
<interface>
en un<hal>
; los nombres deben ser distintos. -
manifest.hal.interface.name
- Requerido. Nombre de la interfaz.
-
manifest.hal.interface.instance
- Se requiere, se puede repetir. Nombre de instancia de la interfaz. Puede tener varias instancias para una interfaz, pero no elementos
<instance>
duplicados. -
manifest.hal.fqname
- Opcional, se puede repetir. Una forma alternativa de especificar una instancia para HAL con el nombre
manifest.hal.name
.- Para HAL HIDL, el formato es
@ MAJOR . MINOR :: INTERFACE / INSTANCE
. - Para AIDL HALs, el formato es
INTERFACE / INSTANCE
.
- Para HAL HIDL, el formato es
-
manifest.sepolicy
- Requerido. Contiene todas las entradas relacionadas con sepolicy.
-
manifest.sepolicy.version
- Obligatorio para el manifiesto del dispositivo. Declara la versión de SELinux. Tiene el formato
SDK_INT . PLAT_INT
. -
manifest.vendor-ndk
- Requerido, puede repetir; necesario para el manifiesto del marco. No debe estar presente en el manifiesto del dispositivo. Varias entradas de
<vendor-ndk>
deben tener<version>
diferentes. Describe un conjunto de instantáneas de VNDK proporcionadas por el marco. -
manifest.vendor-ndk.version
- Requerido. Este es un número entero positivo que representa la versión de la instantánea de VNDK.
-
manifest.vendor-ndk.library
- Opcional, se puede repetir, sin duplicados. Describe un conjunto de bibliotecas de VNDK proporcionadas por el marco para esta instantánea del proveedor de VNDK. El valor es el nombre de archivo de una biblioteca, por ejemplo,
libjpeg.so
, incluido el prefijolib
y el sufijo.so
. No se permiten componentes de ruta. -
manifest.system-sdk.version
- Opcional, se puede repetir, sin duplicados; utilizado solo por el manifiesto del marco. Describe un conjunto de versiones del SDK del sistema proporcionadas por el marco a las aplicaciones de los proveedores.
-
manifest.kernel
- Opcional. Describe información estática sobre el kernel.
-
manifest.kernel.target-level
- Opcional. Describe la rama del núcleo. Su valor predeterminado es
manifest.target-level
si no está presente. Debe ser mayor o igual quemanifest.target-level
. Consulte las reglas de coincidencia del núcleo para obtener más detalles.