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

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 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:

  1. En /prebuilts/vndk/v VER , usa repo start para crear una nueva rama de Git.
  2. Recupera y descomprime los artefactos de compilació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 pública general (GPL) tengan fuentes publicadas en el árbol de fuentes actual.
  5. 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 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 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 como PLATFORM_VERSION_CODENAME .
  • En el momento del lanzamiento, PLATFORM_SDK_VERSION se copia en PLATFORM_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 en current 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 cuando BOARD_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 en vendor.img en /vendor/default.prop .