Generación de instantáneas de VNDK

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 de 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 de fuentes de Android. Para fines de desarrollo, puede crear instantáneas de VNDK localmente. Las instantáneas de VNDK son compatibles con los sabores arm, arm64, x86 y x86_64 TARGET_ARCH .

Instantáneas del edificio

El servidor de compilación de Android genera artefactos de compilación y archivos de instantáneas de VNDK mediante los siguientes parámetros y comandos de compilación.

Parámetros de compilación

El nombre del destino de compilación es vndk . La configuración de destino 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 de destino de Generic System Image (GSI) ( arm , arm64 , x86 , x86_64 ).
  • TARGET_ARCH_VARIANT . Para snapshot v28 (Android 9) y superior, incluye las configuraciones populares enumeradas anteriormente.

Construir comandos

Para 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 el script build.sh para compilar todos los sabores de arco admitidos 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 origen local con los siguientes comandos.

  • Para construir todos los arcos admitidos a la vez, ejecute el siguiente script de construcció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 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 librerías compartidas LL-NDK no son necesarias ya que son compatibles con versiones anteriores.
    • Para objetivos de 64 bits, se crean e 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 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 de VNDK determinado, android-vndk-$(TARGET_ARCH).zip , las bibliotecas precompiladas de VNDK se agrupan en directorios independientes 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 debajo arch-arm64-armv8-a y ​​las bibliotecas de 32 bits se colocan debajo 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 ).

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

Creación de instantáneas de proveedores

Android 11 es compatible con las instantáneas de proveedores , que le permiten compilar vendor.img independientemente de la versión de Android en el árbol de fuentes. Una instantánea de VNDK predeterminada contiene los archivos de biblioteca compartidos ( .so ) que se pueden instalar en los dispositivos y luego vincular 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 marcas exportadas.

Para generar dichos artefactos (junto con la instantánea de VNDK) desde un árbol de origen local, use el siguiente comando.

VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh

Este comando crea 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 normal de VNDK (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

Carga de instantáneas de VNDK

Las instantáneas de VNDK se verifican en el árbol de origen en /prebuilts/vndk/v VER , donde VER es igual a la versión de la instantánea de VNDK (que sigue a la versión SDK de la versión correspondiente de Android). 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 de VNDK precompilada 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:

  1. En /prebuilts/vndk/v VER , usa repo start para crear una nueva rama de Git.
  2. Obtiene y descomprime artefactos de creación de instantáneas 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 prediseñadas con licencia bajo la Licencia pública general (GPL) tengan fuentes publicadas en el árbol de fuentes actual.
  5. Utiliza git commit para confirmar nuevos cambios.

Uso de instantáneas de VNDK creadas localmente

También puede usar instantáneas de VNDK creadas localmente. Cuando se especifica la opción --local , el script update.py obtiene artefactos de compilación de instantáneas VNDK desde $DIST_DIR local (en lugar del servidor de compilación de Android) y omite los pasos de verificación de licencia GPL y git commit . Para instalar una instantánea de VNDK compilada localmente, navegue hasta el directorio de destino y use el script update.py .

Sintaxis:

python update.py VER --local

Comando de ejemplo para actualizar la instantánea de VNDK de Android 8.1 con artefactos de compilación locales:

python update.py 27 --local

Estructura de directorio de ejemplo de una instantánea de VNDK compilada 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 local se agregan automáticamente si los artefactos se compilaron con VNDK_SNAPSHOT_BUILD_ARTIFACTS=true .

Instalación de instantáneas de VNDK

La imagen del sistema instala bibliotecas de instantáneas de VNDK en el momento de la compilación utilizando la información de 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 ) mediante una de las siguientes opciones.

  • Opción 1: BOARD_VNDK_VERSION . Utilice los módulos de instantáneas para crear los módulos de proveedores actuales e instale solo los módulos de instantáneas necesarios para los módulos de proveedores.
  • 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 de VNDK precompiladas enumeradas en PRODUCT_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 se requieren para construir los módulos del proveedor actual. 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.

Definir 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 compila 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 de VNDK para la partición del proveedor actual. Sin embargo, en algunos casos, es posible que deba incluir varias instantáneas en una imagen del sistema. Por ejemplo, GSI tiene múltiples instantáneas para admitir múltiples versiones de 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 preconstruidas 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 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 .

PLATAFORMA_VNDK_VERSIÓN

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 como PLATFORM_VERSION_CODENAME .
  • En el lanzamiento, PLATFORM_SDK_VERSION se copia en PLATFORM_VNDK_VERSION .

Después del lanzamiento de 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 SDK cuando se lanza Android; antes del lanzamiento, el nombre de código alfanumérico de Android se usa para PLATFORM_VNDK_VERSION .

Resumen de la configuración de la versión de VNDK

La siguiente tabla resume la configuración de la versión de VNDK.

Vendedor
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 preconstruidos 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 placa ( BOARD_VNDK_VERSION ). Versión de VNDK que los módulos del proveedor requieren para construir. Establézcalo como current si los módulos del proveedor pueden vincularse con los módulos del sistema actual.
  • Versión de la plataforma ( PLATFORM_VNDK_VERSION ). Versión de VNDK que están construyendo los módulos del sistema actual. Construido solo cuando BOARD_VNDK_VERSION es igual a actual.
  • Propiedad de versión ( ro.vndk.version ). Propiedad que especifica la versión de VNDK que requieren los archivos binarios y las bibliotecas de vendor.img para ejecutarse. Almacenado en vendor.img en /vendor/default.prop .