Un resumen de VNDK es un conjunto de bibliotecas de VNDK-core y VNDK-SP para una versión de Android.
Solo puedes actualizar la partición del sistema si system.img
incluye la instantánea del VNDK correspondiente que necesita vendor.img
.
Las instantáneas oficiales de VNDK se compilan automáticamente en el servidor de compilación de Android y se registran en /prebuilts/vndk
del árbol fuente de Android. Para fines de desarrollo, puedes compilar instantáneas de VNDK de forma local. Las instantáneas de VNDK son compatibles con los tipos de TARGET_ARCH
arm, arm64, x86 y x86_64.
Cómo compilar instantáneas
El servidor de compilación de Android genera artefactos de compilación y archivos de instantáneas de VNDK con los siguientes parámetros y comandos de compilación.
Parámetros de compilación
El nombre del objetivo de compilación es vndk
. A continuación, se muestra la configuración del destino de compilación.
TARGET_PRODUCT |
TARGET_ARCH |
TARGET_ARCH_VARIANT |
---|---|---|
aosp_arm |
arm |
armv7-a-neon |
aosp_arm64 |
arm64 |
armv8-a |
aosp_x86 |
x86 |
x86 |
aosp_x86_64 |
x86_64 |
x86_64 |
TARGET_PRODUCT=aosp_$(TARGET_ARCH)
TARGET_BUILD_VARIANT=user
TARGET_ARCH
es lo mismo que los armaduras de destino de la imagen genérica del sistema (GSI) (arm
,arm64
,x86
,x86_64
).TARGET_ARCH_VARIANT
. Para la instantánea v28 (Android 9) y versiones posteriores, incluye las configuraciones populares que se enumeraron anteriormente.
Comandos de compilación
En el caso de las instantáneas oficiales, Android 9 y versiones posteriores incluyen un destino de muestra (vndk
) en vndk.mk
que compila y genera una instantánea de VNDK en $DIST_DIR
. El archivo ZIP de la instantánea usa el formato android-vndk-$(TARGET_ARCH).zip
.
Por ejemplo:
lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]
El servidor de compilación de Android usa la secuencia de comandos build.sh
para compilar todos los tipos de arquitectura compatibles con el siguiente comando.
DIST_DIR=dist_dir development/vndk/snapshot/build.sh
El resumen del VNDK para una versión de Android se genera a partir de la rama de lanzamiento de esa versión.
Compila de forma local
Durante el desarrollo, puedes compilar instantáneas de VNDK a partir de un árbol de origen local con los siguientes comandos.
- Para compilar todos los archs compatibles a la vez, ejecuta la siguiente secuencia de comandos de compilación (
build.sh
).cd $ANDROID_BUILD_TOP
development/vndk/snapshot/build.sh
- Para compilar un
TARGET_ARCH
específico, ejecuta los siguientes comandos.lunch aosp_TARGET_ARCH-user
m -j vndk dist
Se crea el archivo android-vndk-$(TARGET_ARCH).zip
correspondiente en $DIST_DIR
.
Archivos de instantáneas
Una instantánea de VNDK incluye los siguientes archivos.
- Variante del proveedor de bibliotecas compartidas de VNDK-core y VNDK-SP.
- No se necesitan las bibliotecas compartidas de LL-NDK, ya que son retrocompatibles.
- Para los destinos de 64 bits, se compilan y se incluyen las bibliotecas
TARGET_ARCH
yTARGET_2ND_ARCH
.
- La lista de bibliotecas VNDK-core, VNDK-SP, LL-NDK y VNDK-private se encuentra en
[vndkcore|vndksp|llndk|vndkprivate].libraries.txt
. - Archivos de licencia
module_paths.txt
: Registra las rutas de acceso de los módulos de todas las bibliotecas de VNDK, lo que es necesario para verificar que los proyectos de GPL tengan fuentes publicadas en un árbol de fuentes de Android determinado.
Para un archivo ZIP de instantáneas del VNDK determinado, android-vndk-$(TARGET_ARCH).zip
, las bibliotecas precompiladas del VNDK se agrupan en directorios separados llamados arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT)
según la cantidad de bits de la ABI. Por ejemplo, para android-vndk-arm64.zip
, las bibliotecas de 64 bits se colocan en arch-arm64-armv8-a
y las de 32 bits se colocan en arch-arm-armv8-a
. En el siguiente ejemplo, se muestra la estructura de directorios de un archivo ZIP de instantáneas del VNDK (android-vndk-arm64.zip
) de arm64 (TARGET_ARCH=arm64
).

