Una instantánea de VNDK es un conjunto de bibliotecas VNDK-core y VNDK-SP para una versión de Android. Puede actualizar solo la partición del sistema si system.img
incluye la instantánea VNDK correspondiente que necesita vendor.img
.
Las instantáneas oficiales de VNDK se crean automáticamente en el servidor de compilación de Android y se registran en /prebuilts/vndk
del árbol de fuentes de Android. Para fines de desarrollo, puede crear instantáneas de VNDK localmente. Las instantáneas VNDK son compatibles con los tipos TARGET_ARCH
arm, arm64, x86 y x86_64.
Instantáneas de construcción
El servidor de compilación de Android genera artefactos de compilación y archivos de instantáneas VNDK utilizando los siguientes parámetros y comandos de compilación.
Parámetros de construcción
El nombre del objetivo de compilación es vndk
. La configuración del objetivo de compilación se muestra a continuació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 arcos objetivo de Imagen de sistema genérico (GSI) (arm
,arm64
,x86
,x86_64
). -
TARGET_ARCH_VARIANT
. Para instantáneas v28 (Android 9) y superiores, incluye las configuraciones populares enumeradas anteriormente.
Comandos de compilación
Para las instantáneas oficiales, Android 9 y versiones posteriores incluyen un destino de muestra ( vndk
) en vndk.mk
que crea y genera una instantánea VNDK en $DIST_DIR
. El archivo ZIP de instantánea utiliza 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 utiliza el script build.sh
para compilar todos los tipos de arch compatibles con el siguiente comando.
DIST_DIR=dist_dir development/vndk/snapshot/build.sh
La instantánea de VNDK para una versión de Android se genera a partir de la rama de lanzamiento de esa versión.
Construyendo localmente
Durante el desarrollo, puede crear instantáneas de VNDK desde un árbol de fuentes local con los siguientes comandos.
- Para construir todos los arcos compatibles a la vez, ejecute el siguiente script de compilación (
build.sh
).cd $ANDROID_BUILD_TOP
development/vndk/snapshot/build.sh
- Para construir un
TARGET_ARCH
específico, ejecute los siguientes comandos.lunch aosp_TARGET_ARCH-user
m -j vndk dist
El archivo android-vndk-$(TARGET_ARCH).zip
correspondiente se crea en $DIST_DIR
.
Archivos de instantáneas
Una instantánea de VNDK incluye los siguientes archivos.
- Variante de proveedor de bibliotecas compartidas VNDK-core y VNDK-SP.
- Las bibliotecas compartidas LL-NDK no son necesarias porque son compatibles con versiones anteriores.
- Para objetivos de 64 bits, se crean e 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 los módulos para todas las bibliotecas VNDK, lo cual es necesario para verificar que los proyectos GPL tengan fuentes publicadas en un árbol de fuentes de Android determinado.
Para un archivo ZIP de instantánea VNDK determinado, android-vndk-$(TARGET_ARCH).zip
, las bibliotecas precompiladas de VNDK se agrupan en directorios separados denominados arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT)
según el bitness de ABI. Por ejemplo, para android-vndk-arm64.zip
, las bibliotecas de 64 bits se colocan en arch-arm64-armv8-a
y las bibliotecas de 32 bits se colocan en arch-arm-armv8-a
. El siguiente ejemplo muestra la estructura de directorios para un archivo ZIP de instantánea VNDK arm64 ( TARGET_ARCH=arm64
) ( android-vndk-arm64.zip
).
Creación de instantáneas de proveedores
Android 11 admite instantáneas de proveedores , que le permiten crear vendor.img
independientemente de la versión de Android en el árbol de origen. Una instantánea VNDK predeterminada contiene los archivos de biblioteca compartidos ( .so
) que se pueden instalar en los dispositivos y luego vincularse desde los archivos binarios de C++ del proveedor en tiempo de ejecución. Para compilar con esa instantánea de VNDK, necesita artefactos adicionales, como archivos de encabezado y indicadores exportados.
Para generar dichos artefactos (junto con la instantánea de VNDK) desde un árbol de fuentes local, use 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 arm64 VNDK con artefactos de compilación. Los archivos en negrita son archivos recién agregados a la instantánea VNDK normal (que se muestra en la Figura 1) e 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
Cargando instantáneas de VNDK
Las instantáneas de VNDK se verifican en el árbol de fuentes en /prebuilts/vndk/v VER
, donde VER
es igual a la versión de la instantánea de VNDK (que sigue la versión SDK de la versión de Android correspondiente). Por ejemplo, la instantánea de Android 8.1 VNDK tiene la versión 27.
Usando el script update.py
El script update.py
( /development/vndk/snapshot/update.py
) automatiza el proceso de agregar una instantánea VNDK prediseñada al árbol de origen. Detecta automáticamente artefactos de compilación y completa adecuadamente las propiedades asociadas en el Android.bp
generado. Este script realiza las siguientes tareas:
- En
/prebuilts/vndk/v VER
, usarepo start
para crear una nueva rama de Git. - Recupera y descomprime los artefactos de compilación de instantáneas 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 prediseñadas con licencia pública general (GPL) tengan fuentes publicadas en el árbol de fuentes actual. - Utiliza
git commit
para realizar nuevos cambios.
Uso de instantáneas VNDK creadas localmente
También puede utilizar instantáneas VNDK creadas localmente. Cuando se especifica la opción --local
, el script update.py
recupera los 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 del development/vndk/snapshot/build.sh
. Con la opción --local
, el script 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 VNDK de Android 8.1 con artefactos de compilación locales en /path/to/local/dir
:
python update.py 27 --local /path/to/local/dir
Ejemplo de estructura de directorios de una instantánea VNDK creada localmente:
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)Los artefactos de compilación locales se agregan automáticamente si los artefactos se crearon con
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true
.Instalación de instantáneas de VNDK
La imagen del sistema instala bibliotecas de instantáneas VNDK en el momento de la compilación utilizando la información en BOARD_VNDK_VERSION
, PRODUCT_EXTRA_VNDK_VERSIONS
y ro.vndk.version
. Puede controlar qué instantáneas de VNDK se instalan desde los directorios de instantáneas de VNDK precompilados (por ejemplo, /prebuilts/vndk/v29
o /prebuilts/vndk/v30
) usando una de las siguientes opciones.
- Opción 1:
BOARD_VNDK_VERSION
. Utilice los módulos de instantáneas para crear los módulos de proveedor actuales e instale solo los módulos de instantáneas que sean necesarios para los módulos de proveedor. - Opción 2:
PRODUCT_EXTRA_VNDK_VERSIONS
. Instale los módulos de instantáneas de VNDK independientemente de los módulos del proveedor actual. Esto instala las instantáneas VNDK prediseñadas enumeradas enPRODUCT_EXTRA_VNDK_VERSIONS
sin vincularlas a ningún otro módulo en el momento de la compilación.
Configuración BOARD_VNDK_VERSION
BOARD_VNDK_VERSION
muestra la versión de VNDK que los módulos del proveedor actual deben compilar. Si BOARD_VNDK_VERSION
tiene una versión de instantánea de VNDK disponible en el directorio /prebuilts/vndk
, se instala la instantánea de 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 instalar los módulos VNDK. Los módulos del proveedor se vinculan con la versión instantánea de VNDK definida en BOARD_VNDK_VERSION
en el momento de la compilación (esto no crea los módulos VNDK actuales en la fuente del sistema). Al descargar el árbol de fuentes completo desde un repositorio, tanto las fuentes del sistema como las del proveedor se basan en la misma versión de Android.
Configuración de PRODUCT_EXTRA_VNDK_VERSIONS
PRODUCT_EXTRA_VNDK_VERSIONS
enumera las versiones adicionales de VNDK que se instalarán. Normalmente es suficiente tener una instantánea VNDK para la partición del proveedor actual. Sin embargo, en algunos casos es posible que necesites incluir varias instantáneas en una imagen del sistema. Por ejemplo, GSI tiene varias instantáneas para admitir versiones de varios proveedores con una imagen del sistema. Al configurar PRODUCT_EXTRA_VNDK_VERSIONS
, puede instalar los módulos de instantáneas de VNDK además de la versión de 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 prediseñadas de la lista de versiones en el directorio prebuilts/vndk
. Si el sistema de compilación localiza todas las instantáneas enumeradas, instala esos archivos de instantáneas en cada VNDK APEX ( out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.v VER
. Las versiones faltantes generan un error de compilación.
Los módulos VNDK no se vinculan con los módulos del proveedor en el momento de la 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
es válido solo si se define BOARD_VNDK_VERSION
.
PLATAFORMA_VNDK_VERSION
PLATFORM_VNDK_VERSION
define la versión de VNDK para los módulos 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 momento del lanzamiento,
PLATFORM_SDK_VERSION
se copia enPLATFORM_VNDK_VERSION
.
Después de que se lanza la versión de Android, las bibliotecas VNDK actuales se instalan en VNDK APEX ( /system/apex/com.android.vndk.v VER
), 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 utiliza el nombre de código alfanumérico de Android para PLATFORM_VNDK_VERSION
.
Resumen de la configuración de la versión VNDK
La siguiente tabla resume la configuración de la versión de VNDK.
Proveedor Construir | Junta Versión | SDK Liberar | Plataforma Versión | Versión Propiedad | Directorio de instalación |
---|---|---|---|---|---|
Módulos VNDK actuales | current | Antes | CODE_NAME | CODE_NAME | /system/apex/com.android.vndk.v CODE_NAME |
Después | SDK_VER | SDK_VER | /system/apex/com.android.vndk.v SDK_VER | ||
Módulos de instantáneas prediseñados | VNDK_VER para instantánea | Antes o después | CODE_NAME o SDK_VER | VNDK_VER | /system_ext/apex/com.android.vndk.v VNDK_VER |
- Versión de la placa (
BOARD_VNDK_VERSION
). Versión de VNDK que los módulos del proveedor requieren para construir. Establezca encurrent
si los módulos del proveedor pueden vincularse con los módulos del sistema actual. - Versión de plataforma (
PLATFORM_VNDK_VERSION
). Versión VNDK que están construyendo los módulos actuales del sistema. Construido solo cuandoBOARD_VNDK_VERSION
es igual a actual. - Propiedad de versión (
ro.vndk.version
). Propiedad que especifica la versión de VNDK que los archivos binarios y bibliotecas en proveedor.img requieren para ejecutarse. Almacenado envendor.img
en/vendor/default.prop
.