Diseño de instantáneas VNDK

Una imagen del sistema puede utilizar instantáneas de VNDK para proporcionar las bibliotecas VNDK correctas a las imágenes del proveedor, incluso cuando las imágenes del sistema y del proveedor se crean a partir de diferentes versiones de Android. Para crear una instantánea de VNDK es necesario capturar las bibliotecas de VNDK como una instantánea y marcarlas con un número de versión. La imagen del proveedor puede vincularse con una versión de VNDK específica que proporcione las ABI requeridas para los módulos en la imagen del proveedor. Sin embargo, dentro de la misma versión de VNDK, las bibliotecas de VNDK deben ser estables con ABI .

El diseño de instantáneas de VNDK incluye métodos para generar las compilaciones previas de una instantánea de VNDK a partir de la imagen actual del sistema e instalar esas bibliotecas prediseñadas en la partición del sistema de una versión más reciente de Android.

Acerca de las bibliotecas VNDK

HIDL-HAL , introducido en Android 8.0, permite actualizaciones separadas para las particiones del sistema y del proveedor. VNDK define conjuntos de bibliotecas (VNDK-core, VNDK-SP y LL-NDK) con las que el código del proveedor puede vincularse y bloquea el uso de bibliotecas que no están en un conjunto de VNDK. Como resultado, la imagen del proveedor se puede crear y ejecutar si se proporcionan a la imagen del proveedor los conjuntos de VNDK adecuados en la imagen del sistema.

Núcleo VNDK

El conjunto de bibliotecas VNDK-core se instala en /system/lib[64]/vndk-${VER} y está disponible solo para procesos de proveedores con el nivel de API igual a ${VER} . Los procesos del sistema no pueden usar estas bibliotecas y, en su lugar, deben usar las bibliotecas instaladas en /system/lib[64] . Debido a la estricta restricción del espacio de nombres para cada proceso, las bibliotecas principales de VNDK están a salvo de la carga dual.

Para incluir una biblioteca en VNDK-core, agregue lo siguiente a Android.bp :

vendor_available: true,
vndk: {
    enabled: true,
},

VNDK-SP

Las bibliotecas VNDK-SP se instalan en /system/lib[64]/vndk-sp-${VER} y están disponibles para los procesos del proveedor y los procesos del sistema (a través de las bibliotecas SP-HAL instaladas en la partición del proveedor). Las bibliotecas VNDK-SP pueden tener carga dual.

Para incluir una biblioteca en VNDK-SP, agregue lo siguiente a Android.bp :

vendor_available: true,
vndk: {
    enabled: true,
    support_system_process: true,
},

LL-NDK

Las bibliotecas LL-NDK están instaladas en /system/lib[64] . Los módulos de proveedor pueden utilizar bibliotecas auxiliares de LL-NDK para acceder a símbolos preseleccionados de bibliotecas de LL-NDK. Las bibliotecas LL-NDK deben ser compatibles con versiones anteriores y estables con ABI para permitir que las versiones antiguas de los módulos del proveedor utilicen nuevas versiones de las bibliotecas LL-NDK. Debido a las características estables de ABI de LL-NDK, la instantánea de VNDK no necesita incluir bibliotecas de LL-NDK para imágenes de proveedores antiguos.

Acerca de las instantáneas VNDK

Android 8.1 incluía bibliotecas VNDK creadas a partir del código fuente . Sin embargo, para versiones posteriores de Android, cada versión de VNDK debe capturarse como una instantánea y proporcionarse como una compilación previa para permitir el enlace a una imagen de proveedor anterior.

A partir de Android 9, las nuevas versiones de Android incluirán al menos una instantánea de los directorios VNDK-core y VNDK-SP para versiones anteriores en el código fuente de Android. En el momento de la compilación, las instantáneas requeridas se instalarán en /system/lib[64]/vndk-${VER} y /system/lib[64]/vndk-sp-${VER} (directorios que puede utilizar el proveedor). partición), donde ${VER} es la variable de cadena que representa el nombre de la versión de la instantánea VNDK.

Como las bibliotecas de instantáneas de VNDK pueden diferir para cada versión de VNDK, la instantánea de VNDK también incluye las configuraciones del espacio de nombres del vinculador, instaladas como etc/ld.config.${VER}.txt , /etc/llndk.libraries.${VER}.txt y /etc/vndksp.libraries.${VER}.txt .

