Génération d'instantanés VNDK

Un instantané VNDK est un ensemble de bibliothèques VNDK-core et VNDK-SP pour une version Android. Vous pouvez mettre à niveau uniquement la partition système si le system.img inclut l'instantané VNDK correspondant requis par le vendor.img .

Les instantanés VNDK officiels sont créés automatiquement sur le serveur de build Android et archivés dans /prebuilts/vndk de l'arborescence des sources Android. À des fins de développement, vous pouvez créer des instantanés VNDK localement. Les instantanés VNDK sont pris en charge pour les versions arm, arm64, x86 et x86_64 TARGET_ARCH .

Création d'instantanés

Le serveur de build Android génère des artefacts de build et des fichiers d'instantanés VNDK à l'aide des paramètres de build et des commandes de build suivants.

Paramètres de construction

Le nom de la cible de build est vndk . La configuration de la cible de build est présentée ci-dessous.

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 est identique aux arcs cibles GSI (Generic System Image) ( arm , arm64 , x86 , x86_64 ).
  • TARGET_ARCH_VARIANT . Pour les instantanés v28 (Android 9) et versions ultérieures, inclut les configurations populaires répertoriées ci-dessus.

Construire des commandes

Pour les instantanés officiels, Android 9 et versions ultérieures incluent un exemple de cible ( vndk ) dans vndk.mk qui crée et génère un instantané VNDK vers $DIST_DIR . Le fichier ZIP de l'instantané utilise le format android-vndk-$(TARGET_ARCH).zip . Par exemple:

lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]

Le serveur de build Android utilise le script build.sh pour créer toutes les versions d'arch prises en charge avec la commande suivante.

DIST_DIR=dist_dir development/vndk/snapshot/build.sh

L'instantané VNDK pour une version Android est généré à partir de la branche de publication de cette version.

Construire localement

Pendant le développement, vous pouvez créer des instantanés VNDK à partir d'une arborescence source locale avec les commandes suivantes.

  • Pour créer toutes les arches prises en charge en même temps, exécutez le script de construction suivant ( build.sh ).
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • Pour créer un TARGET_ARCH spécifique, exécutez les commandes suivantes.
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist
    

Le fichier android-vndk-$(TARGET_ARCH).zip correspondant est créé sous $DIST_DIR .

Fichiers d'instantanés

Un instantané VNDK comprend les fichiers suivants.

  • Variante du fournisseur des bibliothèques partagées VNDK-core et VNDK-SP.
    • Les bibliothèques partagées LL-NDK ne sont pas nécessaires car elles sont rétrocompatibles.
    • Pour les cibles 64 bits, les bibliothèques TARGET_ARCH et TARGET_2ND_ARCH sont créées et incluses.
  • La liste des bibliothèques privées VNDK-core, VNDK-SP, LL-NDK et VNDK se trouve sur [vndkcore|vndksp|llndk|vndkprivate].libraries.txt .
  • Fichiers de licence.
  • module_paths.txt . Enregistre les chemins de module pour toutes les bibliothèques VNDK, ce qui est nécessaire pour vérifier que les projets GPL ont des sources publiées dans une arborescence de sources Android donnée.

Pour un fichier ZIP d'instantané VNDK donné, android-vndk-$(TARGET_ARCH).zip , les bibliothèques prédéfinies du VNDK sont regroupées dans des répertoires distincts nommés arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) en fonction du nombre de bits ABI. Par exemple, pour android-vndk-arm64.zip , les bibliothèques 64 bits sont placées sous arch-arm64-armv8-a et les bibliothèques 32 bits sont placées sous arch-arm-armv8-a . L'exemple ci-dessous montre la structure de répertoires d'un fichier ZIP d'instantané VNDK arm64 ( TARGET_ARCH=arm64 ) ( android-vndk-arm64.zip ).

Structure du répertoire des instantanés VNDK
Figure 1. Structure du répertoire des instantanés VNDK (exemple)

Création d'instantanés de fournisseurs

Android 11 prend en charge les instantanés du fournisseur , qui vous permettent de créer vendor.img quelle que soit la version d'Android dans l'arborescence source. Un instantané VNDK par défaut contient les fichiers de bibliothèque partagés ( .so ) qui peuvent être installés sur les appareils, puis liés à partir des binaires C++ du fournisseur au moment de l'exécution. Pour construire à partir de cet instantané VNDK, vous avez besoin d'artefacts supplémentaires tels que des fichiers d'en-tête et des indicateurs exportés.

