Un objeto VINTF agrega datos desde device Archivos de manifiesto y manifiesto del framework (XML). Ambas opciones los manifiestos comparten un formato, aunque no todos los elementos se aplican a ambos (para obtener más información en el esquema, consulta Esquema del archivo de manifiesto).
Manifiesto del dispositivo
El manifiesto del dispositivo (proporcionado por el dispositivo) consta del manifiesto del proveedor. y el manifiesto de ODM.
- El manifiesto del proveedor especifica las HAL, las versiones de políticas de SELinux, etc. comunes a un SoC. Integra
se recomienda colocarlo en el árbol de fuentes de Android en
device/VENDOR/DEVICE/manifest.xml
, pero varios fragmentos se pueden usar archivos adjuntos. Para obtener más información, consulta Fragmentos del manifiesto y Generar MD a partir de fragmentos - El manifiesto de ODM incluye HALs 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 HALs 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, combina lo siguiente:
- El manifiesto del proveedor
- Fragmentos opcionales del manifiesto del proveedor
- Manifiesto de ODM opcional
- Fragmentos opcionales del manifiesto de ODM
- De lo contrario, si el manifiesto de ODM existe, combinalo con el ODM opcional. fragmentos del manifiesto.
/vendor/manifest.xml
(heredado, sin fragmentos)- Por último, combina los fragmentos del manifiesto de los APEX de cualquier proveedor.
Ten en cuenta lo siguiente:
- En los dispositivos heredados, se usan el manifiesto del proveedor heredado y el manifiesto del ODM. El El manifiesto del ODM puede anular por completo el manifiesto del proveedor heredado.
- En los dispositivos que se lanzan con Android 9, el manifiesto ODM se combina con el manifiesto del proveedor.
- Cuando se combina una lista de manifiestos, es posible que los que aparezcan más adelante en la lista anulen
etiquetas en los manifiestos que aparecen antes en la lista, siempre que las etiquetas de la
tienen el atributo
override="true"
. Por ejemplo, el manifiesto ODM puede anular algunas etiquetas<hal>
del manifiesto del proveedor Consulta la documentación para el atributooverride
a continuación.
- Si existe el manifiesto del proveedor, combina lo siguiente:
Esta configuración permite que varios productos con la misma placa compartan la misma imagen del proveedor (que proporciona HAL comunes), pero tiene imágenes de ODM diferentes (que especificar las HALs específicas del producto).
Este es un ejemplo de manifiesto del proveedor.
<?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>
Este es un ejemplo de manifiesto de ODM.
<?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>
El siguiente es un ejemplo de manifiesto de dispositivo en un paquete inalámbrico.
<?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 información detallada, consulta el Manifiesto del dispositivo. Desarrollo.
Manifiesto del framework
El archivo de manifiesto del framework consta del manifiesto del sistema, el manifiesto del producto y las system_ext.
-
El manifiesto del sistema (proporcionado por Google) se genera manualmente.
se encuentran en el árbol de fuentes de Android
/system/libhidl/manifest.xml
- El manifiesto del producto (proporcionado por el dispositivo) enumera las HALs que entregan los módulos instalados en el en cada partición de producto.
-
El manifiesto system_ext (proporcionado por el dispositivo) enumera lo siguiente:
- HALs atendidas por módulos instalados en la partición system_ext
- Versiones de VNDK;
- Versión del SDK del sistema.
De manera similar al manifiesto del dispositivo, se pueden usar varios archivos de fragmentos. Para obtener más información, consulta Fragmentos del manifiesto.
Este es un ejemplo de manifiesto de un framework.
<?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 del manifiesto
En Android 10 y versiones posteriores, puedes asociar un manifiesto HAL con un módulo de HAL en el sistema de compilación. Esto hace que sea más fácil incluir condicionalmente el módulo HAL en el sistema de compilación.
Ejemplo
En el archivo Android.bp
o Android.mk
, agrega
vintf_fragments
a cualquier módulo. Por ejemplo, puedes modificar
el módulo con la implementación de tu 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
, crea el manifiesto para
más adelante en este módulo. Durante el tiempo de compilación, este manifiesto se agrega al dispositivo. Agregando
aquí una entrada es lo mismo que agregar una entrada en el manifiesto principal del dispositivo.
Esto permite que los clientes usen la interfaz y que el VTS identifique qué HAL
implementaciones están en el dispositivo. Todo lo que un manifiesto normal
hace, este manifiesto también hace.
En el siguiente ejemplo, se implementa
android.hardware.foo@1.0::IFoo/default
, que se instala en
la partición vendor
o odm
. Si se instala en el
Partición system
, product
o system_ext
, usa el tipo
framework
en lugar de
escribe 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>
Si un módulo de HAL se empaqueta en un APEX de proveedor,
empaquetar sus fragmentos de VINTF asociados dentro del mismo APEX con prebuilt_etc
como
se explica en fragmentos de VINTF.
Esquema del archivo de manifiesto
En esta sección, se describe el significado de estas etiquetas XML. Algunos son “obligatorios” etiquetas
pueden faltar del archivo fuente en el árbol de fuentes de Android y escribirse
assemble_vintf
al momento de la compilación. Las etiquetas obligatorias deben estar presentes en los archivos correspondientes del
dispositivo.
?xml
- Opcional. Solo proporciona información al analizador de XML.
manifest.version
- Obligatorio. Metaversión de este manifiesto. Describe elementos esperados en el manifiesto. No está relacionado con la versión XML.
manifest.type
- Obligatorio. Es el tipo de este manifiesto. Tiene el valor
device
para el archivo de manifiesto del dispositivo yframework
para el manifiesto del framework . manifest.target-level
- Obligatorio para el manifiesto del dispositivo. Especifica la matriz de compatibilidad del framework Versión (FCM) de la que este dispositivo es compatible con el manifiesto tus amigos. Esto también se denomina versión de FCM de envío del dispositivo.
manifest.hal
- Opcional; se puede repetir. Una sola HAL (HIDL o nativa, como GL)
según el atributo
format
. manifest.hal.format
- Opcional. El valor puede ser uno de los siguientes:
hidl
: HAL de HIDL Es el valor predeterminado.aidl
: HAL de AIDL. Solo es válido en la meta-versión 2.0 del manifiesto y versiones posteriores.native
: HAL nativas
manifest.hal.max-level
- Opcional. Solo es válida en los manifiestos de framework. Si se establece, las HALs con un nivel máximo inferior que la versión de destino de FCM del manifiesto del framework están inhabilitadas.
manifest.hal.override
- Opcional. El valor puede ser uno de los siguientes:
true
: Anula otros elementos<hal>
con la misma<name>
y la misma versión principal. Si la respuesta es no<version>
o<fqname>
están en esta elemento<hal>
y, luego, el elemento<hal>
declara que esta HAL está inhabilitada.false
: No anula otros elementos<hal>
. con el mismo<name>
y la misma versión principal.
manifest.hal.name
- Obligatorio. Es el nombre del paquete completamente calificado de la HAL. Varias entradas de HAL pueden usar
con el mismo nombre. Ejemplos:
android.hardware.camera
(HIDL o HAL del AIDL)GLES
(HAL nativa; solo requiere nombre)
manifest.hal.transport
- Obligatorio cuando
manifest.hal.format == "hidl"
. NO debe ser presente de otro modo. Indica qué transporte se utiliza cuando una interfaz desde este paquete se consulta desde el administrador de servicios. El valor puede ser uno de los siguientes:hwbinder
: Modo vinculadopassthrough
: Modo de transferencia
- Opcional cuando
manifest.hal.format == "aidl"
. NO debe ser presente de otro modo. Indica qué transporte se usa cuando se entrega una interfaz. de forma remota. El valor debe ser el siguiente:inet
: Enchufe Inet
manifest.hal.transport.ip
ymanifest.hal.transport.port
debe usarse para especificar con más detalle la información de conexión de Inet. manifest.hal.transport.arch
- Obligatorio para
passthrough
y no debe estar presente enhwbinder
Describe la cantidad de bits del servicio de transferencia que se está utilizando. que se proporcionan. El valor puede ser uno de los siguientes:32
: Modo de 32 bits64
: Modo de 64 bits32+64
: Ambas
manifest.hal.transport.ip
- Obligatorio para
inet
y NO debe estar presente de otra manera. Describe la dirección IP desde la cual se entrega la interfaz remota. manifest.hal.transport.port
- Obligatorio para
inet
y NO debe estar presente de otra manera. Describe el puerto de la que se entrega la interfaz remota. manifest.hal.version
- Opcional; se puede repetir. Una versión para las etiquetas
hal
en un .
Para HIDL y HALs nativas, el formato es el siguiente:MAJOR.MINOR
Para ejemplos, consultahardware/interfaces
vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
osystem/hardware/interfaces
El HIDL y las HAL nativas pueden usar varios campos de versión siempre que representen versiones principales distintas, con solo una versión secundaria por principal versión proporcionada. Por ejemplo, 3.1 y 3.2 no pueden coexistir, pero 1.0 y 3.4 sí. Esto se aplica a todos los elementoshal
que tengan el mismo nombre, a menos queoverride="true"
Los valores de<version>
no son asociado con<fqname>
porque un<fqname>
que lleva una versión.
Para las HAL del AIDL,<version>
no debe estar presente en los dispositivos que se ejecutan Android 11 o versiones anteriores<version>
debe ser un número entero único en dispositivos que ejecutan Android 12 y versiones posteriores. Debe haber, como máximo, un<version>
para cada Tupla(package, interface, instance)
. Si no está presente, se establece de forma predeterminada como1
El valor de<version>
se asocia con todos<fqname>
en el mismo<hal>
porque Un objeto<fqname>
no tiene una versión. manifest.hal.interface
- Obligatorio, se puede repetir sin duplicados. Indica una interfaz en el
que tiene un nombre de instancia. Puede haber varios
elementos
<interface>
en una<hal>
; nombres deben ser distintos. manifest.hal.interface.name
- Obligatorio. Nombre de la interfaz.
manifest.hal.interface.instance
- Obligatorio; se puede repetir. Nombre de instancia de la interfaz. Puede tener varios
para una interfaz, pero no hay
<instance>
duplicados elementos. manifest.hal.fqname
- Opcional; se puede repetir. Una forma alternativa de especificar una instancia para la HAL
con el nombre
manifest.hal.name
.- Para las HAL de HIDL, el formato es el siguiente
@MAJOR.MINOR::INTERFACE/INSTANCE
- Para las HAL del AIDL, el formato es el siguiente
INTERFACE/INSTANCE
- Para las HAL de HIDL, el formato es el siguiente
manifest.sepolicy
- Obligatorio. Contiene todas las entradas relacionadas con la política.
manifest.sepolicy.version
- Obligatorio para el manifiesto del dispositivo. Declara la versión de SELinux. Cuenta con
formato
SDK_INT.PLAT_INT
. manifest.vendor-ndk
- Obligatorio, se puede repetir. necesarios para el manifiesto del framework. No debe estar presente.
en el manifiesto del dispositivo. Varias entradas
<vendor-ndk>
deben tener diferentes<version>
. Describe un conjunto de instantáneas del VNDK que proporciona el framework. manifest.vendor-ndk.version
- Obligatorio. Es un número entero positivo que representa la versión de VNDK. instantánea.
manifest.vendor-ndk.library
- Opcional, se puede repetir, sin duplicados. Describe un conjunto de bibliotecas de VNDK
que proporciona el framework para esta instantánea del proveedor del VNDK. El valor es la
nombre de archivo de una biblioteca, p.ej.,
libjpeg.so
, incluido el prefijolib
y el sufijo.so
No hay componentes de ruta de acceso permitido. manifest.system-sdk.version
- Opcional, se puede repetir, sin duplicados. que solo usa el framework . Describe un conjunto de versiones del SDK del sistema que proporciona el framework para aplicaciones de proveedores de servicios en la nube.
manifest.kernel
- Opcional. Describe la información estática sobre el kernel.
manifest.kernel.target-level
- Opcional. Describe la rama de kernel. Su valor predeterminado es
Es
manifest.target-level
si no está presente. Debe ser superior a o igual amanifest.target-level
. Consulta reglas de coincidencia del kernel para conocer los detalles.