Ejemplo: actualización de imágenes del sistema y del proveedor

No se requiere instantánea; compilar sin configuraciones adicionales para instantáneas de VNDK.

Ejemplo: actualizar solo la imagen del sistema

Debe incluir la instantánea de VNDK y los archivos de configuración del espacio de nombres del vinculador para la imagen del proveedor en la imagen del sistema. Los archivos de configuración del espacio de nombres del vinculador se configuran automáticamente para buscar bibliotecas VNDK en /system/lib[64]/vndk-${VER} y /system/lib[64]/vndk-sp-${VER} .

Figura 1. Actualización únicamente del sistema

Ejemplo: actualización de la imagen del sistema, cambio menor de imagen del proveedor

Aún no se admite la creación de una imagen de proveedor a partir de una instantánea de VNDK, por lo que debe crear la imagen del proveedor por separado con su código fuente original y luego actualizar la imagen del sistema como se describe en el ejemplo anterior.

Arquitectura de instantáneas de VNDK

Para que una imagen del sistema Android 9 sea compatible con una imagen del proveedor de Android 8.1, la instantánea VNDK que coincida con la imagen del proveedor de Android 8.1 se debe proporcionar con la imagen del sistema de Android 9, como se muestra a continuación:

Figura 2. Arquitectura de instantáneas de VNDK

El diseño de instantáneas de VNDK incluye los siguientes métodos:

  • Generando una instantánea para las bibliotecas VNDK-core y VNDK-SP . Android 9 incluye un script que puede utilizar para crear una instantánea de la compilación actual de VNDK. Este script agrupa todas las bibliotecas en /system/lib[64]/vndk-28 y /system/lib[64]/vndk-sp-28 que se crearon con la fuente actual como una instantánea de VNDK, donde 28 es la versión VNDK de Android 9. La instantánea también incluye los archivos de configuración del espacio de nombres del vinculador /etc/ld.config.28.txt , /etc/llndk.libraries.28.txt y /etc/vndksp.libraries.28.txt . La instantánea generada se utilizará con las versiones más recientes de Android (superiores a Android 9).
  • Instalación de bibliotecas VNDK-core y VNDK-SP prediseñadas desde una instantánea . En Android 9, una instantánea de VNDK tiene un conjunto de bibliotecas VNDK-core prediseñadas y un conjunto de bibliotecas VNDK-SP, así como archivos de configuración de espacios de nombres del vinculador. Cuando proporciona una lista de versiones de instantáneas de VNDK que se instalarán, en el momento de la compilación, la imagen del sistema instala las bibliotecas de instantáneas de VNDK en /system/lib[64]/vndk-${VER} y /system/lib[64]/vndk-sp-${VER} directorios /system/lib[64]/vndk-sp-${VER} y archivos de configuración del espacio de nombres del vinculador para esas instantáneas de VNDK en el directorio /etc .

Versiones VNDK

Cada versión de Android tiene solo una instantánea de VNDK y la versión del SDK se utiliza como versión de VNDK (lo que significa que la versión de VNDK tiene un número entero, como 27 para Android 8.1). La versión VNDK se corrige cuando se lanza la versión de Android. La versión de VNDK utilizada por la partición del proveedor se almacena automáticamente en la propiedad ro.vndk.version , que se puede leer en tiempo de ejecución. Luego, esta versión se utiliza para identificar la versión VNDK del proveedor para algunas bibliotecas y para identificar la versión instantánea de VNDK para la configuración del espacio de nombres.

Construyendo bibliotecas VNDK

El comando make vndk crea bibliotecas que tienen vndk: { enabled: true, … } , incluidas dependencias y archivos de configuración de espacios de nombres. Si se establece BOARD_VNDK_VERSION := current , estas bibliotecas se crean con el comando make .

Debido a que esta compilación no instala las bibliotecas VNDK desde la instantánea, las bibliotecas VNDK instaladas no son estables en ABI. Sin embargo, cuando se lanza una versión de Android, se corrige la ABI para la versión actual de VNDK. En este punto, cualquier rotura de ABI es un error de compilación, por lo que los parches para la versión de Android no deben cambiar la ABI para las bibliotecas VNDK.