Pour générer de tels artefacts (avec l'instantané VNDK) à partir d'une arborescence source locale, utilisez la commande suivante.

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

Cette commande crée des fichiers android-vndk-$(TARGET_ARCH).zip sous $DIST_DIR . L'exemple ci-dessous est un fichier ZIP d'instantané arm64 VNDK avec des artefacts de construction. Les fichiers en gras sont des fichiers récemment ajoutés à l'instantané VNDK normal (illustré dans la figure 1) et incluent les fichiers JSON (qui stockent cflags de chaque bibliothèque) et tous les fichiers d'en-tête exportés.

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

Téléchargement d'instantanés VNDK

Les instantanés VNDK sont vérifiés dans l'arborescence source sous /prebuilts/vndk/v VER , où VER est égal à la version de l'instantané VNDK (qui suit la version SDK de la version Android correspondante). Par exemple, l'instantané Android 8.1 VNDK a la version 27.

Utilisation du script update.py

Le script update.py ( /development/vndk/snapshot/update.py ) automatise le processus d'ajout d'un instantané VNDK prédéfini à l'arborescence source. Il détecte automatiquement les artefacts de construction et remplit de manière appropriée les propriétés associées dans le Android.bp généré. Ce script effectue les tâches suivantes :

  1. Dans /prebuilts/vndk/v VER , utilise repo start pour créer une nouvelle branche Git.
  2. Récupère et décompresse les artefacts de création d’instantanés VNDK.
  3. Exécute gen_buildfiles.py pour générer automatiquement les fichiers de construction ( Android.bp ).
  4. Exécute check_gpl_license.py pour vérifier que les bibliothèques prédéfinies sous licence GPL (General Public License) ont des sources publiées dans l'arborescence des sources actuelle.
  5. Utilise git commit pour valider de nouvelles modifications.

Utilisation d'instantanés VNDK créés localement

Vous pouvez également utiliser des instantanés VNDK créés localement. Lorsque l'option --local est spécifiée, le script update.py récupère les artefacts de génération d'instantanés VNDK à partir du répertoire local spécifié (au lieu du serveur de build Android) qui contient les fichiers android-vndk-$(TARGET_ARCH).zip générés à partir du development/vndk/snapshot/build.sh . development/vndk/snapshot/build.sh . Avec l'option --local , le script update.py ignore la vérification de la licence GPL et les étapes git commit .

Syntaxe:

python update.py VER --local local_path

Exemple de commande pour mettre à jour l'instantané VNDK Android 8.1 avec des artefacts de build locaux dans /path/to/local/dir :

python update.py 27 --local /path/to/local/dir

Exemple de structure de répertoires d'un instantané VNDK construit localement :

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)
Les artefacts de construction locaux sont ajoutés automatiquement si les artefacts ont été construits avec VNDK_SNAPSHOT_BUILD_ARTIFACTS=true .

Installation des instantanés VNDK

L'image système installe les bibliothèques d'instantanés VNDK au moment de la construction à l'aide des informations contenues dans BOARD_VNDK_VERSION , PRODUCT_EXTRA_VNDK_VERSIONS et ro.vndk.version . Vous pouvez contrôler quels instantanés VNDK sont installés à partir des répertoires d'instantanés VNDK prédéfinis (par exemple, /prebuilts/vndk/v29 ou /prebuilts/vndk/v30 ) à l'aide de l'une des options suivantes.

  • Option 1 : BOARD_VNDK_VERSION . Utilisez les modules de cliché pour créer les modules du fournisseur actuel et installez uniquement les modules de cliché requis pour les modules du fournisseur.
  • Option 2 : PRODUCT_EXTRA_VNDK_VERSIONS . Installez les modules d'instantanés VNDK quels que soient les modules du fournisseur actuel. Cela installe les instantanés VNDK prédéfinis répertoriés dans PRODUCT_EXTRA_VNDK_VERSIONS sans les lier à d'autres modules au moment de la construction.

Paramètre BOARD_VNDK_VERSION

