Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Manifiestos

A agregados objeto VINTF datos de manifiesto del dispositivo y se manifiestan marco archivos (XML). Ambos comparten un formato manifiesta, aunque no todos los elementos se aplican a ambos (para más detalles sobre el esquema, ver esquema de 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 HAL, versiones de políticas de SELinux, etc., comunes a un SoC. Se recomienda para ser colocado en el árbol de código fuente de Android en device/ VENDOR / DEVICE /manifest.xml , pero varios archivos de fragmentos puede ser utilizado. Para más detalles, ver fragmentos manifiestos y generar a partir de fragmentos de DM .
  • Las listas de ODM manifiestos HAL específico para el producto en la partición ODM . El objeto VINTF carga el manifiesto ODM en este orden:
    1. Si SKU se define (donde SKU es el valor de la propiedad ro.boot.product.hardware.sku ), /odm/etc/vintf/manifest_ SKU .xml
    2. /odm/etc/vintf/manifest.xml
    3. Si SKU se define, /odm/etc/manifest_ SKU .xml
    4. /odm/etc/manifest.xml
  • 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:
    1. Si SKU se define (donde SKU es el valor de la propiedad ro.boot.product.vendor.sku ), /vendor/etc/vintf/manifest_ SKU .xml
    2. /vendor/etc/vintf/manifest.xml
  • El objeto VINTF carga el manifiesto del dispositivo en este orden:
    1. Si existe el manifiesto del proveedor, combine lo siguiente:
      1. El manifiesto del proveedor
      2. Fragmentos de manifiesto de proveedor opcionales
      3. Manifiesto ODM opcional
      4. Fragmentos de manifiesto de ODM opcionales
    2. De lo contrario, si existe el manifiesto de ODM, combine el manifiesto de ODM con los fragmentos de manifiesto de ODM opcionales.
    3. /vendor/manifest.xml (legado, no hay fragmentos)

    Tenga en cuenta que:

    • En los dispositivos heredados, se utilizan el manifiesto del proveedor heredado y el manifiesto ODM. El manifiesto de ODM puede anular completamente el manifiesto del proveedor heredado.
    • En los dispositivos lanzados con Android 9, el manifiesto de ODM se combina con el manifiesto del proveedor.
    • Cuando la combinación de una lista de manifiestos, manifiestos que aparecen más adelante en la lista pueden anular etiquetas en los manifiestos que aparecen anteriormente en la lista, siempre que las etiquetas en el más tarde manifiesto tienen el atributo override="true" . Por ejemplo, el manifiesto ODM puede anular algunos <hal> etiquetas del proveedor manifiesto. Consulte la documentación del atributo override a continuación.

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

A continuación, se muestra 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>

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>

A continuación, se muestra 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 más detalles, véase el dispositivo Manifiesto Desarrollo .

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 (proporcionada por Google) se genera y vive en el árbol fuente de Android en forma manual /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.

Al igual que en el manifiesto del dispositivo, se pueden utilizar varios archivos de fragmentos. Para más detalles, ver fragmentos manifiestos .

Aquí hay un manifiesto de marco 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>
    <vendor-ndk>
        <version>27</version>
    </vendor-ndk>
    <system-sdk>
        <version>27</version>
    </system-sdk>
</manifest>

Fragmentos manifiestos

En Android 10 y superior, 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 Android.bp o Android.mk archivo, 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 , crear el manifiesto de 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 a los clientes utilizar la interfaz y permite a VTS identificar 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 implementos android.hardware.foo@1.0::IFoo/default , que se instala a la vendor o odm partición. Si se instala en el system , product o system_ext partición, tipo de uso del framework en lugar de tipo de 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 "requeridas" pueden ser no aparece en el archivo de origen en el árbol de código fuente de Android y escritos por assemble_vintf en tiempo de compilación. Las etiquetas requeridas deben estar presentes en los archivos correspondientes del 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 valor device para el archivo de manifiesto dispositivo y framework para el archivo de manifiesto marco.
manifest.target-level
Requerido para el manifiesto del dispositivo. Especifica la versión de la matriz de compatibilidad del marco (FCM) con la que se pretende que este manifiesto de dispositivo sea compatible. Esto también se denomina versión FCM de envío del dispositivo.
manifest.hal
Opcional, se puede repetir. Una sola HAL (HIDL o nativas, tales como GL), dependiendo del format atributo.
manifest.hal.format
Opcional. El valor puede ser uno de los siguientes:
  • hidl : HAL HIDL. Este es el predeterminado.
  • aidl : HAL AIDL . Solo válido en la meta-versión 2.0 del manifiesto y superior.
  • native HAL nativos:.
manifest.hal.override
Opcional. El valor puede ser uno de los siguientes:
  • true : Anulación de otros <hal> elementos con el mismo <name> y la versión principal. Si hay <version> o <fqname> son en este <hal> elemento, entonces el <hal> elemento declara esta HAL estar deshabilitado.
  • false : No tienen en cuenta otros <hal> elementos con el mismo <name> y la versión principal.
manifest.hal.name
Requerido. Nombre de paquete completo de HAL. Varias entradas HAL pueden usar el mismo nombre. Ejemplos:
  • android.hardware.camera (HIDL o AIDL HAL)
  • GLES (HAL nativa, requiere sólo de nombre)
manifest.hal.transport
Se requiere cuando manifest.hal.format == "hidl" . NO debe estar presente de otra manera. Indica qué transporte se utiliza cuando se consulta una interfaz de este paquete desde el administrador de servicios. El valor puede ser uno de los siguientes:
  • hwbinder : el modo revestidas con un aglutinante
  • passthrough : el modo de paso a través
manifest.hal.transport.arch
Se requiere para passthrough y no deben estar presentes para hwbinder . Describe el valor de bits del servicio de transferencia que se proporciona. El valor puede ser uno de los siguientes:
  • 32 modo de 32 bits:
  • 64 modo de 64 bits:
  • 32+64 : Tanto
manifest.hal.version
Opcional, se puede repetir. Una versión de los hal etiquetas en un manifiesto.

Para HIDL y HAL nativos, el formato es MAJOR . MINOR . Para ver ejemplos, consulte hardware/interfaces , vendor/${VENDOR}/interfaces , framework/hardware/interfaces , o system/hardware/interfaces .

HIDL y HAL nativos pueden utilizar varios campos de versión, siempre y cuando que representan las principales versiones distintas, con sólo una versión menor por versión principal proporcionada. Por ejemplo, 3.1 y 3.2 no pueden coexistir, pero 1.0 y 3.4 sí. Esto se aplica a todos los hal elementos con el mismo nombre, a menos override="true" . Los valores de <version> no están asociados con <fqname> debido a que un <fqname> lleva una versión.

Para AIDL HAL, <version> no debe estar presente en dispositivos con Android 11 y por debajo. <version> debe ser un solo número entero en dispositivos con Android 12 y por encima. Tiene que a lo sumo un <version> para cada uno (package, interface, instance) tupla. Si no está presente, por defecto a 1 . El valor de <version> se asocia con toda <fqname> en el mismo <hal> debido a que un <fqname> no lleva a una versión.
manifest.hal.interface
Obligatorio, se puede repetir sin duplicados. Indique una interfaz en el paquete que tenga un nombre de instancia. No puede haber múltiples <interface> elementos en un <hal> ; los nombres deben ser distintos.
manifest.hal.interface.name
Requerido. Nombre de la interfaz.
manifest.hal.interface.instance
Requerido, puede repetir. Nombre de instancia de la interfaz. Puede tener múltiples instancias de una interfaz pero no hay duplicados <instance> elementos.
manifest.hal.fqname
Opcional, se puede repetir. Una forma alternativa para especificar una instancia para la HAL con el nombre manifest.hal.name .
  • Para HAL HIDL, el formato es @ MAJOR . MINOR :: INTERFACE / INSTANCE .
  • Para HAL AIDL, el formato es INTERFACE / INSTANCE .
manifest.sepolicy
Requerido. Contiene todas las entradas relacionadas con la política.
manifest.sepolicy.version
Requerido para el manifiesto del dispositivo. Declara la versión de SELinux. Tiene el formato SDK_INT . PLAT_INT .
manifest.vendor-ndk
Requerido, puede repetir; requerido para el manifiesto de marco. No debe estar presente en el manifiesto del dispositivo. Múltiple <vendor-ndk> entradas deben tener diferentes <version> s. 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 VNDK proporcionadas por el marco para esta instantánea del proveedor VNDK. El valor es el nombre de archivo de una biblioteca, por ejemplo libjpeg.so , incluyendo el prefijo lib 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 que proporciona 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 kernel. Sus valores por defecto de valor a manifest.target-level si no está presente. Debe ser mayor que o igual a manifest.target-level . Ver reglas de concordancia del kernel para obtener más detalles.