Generar resúmenes del VNDK

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 y TARGET_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).

Estructura del directorio de instantáneas del VNDK
Figura 1: Estructura del directorio de instantáneas del VNDK (ejemplo)

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:

  1. En /prebuilts/vndk/vVER, usa repo start para crear una nueva rama de Git.
  2. Recupera y descomprime los artefactos de compilación de resúmenes de VNDK.
  3. Ejecuta gen_buildfiles.py para generar automáticamente los archivos de compilación (Android.bp).
  4. 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.
  5. 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)
Los artefactos de compilación locales se agregan automáticamente si se compilaron con 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 en PRODUCT_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 como PLATFORM_VERSION_CODENAME.
  • En el lanzamiento, PLATFORM_SDK_VERSION se copia en PLATFORM_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 en current 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 cuando BOARD_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 en vendor.img en /vendor/default.prop.