Un instantané VNDK est un ensemble de bibliothèques VNDK-core et VNDK-SP pour une version Android.
Vous ne pouvez mettre à niveau que la partition système si system.img
inclut l'instantané VNDK correspondant requis par vendor.img
.
Les instantanés officiels du VNDK sont compilés automatiquement sur le serveur de compilation Android et enregistrés dans /prebuilts/vndk
de l'arborescence source Android. À des fins de développement, vous pouvez créer des instantanés VNDK localement. Les instantanés VNDK sont compatibles avec les variantes TARGET_ARCH
arm, arm64, x86 et x86_64.
Créer des instantanés
Le serveur de compilation Android génère des artefacts de compilation et des fichiers d'instantané VNDK à l'aide des paramètres et des commandes de compilation suivants.
Paramètres de compilation
Le nom de la cible de compilation est vndk
. La configuration de la cible de compilation est illustré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 architectures cibles de l'image système générique (GSI) (arm
,arm64
,x86
,x86_64
).TARGET_ARCH_VARIANT
. Pour les instantanés v28 (Android 9) et versions ultérieures, inclut les configurations populaires listées ci-dessus.
Commandes de compilation
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 dans $DIST_DIR
. Le fichier ZIP de l'instantané utilise le format android-vndk-$(TARGET_ARCH).zip
.
Exemple :
lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]
Le serveur de compilation Android utilise le script build.sh
pour compiler toutes les variantes d'architectures compatibles à l'aide de la commande suivante.
DIST_DIR=dist_dir development/vndk/snapshot/build.sh
L'instantané VNDK d'une version d'Android est généré à partir de la branche de publication de cette version.
Compiler en local
Lors du développement, vous pouvez créer des instantanés VNDK à partir d'un arbre de sources local à l'aide des commandes suivantes.
- Pour compiler toutes les architectures compatibles en même temps, exécutez le script de compilation 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 inclut 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
etTARGET_2ND_ARCH
sont compilées et incluses.
- La liste des bibliothèques VNDK-core, VNDK-SP, LL-NDK et VNDK-private est disponible sur
[vndkcore|vndksp|llndk|vndkprivate].libraries.txt
. - Fichiers de licence.
module_paths.txt
. Enregistre les chemins d'accès aux modules pour toutes les bibliothèques VNDK, ce qui est nécessaire pour vérifier que les projets GPL ont des sources publiées dans un arbre de sources Android donné.
Pour un fichier ZIP d'instantané VNDK donné, android-vndk-$(TARGET_ARCH).zip
, les bibliothèques précompilées VNDK sont regroupées dans des répertoires distincts nommés arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT)
en fonction de la taille d'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épertoire d'un fichier ZIP d'instantané VNDK (android-vndk-arm64.zip
) arm64 (TARGET_ARCH=arm64
).