BOARD_VNDK_VERSION affiche la version VNDK que les modules du fournisseur actuel doivent créer. Si BOARD_VNDK_VERSION dispose d'une version d'instantané VNDK disponible dans le répertoire /prebuilts/vndk , l'instantané VNDK indiqué dans BOARD_VNDK_VERSION est installé. Si l'instantané VNDK n'est pas disponible dans le répertoire, une erreur de génération se produit.

Définir BOARD_VNDK_VERSION permet également d'installer les modules VNDK. Les modules du fournisseur sont liés à la version de l'instantané VNDK définie dans BOARD_VNDK_VERSION au moment de la construction (cela ne crée pas les modules VNDK actuels dans la source système). Lors du téléchargement de l'arborescence complète des sources à partir d'un référentiel, les sources du système et du fournisseur sont basées sur la même version d'Android.

Paramètre PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS répertorie les versions supplémentaires du VNDK à installer. Normalement, il suffit d'avoir un instantané VNDK pour la partition actuelle du fournisseur. Cependant, dans certains cas, vous devrez peut-être inclure plusieurs instantanés dans une seule image système. Par exemple, le GSI dispose de plusieurs instantanés pour prendre en charge plusieurs versions de fournisseurs avec une seule image système. En définissant PRODUCT_EXTRA_VNDK_VERSIONS , vous pouvez installer les modules d'instantanés VNDK en plus de la version VNDK dans BOARD_VNDK_VERSION .

Si PRODUCT_EXTRA_VNDK_VERSIONS possède une liste spécifique de versions, le système de build recherche des instantanés prédéfinis de la liste des versions dans le répertoire prebuilts/vndk . Si le système de build localise tous les instantanés répertoriés, il installe ces fichiers d'instantanés sur chaque VNDK APEX ( out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.v VER . Les versions manquantes génèrent une erreur de build.

Les modules VNDK ne sont pas liés aux modules du fournisseur au moment de la construction, mais peuvent être utilisés au moment de l'exécution si les modules du fournisseur dans la partition du fournisseur nécessitent l'une des versions VNDK installées. PRODUCT_EXTRA_VNDK_VERSIONS est valide uniquement si BOARD_VNDK_VERSION est défini.

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION définit la version VNDK pour les modules VNDK actuels dans la source système. La valeur est définie automatiquement :

  • Avant la sortie, PLATFORM_VNDK_VERSION est défini sur PLATFORM_VERSION_CODENAME .
  • Lors de la sortie, PLATFORM_SDK_VERSION est copié dans PLATFORM_VNDK_VERSION .

Une fois la version Android publiée, les bibliothèques VNDK actuelles sont installées sur VNDK APEX ( /system/apex/com.android.vndk.v VER ), où VER est la version stockée dans PLATFORM_VNDK_VERSION .

Lorsque BOARD_VNDK_VERSION est défini sur current , PLATFORM_VNDK_VERSION est stocké dans ro.vndk.version , sinon BOARD_VNDK_VERSION est stocké dans ro.vndk.version . PLATFORM_VNDK_VERSION est défini sur la version du SDK lors de la sortie d'Android ; avant la sortie, le nom de code Android alphanumérique est utilisé pour PLATFORM_VNDK_VERSION .

Résumé des paramètres de version du VNDK

Le tableau ci-dessous résume les paramètres de la version VNDK.

Fournisseur
Construire
Conseil
Version
SDK
Libérer
Plate-forme
Version
Version
Propriété
Répertoire d'installation
Modules VNDK actuels current Avant CODE_NAME CODE_NAME /system/apex/com.android.vndk.v CODE_NAME
Après SDK_VER SDK_VER /system/apex/com.android.vndk.v SDK_VER
Modules d'instantanés prédéfinis VNDK_VER
pour un instantané
Avant ou après CODE_NAME
ou SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.v VNDK_VER
  • Version de la carte ( BOARD_VNDK_VERSION ). Version VNDK dont les modules du fournisseur ont besoin pour être construits. Défini sur current si les modules du fournisseur peuvent être liés aux modules système actuels.
  • Version de la plateforme ( PLATFORM_VNDK_VERSION ). Version VNDK construite par les modules système actuels. Construit uniquement lorsque BOARD_VNDK_VERSION est égal au courant.
  • Propriété Version ( ro.vndk.version ). Propriété qui spécifie la version VNDK dont les binaires et les bibliothèques de supplier.img ont besoin pour s'exécuter. Stocké dans le vendor.img à /vendor/default.prop .