Una imagen del sistema puede usar resúmenes del VNDK para proporcionar las bibliotecas del VNDK correctas a las imágenes del proveedor, incluso cuando las imágenes del sistema y el proveedor se compilan a partir de versiones diferentes de Android. Para crear un resumen de VNDK, debes capturar las bibliotecas de VNDK como un resumen y marcarlas con un número de versión. La imagen del proveedor puede vincularse con una versión específica del VNDK que proporcione las ABI requeridas para los módulos de la imagen del proveedor. Sin embargo, dentro de la misma versión del VNDK, las bibliotecas del VNDK deben ser estables en 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 del sistema actual y instalar esas bibliotecas compiladas previamente en la partición del sistema de una versión más reciente de Android.
Acerca de las bibliotecas de VNDK
Los HAL de HIDL, que se introdujeron en Android 8.0, permiten actualizaciones independientes para las particiones del sistema y del proveedor. El VNDK define conjuntos de bibliotecas (VNDK-core, VNDK-SP y LL-NDK) con las que el código del proveedor puede vincularse y bloquea a los proveedores para que no usen bibliotecas que no estén en un conjunto de VNDK. Como resultado, la imagen del proveedor se puede compilar y ejecutar si se proporcionan los conjuntos de VNDK correctos en la imagen del sistema.
VNDK-core
El conjunto de bibliotecas de VNDK-core se instala en /system/lib[64]/vndk-${VER}
y está disponible solo para los procesos del proveedor con el nivel de API igual a ${VER}
. Es posible que los procesos del sistema no usen estas bibliotecas y, en su lugar, deban usar las bibliotecas instaladas en /system/lib[64]
. Debido a la estricta restricción de espacio de nombres para cada proceso, las bibliotecas de VNDK-core están protegidas contra la carga doble.
Para incluir una biblioteca en VNDK-core, agrega lo siguiente a Android.bp
:
vendor_available: true, vndk: { enabled: true, },
VNDK-SP
Las bibliotecas de VNDK-SP se instalan en /system/lib[64]/vndk-sp-${VER}
y están disponibles para los procesos del proveedor y del sistema (a través de las bibliotecas de SP-HAL instaladas en la partición del proveedor). Las bibliotecas de VNDK-SP se pueden cargar de forma doble.
Para incluir una biblioteca en VNDK-SP, agrega lo siguiente a Android.bp
:
vendor_available: true, vndk: { enabled: true, support_system_process: true, },
LL-NDK
Las bibliotecas de LL-NDK se instalan en /system/lib[64]
. Los módulos de proveedores pueden usar bibliotecas de stub de LL-NDK para acceder a símbolos preseleccionados de bibliotecas de LL-NDK. Las bibliotecas de LL-NDK deben ser retrocompatibles y estables en ABI para permitir que las versiones anteriores de los módulos de proveedores usen versiones nuevas de las bibliotecas de 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 anteriores.
Acerca de las instantáneas del VNDK
Android 8.1 incluía bibliotecas de VNDK compiladas a partir del código fuente. Sin embargo, para versiones posteriores de Android, cada versión de VNDK se debe capturar como un resumen y proporcionar como una compilación previa para habilitar la vinculación a una imagen de proveedor anterior.
A partir de Android 9, las versiones nuevas de Android incluirán al menos un resumen 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 la partición del proveedor), donde ${VER}
es la variable de cadena que representa el nombre de la versión de la instantánea del VNDK.
Como las bibliotecas de instantáneas del VNDK pueden diferir para cada versión del VNDK, la instantánea del VNDK también incluye las configuraciones de espacio de nombres del vinculador, instaladas como etc/ld.config.${VER}.txt
, /etc/llndk.libraries.${VER}.txt
y /etc/vndksp.libraries.${VER}.txt
.
Ejemplo: Actualiza las imágenes del sistema y del proveedor
No se requiere ninguna instantánea. Compila sin configuraciones adicionales para las instantáneas de VNDK.
Ejemplo: Actualiza 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 de VNDK en /system/lib[64]/vndk-${VER}
y /system/lib[64]/vndk-sp-${VER}
.

Ejemplo: Actualización de la imagen del sistema, cambio menor de la imagen del proveedor
Aún no se admite la compilación de una imagen del proveedor con una instantánea del VNDK, por lo que debes compilar 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 del VNDK
Para que una imagen del sistema de Android 9 sea compatible con una imagen del proveedor de Android 8.1, se debe proporcionar la instantánea de VNDK que coincida con la imagen del proveedor de Android 8.1 con la imagen del sistema de Android 9, como se muestra a continuación:

El diseño de instantáneas de VNDK incluye los siguientes métodos:
- Cómo generar un resumen para las bibliotecas de VNDK-core y VNDK-SP Android 9 incluye una secuencia de comandos que puedes usar para crear un resumen de la compilación actual de VNDK. Esta secuencia de comandos agrupa todas las bibliotecas de
/system/lib[64]/vndk-28
y/system/lib[64]/vndk-sp-28
que se compilaron con la fuente actual como un resumen de VNDK, donde28
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 vinculador/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 recientes (posteriores a Android 9). - Instalación de bibliotecas VNDK-core y VNDK-SP precompiladas desde una instantánea En Android 9, un resumen de VNDK tiene un conjunto de bibliotecas VNDK-core precompiladas y un conjunto de bibliotecas VNDK-SP, así como archivos de configuración de espacio de nombres del vinculador. Cuando proporcionas una lista de versiones de instantáneas del VNDK que se instalarán, en el momento de la compilación, la imagen del sistema instala las bibliotecas de instantáneas del VNDK en
/system/lib[64]/vndk-${VER}
y los directorios/system/lib[64]/vndk-sp-${VER}
y los archivos de configuración del espacio de nombres del vinculador para esas instantáneas del VNDK en el directorio/etc
.
Control de versiones de VNDK
Cada versión de Android tiene solo una instantánea de VNDK, y la versión del 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 del VNDK se corrige cuando se lanza la versión de Android. La versión de VNDK que usa la partición del proveedor se almacena automáticamente en la propiedad ro.vndk.version
, que se puede leer en el entorno de ejecución. Luego, esta versión se usa para identificar la versión del proveedor de VNDK para algunas bibliotecas y la versión del resumen de VNDK para la configuración del espacio de nombres.
Compila bibliotecas de VNDK
El comando make vndk
compila bibliotecas que tienen vndk:
{ enabled: true, … }
, incluidas las dependencias y los archivos de configuración del espacio de nombres. Si se configura BOARD_VNDK_VERSION := current
, estas bibliotecas se compilan con el comando make
.
Debido a que esta compilación no instala las bibliotecas del VNDK desde la instantánea, las bibliotecas del VNDK instaladas no son estables en la ABI. Sin embargo, cuando se lanza una versión de Android, se corrige la ABI de la versión actual de VNDK. En este punto, cualquier falla de ABI es un error de compilación, por lo que los parches de la versión de Android no deben cambiar la ABI de las bibliotecas del VNDK.