Créer des instantanés de fournisseurs
Android 11 est compatible avec les instantanés du fournisseur, qui vous permettent de compiler 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ée (.so
) pouvant être installés sur les appareils, puis associés à partir des binaires C++ du fournisseur au moment de l'exécution. Pour compiler à l'aide 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 ces artefacts (avec l'instantané VNDK) à partir d'un arbre de sources local, exécutez 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é VNDK arm64 avec des artefacts de compilation. Les fichiers en gras sont des fichiers nouvellement ajoutés à l'instantané VNDK normal (illustré à la figure 1). Ils incluent les fichiers JSON (qui stockent les 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
Importer des instantanés VNDK
Les instantanés VNDK sont vérifiés dans l'arborescence source sous /prebuilts/vndk/vVER
, où VER
est égal à la version de l'instantané VNDK (qui suit la version du SDK de la version Android correspondante). Par exemple, l'instantané du VNDK Android 8.1 est la version 27.
Utiliser le 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 compilation et renseigne les propriétés associées dans le fichier Android.bp
généré. Ce script effectue les tâches suivantes:
- Dans
/prebuilts/vndk/vVER
, utiliserepo start
pour créer une branche Git. - Récupère et décompresse les artefacts de compilation d'instantanés VNDK.
- Exécute
gen_buildfiles.py
pour générer automatiquement les fichiers de compilation (Android.bp
). - Exécute
check_gpl_license.py
pour vérifier que les bibliothèques précompilées sous licence GPL (General Public License) ont des sources publiées dans l'arborescence de sources actuelle. - Utilise
git commit
pour valider les nouvelles modifications.
Utiliser des instantanés VNDK compilés localement
Vous pouvez également utiliser des instantanés VNDK compilés en local. Lorsque l'option --local
est spécifiée, le script update.py
récupère les artefacts de compilation de l'instantané VNDK à partir du répertoire local spécifié (au lieu du serveur de compilation Android) qui contient les fichiers android-vndk-$(TARGET_ARCH).zip
générés à partir de 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 compilation locale dans /path/to/local/dir
:
python update.py 27 --local /path/to/local/dir
Exemple de structure de répertoire d'un instantané VNDK créé 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)
VNDK_SNAPSHOT_BUILD_ARTIFACTS=true
.
Installer des instantanés VNDK
L'image système installe les bibliothèques d'instantanés VNDK au moment de la compilation à l'aide des informations de BOARD_VNDK_VERSION
, PRODUCT_EXTRA_VNDK_VERSIONS
et ro.vndk.version
.
Vous pouvez contrôler les instantanés VNDK installés à partir des répertoires d'instantanés VNDK précompilés (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 d'instantané pour créer les modules de fournisseurs actuels et n'installez que les modules d'instantané requis pour les modules de fournisseurs. - Option 2:
PRODUCT_EXTRA_VNDK_VERSIONS
. Installez les modules de snapshot VNDK, quel que soit le fournisseur actuel. Cela permet d'installer les instantanés VNDK prédéfinis listés dansPRODUCT_EXTRA_VNDK_VERSIONS
sans les associer à d'autres modules au moment de la compilation.
Définir BOARD_VNDK_VERSION
BOARD_VNDK_VERSION
affiche la version du VNDK requise pour compiler les modules du fournisseur actuels. 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 compilation se produit.
La définition de BOARD_VNDK_VERSION
permet également d'installer les modules VNDK. Les modules du fournisseur sont associés à la version de l'instantané VNDK définie dans BOARD_VNDK_VERSION
au moment de la compilation (cela ne compile pas les modules VNDK actuels dans la source système). Lorsque vous téléchargez l'arborescence source complète à partir d'un dépôt, les sources du système et du fournisseur sont basées sur la même version d'Android.
Définir PRODUCT_EXTRA_VNDK_VERSIONS
PRODUCT_EXTRA_VNDK_VERSIONS
liste les versions VNDK supplémentaires à installer. En règle générale, un seul instantané VNDK suffit pour la partition du fournisseur actuelle. Toutefois, dans certains cas, vous devrez peut-être inclure plusieurs instantanés dans une même 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 de snapshot VNDK en plus de la version VNDK dans BOARD_VNDK_VERSION
.
Si PRODUCT_EXTRA_VNDK_VERSIONS
contient une liste spécifique de versions, le système de compilation recherche des instantanés prédéfinis de la liste des versions dans le répertoire prebuilts/vndk
. Si le système de compilation localise tous les instantanés listés, il installe ces fichiers d'instantanés dans chaque APEX VNDK (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER
). Les versions manquantes génèrent une erreur de compilation.
Les modules VNDK ne sont pas liés aux modules du fournisseur au moment de la compilation, mais peuvent être utilisés au moment de l'exécution si les modules du fournisseur de la partition du fournisseur nécessitent l'une des versions VNDK installées. PRODUCT_EXTRA_VNDK_VERSIONS
n'est valide que 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 publication,
PLATFORM_VNDK_VERSION
est défini surPLATFORM_VERSION_CODENAME
. - Lors de la publication,
PLATFORM_SDK_VERSION
est copié dansPLATFORM_VNDK_VERSION
.
Une fois la version Android publiée, les bibliothèques VNDK actuelles sont installées dans VNDK APEX (/system/apex/com.android.vndk.vVER
), où VER
correspond à 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 publication d'Android. Avant la publication, le nom de code alphanumérique Android est utilisé pour PLATFORM_VNDK_VERSION
.
Résumé des paramètres de version du VNDK
Le tableau récapitule les paramètres de version du VNDK.
Fournisseur Build |
Version de la carte |
Version du SDK |
Version de la plate-forme |
Propriété Version |
Répertoire d'installation |
---|---|---|---|---|---|
Modules VNDK actuels | current |
Avant | CODE_NAME |
CODE_NAME |
/system/apex/com.android.vndk.vCODE_NAME |
Après | SDK_VER |
SDK_VER |
/system/apex/com.android.vndk.vSDK_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.vVNDK_VER |
- Version de la carte (
BOARD_VNDK_VERSION
). Version du VNDK requise par les modules du fournisseur pour la compilation. Définissez la valeur surcurrent
si les modules du fournisseur peuvent s'associer aux modules système actuels. - Version de la plate-forme (
PLATFORM_VNDK_VERSION
) : version du VNDK que les modules système actuels compilent. Compilé uniquement lorsqueBOARD_VNDK_VERSION
est égal à "current". - Propriété de version (
ro.vndk.version
) : propriété qui spécifie la version du VNDK dont les binaires et les bibliothèques de vendor.img ont besoin pour s'exécuter. Stocké dans levendor.img
à/vendor/default.prop
.