Diseño de instantáneas VNDK

Una imagen del sistema puede usar las instantáneas de VNDK para proporcionar las bibliotecas de 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. Crear una instantánea de VNDK requiere 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 específica de VNDK que proporciona 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 ABI estables .

El diseño de instantáneas de VNDK incluye métodos para generar compilaciones previas de una instantánea de VNDK a partir de la imagen del sistema actual 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-HALs , introducido en Android 8.0, permite actualizaciones independientes para las particiones del sistema y del proveedor. VNDK define conjuntos de bibliotecas (VNDK-core, VNDK-SP y LL-NDK) con los que el código del proveedor puede vincularse y evita que los proveedores usen 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 está instalado 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 VNDK-core 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 se instalan en /system/lib[64] . Los módulos de proveedores pueden usar bibliotecas de código auxiliar 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 en ABI para permitir que las versiones anteriores 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 de 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 habilitar la vinculación 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 usar el proveedor partición), donde ${VER} es la variable de cadena que representa el nombre de la versión de la instantánea de 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 enlazador, 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; construir 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. Sistema de actualización únicamente

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

Todavía no se admite la creación de una imagen de proveedor contra una instantánea de VNDK, por lo que debe crear la imagen de 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 VNDK

Para hacer que una imagen del sistema de Android 9 sea compatible con una imagen del proveedor de Android 8.1, la instantánea de VNDK que coincida con la imagen del proveedor de Android 8.1 debe proporcionarse 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:

  • Generación de una instantánea para las bibliotecas VNDK-core y VNDK-SP . Android 9 incluye un script que puede usar para hacer 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 de VNDK de Android 9. La instantánea también incluye los archivos de configuración del espacio de nombres del enlazador /etc/ld.config.28.txt , /etc/llndk.libraries.28.txt y /etc/vndksp.libraries.28.txt . La instantánea generada se usará con versiones de Android más nuevas (superiores a Android 9).
  • Instalación de bibliotecas VNDK-core y VNDK-SP preconstruidas desde una instantánea . En Android 9, una instantánea de VNDK tiene un conjunto de bibliotecas VNDK-core preconstruidas y un conjunto de bibliotecas VNDK-SP, así como archivos de configuración del espacio de nombres del enlazador. Cuando proporciona una lista de versiones de instantáneas de VNDK para instalar, 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 y archivos de configuración del espacio de nombres del enlazador para esas instantáneas de VNDK en el directorio /etc .

Versionado de VNDK

Cada versión de Android tiene solo una instantánea de VNDK y la versión de SDK se usa como una 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 de 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 usa para identificar la versión de VNDK del proveedor para algunas bibliotecas y para identificar la versión de instantánea de VNDK para la configuración del espacio de nombres.

Creación de bibliotecas VNDK

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

Debido a que esta compilación no instala las bibliotecas de VNDK desde la instantánea, las bibliotecas de VNDK instaladas no son ABI estables. 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 de la versión de Android no deben cambiar la ABI para las bibliotecas VNDK.