Cómo compilar para instantáneas de proveedores
Android 11 admite resúmenes de proveedores, que te permiten compilar vendor.img
sin importar la versión de Android que uses en el árbol fuente. Un resumen predeterminado del VNDK contiene los archivos de biblioteca compartida (.so
) que se pueden instalar en los dispositivos y, luego, vincular desde los objetos binarios C++ del proveedor en el tiempo de ejecución. Para compilar en función de esa instantánea de VNDK, necesitas artefactos adicionales, como archivos de encabezado y marcas exportadas.
Para generar esos artefactos (junto con la instantánea de VNDK) a partir de un árbol de fuentes local, usa el siguiente comando.
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh
Este comando crea archivos android-vndk-$(TARGET_ARCH).zip
en $DIST_DIR
. El siguiente ejemplo es un archivo ZIP de instantánea de VNDK arm64 con artefactos de compilación. Los archivos en negrita son archivos agregados recientemente a la instantánea normal de VNDK (que se muestra en la Figura 1) y, además, incluyen archivos JSON (que almacenan cflags
de cada biblioteca) y todos los archivos de encabezado exportados.
android-vndk-arm64.zip ├── arch-arm64-armv8-a │ └── shared │ ├── vndk-core -> *.so files, *.json files │ └── vndk-sp -> *.so files, *.json files ├── arch-arm-armv8-a -> (same as arch-arm64-armv8-a) ├── configs -> *.libraries.txt, module_paths.txt, module_names.txt ├── include -> exported header files (*.h, *.hh, etc.) └── NOTICE_FILES -> license txt files
Sube instantáneas del VNDK
Los resúmenes de VNDK se verifican en el árbol fuente en /prebuilts/vndk/vVER
, donde VER
es igual a la versión del resumen de VNDK (que sigue la versión del SDK de la versión de Android correspondiente). Por ejemplo, la instantánea del VNDK de Android 8.1 tiene la versión 27.
Usa la secuencia de comandos update.py
La secuencia de comandos update.py
(/development/vndk/snapshot/update.py
) automatiza el proceso de agregar una instantánea del VNDK precompilada al árbol fuente. Detecta automáticamente los artefactos de compilación y completa de forma adecuada las propiedades asociadas en el Android.bp
generado. Esta secuencia de comandos realiza las siguientes tareas:
- En
/prebuilts/vndk/vVER
, usarepo start
para crear una nueva rama de Git. - Recupera y descomprime los artefactos de compilación de resúmenes de VNDK.
- Ejecuta
gen_buildfiles.py
para generar automáticamente los archivos de compilación (Android.bp
). - Ejecuta
check_gpl_license.py
para verificar que las bibliotecas precompiladas con licencia de la Licencia Pública General (GPL) tengan fuentes publicadas en el árbol de fuentes actual. - Usa
git commit
para confirmar los cambios nuevos.
Usa instantáneas del VNDK compiladas de forma local
También puedes usar instantáneas de VNDK compiladas de forma local. Cuando se especifica la opción --local
, la secuencia de comandos update.py
recupera artefactos de compilación de instantáneas de VNDK del directorio local especificado (en lugar del servidor de compilación de Android) que tiene los archivos android-vndk-$(TARGET_ARCH).zip
generados a partir de development/vndk/snapshot/build.sh
. Con la opción --local
, la secuencia de comandos update.py
omite la verificación de la licencia GPL y los pasos git commit
.
Sintaxis:
python update.py VER --local local_path
Comando de ejemplo para actualizar la instantánea del VNDK de Android 8.1 con artefactos de compilación local en /path/to/local/dir
:
python update.py 27 --local /path/to/local/dir
Ejemplo de estructura de directorio de una instantánea del VNDK compilada de forma local:
prebuilts/vndk ├── v30 │ ├── arm64 │ │ ├── arch-arm64-armv8-a -> (prebuilt libs) │ │ ├── arch-arm-armv8-a -> (prebuilt libs) │ │ ├── configs -> (config files) │ │ ├── include -> (exported header files) │ │ └── Android.bp -> (VNDK modules with cflags) │ ├── arm -> (same as above) │ ├── x86_64 -> (same as above) │ ├── x86 -> (same as above) │ ├── common │ │ ├── NOTICE_FILES -> (license files) │ │ └── Android.bp -> (license file modules) │ └── Android.bp -> (*.libraries.30.txt modules) └── (other VNDK versions) -> (same as above)
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true
.
Instala resúmenes del VNDK
La imagen del sistema instala bibliotecas de instantáneas del VNDK en el tiempo de compilación con la información de BOARD_VNDK_VERSION
, PRODUCT_EXTRA_VNDK_VERSIONS
y ro.vndk.version
.
Puedes controlar qué instantáneas del VNDK se instalan desde los directorios de instantáneas del VNDK precompilado (por ejemplo, /prebuilts/vndk/v29
o /prebuilts/vndk/v30
) con una de las siguientes opciones.
- Opción 1:
BOARD_VNDK_VERSION
. Usa los módulos de instantáneas para compilar los módulos de proveedores actuales y, luego, instala solo los módulos de instantáneas que se requieren para los módulos de proveedores. - Opción 2:
PRODUCT_EXTRA_VNDK_VERSIONS
. Instala los módulos de instantáneas de VNDK independientemente de los módulos de proveedores actuales. Esto instala las instantáneas de VNDK precompiladas que se enumeran enPRODUCT_EXTRA_VNDK_VERSIONS
sin vincularlas a ningún otro módulo en el momento de la compilación.
Cómo configurar BOARD_VNDK_VERSION
BOARD_VNDK_VERSION
muestra la versión de VNDK que deben compilar los módulos de proveedores actuales. Si BOARD_VNDK_VERSION
tiene una versión de instantánea del VNDK disponible en el directorio /prebuilts/vndk
, se instala la instantánea del VNDK indicada en BOARD_VNDK_VERSION
. Si la instantánea de VNDK no está disponible en el directorio, se produce un error de compilación.
La definición de BOARD_VNDK_VERSION
también permite que se instalen los módulos de VNDK. Los módulos de proveedores se vinculan con la versión de instantánea del VNDK definida en BOARD_VNDK_VERSION
en el momento de la compilación (esto no compila los módulos de VNDK actuales en la fuente del sistema). Cuando se descarga el árbol de fuentes completo de un repositorio, las fuentes del sistema y del proveedor se basan en la misma versión de Android.
Establece PRODUCT_EXTRA_VNDK_VERSIONS
PRODUCT_EXTRA_VNDK_VERSIONS
enumera las versiones adicionales de VNDK que se instalarán. Por lo general, es suficiente tener una instantánea de VNDK para la partición del proveedor actual. Sin embargo, en algunos casos, es posible que debas incluir varias
instantáneas en una imagen del sistema. Por ejemplo, el GSI tiene varias instantáneas para admitir varias versiones de proveedores con una imagen del sistema. Si configuras PRODUCT_EXTRA_VNDK_VERSIONS
, puedes instalar los módulos de instantáneas del VNDK, además de la versión del VNDK en BOARD_VNDK_VERSION
.
Si PRODUCT_EXTRA_VNDK_VERSIONS
tiene una lista específica de versiones, el sistema de compilación busca instantáneas compiladas previamente de la lista de versiones en el directorio prebuilts/vndk
. Si el sistema de compilación encuentra todas las instantáneas enumeradas, instala esos archivos de instantáneas en cada APEX de VNDK (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER
). Las versiones faltantes generan un error de compilación.
Los módulos de VNDK no se vinculan con los módulos del proveedor en el tiempo de compilación, pero se pueden usar en el tiempo de ejecución si los módulos del proveedor en la partición del proveedor requieren una de las versiones de VNDK instaladas. PRODUCT_EXTRA_VNDK_VERSIONS
solo es válido si se define BOARD_VNDK_VERSION
.
PLATFORM_VNDK_VERSION
PLATFORM_VNDK_VERSION
define la versión de VNDK para los módulos de VNDK actuales en la fuente del sistema. El valor se establece automáticamente:
- Antes del lanzamiento,
PLATFORM_VNDK_VERSION
se establece comoPLATFORM_VERSION_CODENAME
. - En el lanzamiento,
PLATFORM_SDK_VERSION
se copia enPLATFORM_VNDK_VERSION
.
Después de que se lanza la versión de Android, las bibliotecas actuales de VNDK se instalan en VNDK APEX (/system/apex/com.android.vndk.vVER
), donde VER
es la versión almacenada en PLATFORM_VNDK_VERSION
.
Cuando BOARD_VNDK_VERSION
se establece en current
, PLATFORM_VNDK_VERSION
se almacena en ro.vndk.version
, de lo contrario, BOARD_VNDK_VERSION
se almacena en ro.vndk.version
. PLATFORM_VNDK_VERSION
se establece en la versión del SDK cuando se lanza Android. Antes del lanzamiento, se usa el nombre de código alfanumérico de Android para PLATFORM_VNDK_VERSION
.
Resumen de la configuración de la versión de VNDK
En la tabla, se resume la configuración de la versión de VNDK.
Compilación del proveedor |
Versión de la placa |
Versión del SDK |
Versión de la plataforma |
Propiedad Version |
Directorio de instalación |
---|---|---|---|---|---|
Módulos actuales de VNDK | current |
Antes | CODE_NAME |
CODE_NAME |
/system/apex/com.android.vndk.vCODE_NAME |
Después | SDK_VER |
SDK_VER |
/system/apex/com.android.vndk.vSDK_VER |
||
Módulos de instantáneas compilados previamente | VNDK_VER para la instantánea |
Antes o después | CODE_NAME o SDK_VER |
VNDK_VER |
/system_ext/apex/com.android.vndk.vVNDK_VER |
- Versión de la placa (
BOARD_VNDK_VERSION
): Es la versión del VNDK que requieren los módulos del proveedor para compilarse. Configúralo encurrent
si los módulos del proveedor pueden vincularse con los módulos del sistema actuales. - Versión de la plataforma (
PLATFORM_VNDK_VERSION
): Es la versión de VNDK que compilan los módulos del sistema actuales. Se compila solo cuandoBOARD_VNDK_VERSION
es igual al valor actual. - Propiedad de versión (
ro.vndk.version
): Es una propiedad que especifica la versión de VNDK que requieren las bibliotecas y los objetos binarios en vendor.img para ejecutarse. Se almacena envendor.img
en/vendor/default.prop
.