Une image système peut utiliser des instantanés VNDK pour fournir les bibliothèques VNDK appropriées aux images du fournisseur, même lorsque les images système et du fournisseur sont compilées à partir de différentes versions d'Android. La création d'un instantané VNDK nécessite de capturer les bibliothèques VNDK en tant qu'instantané et de les marquer d'un numéro de version. L'image du fournisseur peut être associée à une version spécifique de VNDK qui fournit les ABI requises pour les modules de l'image du fournisseur. Toutefois, dans la même version du VNDK, les bibliothèques VNDK doivent être stables ABI.
La conception d'instantanés VNDK inclut des méthodes permettant de générer les précompilations d'un instantané VNDK à partir de l'image système actuelle et d'installer ces bibliothèques précompilées dans la partition système d'une version Android plus récente.
À propos des bibliothèques VNDK
Les HIDL-HAL, introduits dans Android 8.0, permettent des mises à niveau distinctes pour les partitions système et du fournisseur. VNDK définit des ensembles de bibliothèques (VNDK-core, VNDK-SP et LL-NDK) avec lesquels le code du fournisseur peut s'associer et empêche les fournisseurs d'utiliser des bibliothèques qui ne figurent pas dans un ensemble VNDK. Par conséquent, l'image du fournisseur peut être créée et exécutée si les ensembles VNDK appropriés sur l'image système sont fournis à l'image du fournisseur.
VNDK-core
L'ensemble de bibliothèques VNDK-core est installé dans /system/lib[64]/vndk-${VER}
et n'est disponible que pour les processus du fournisseur dont le niveau d'API est égal à ${VER}
. Les processus système ne peuvent pas utiliser ces bibliothèques et doivent utiliser celles installées dans /system/lib[64]
. En raison de la restriction stricte de l'espace de noms pour chaque processus, les bibliothèques VNDK-core sont protégées contre le double chargement.
Pour inclure une bibliothèque dans VNDK-core, ajoutez ce qui suit à Android.bp
:
vendor_available: true, vndk: { enabled: true, },
VNDK-SP
Les bibliothèques VNDK-SP sont installées dans /system/lib[64]/vndk-sp-${VER}
et sont disponibles pour les processus du fournisseur et les processus système (via les bibliothèques SP-HAL installées dans la partition du fournisseur). Les bibliothèques VNDK-SP peuvent être chargées en double.
Pour inclure une bibliothèque dans VNDK-SP, ajoutez ce qui suit à Android.bp
:
vendor_available: true, vndk: { enabled: true, support_system_process: true, },
LL-NDK
Les bibliothèques LL-NDK sont installées dans /system/lib[64]
. Les modules du fournisseur peuvent utiliser des bibliothèques de bouchons LL-NDK pour accéder aux symboles présélectionnés des bibliothèques LL-NDK. Les bibliothèques LL-NDK doivent être rétrocompatibles et stables en termes d'ABI pour permettre aux anciennes versions des modules du fournisseur d'utiliser les nouvelles versions des bibliothèques LL-NDK.
En raison des caractéristiques ABI-stable du LL-NDK, l'instantané VNDK n'a pas besoin d'inclure de bibliothèques LL-NDK pour les anciennes images du fournisseur.
À propos des instantanés VNDK
Android 8.1 incluait des bibliothèques VNDK compilées à partir du code source. Toutefois, pour les versions ultérieures d'Android, chaque version du VNDK doit être capturée sous forme d'instantané et fournie en tant que précompilation pour permettre l'association à une image de fournisseur plus ancienne.
À partir d'Android 9, les nouvelles versions d'Android incluront au moins un instantané des répertoires VNDK-core et VNDK-SP pour les versions antérieures dans le code source d'Android. Au moment de la compilation, les instantanés requis seront installés dans /system/lib[64]/vndk-${VER}
et /system/lib[64]/vndk-sp-${VER}
(répertoires pouvant être utilisés par la partition du fournisseur), où ${VER}
est la variable de chaîne représentant le nom de version de l'instantané VNDK.
Étant donné que les bibliothèques d'instantanés VNDK peuvent différer pour chaque version VNDK, l'instantané VNDK inclut également les configurations d'espace de noms du linker, installées en tant que etc/ld.config.${VER}.txt
, /etc/llndk.libraries.${VER}.txt
et /etc/vndksp.libraries.${VER}.txt
.
Exemple: Mettre à niveau les images du système et du fournisseur
Aucun instantané n'est requis. Créez sans configurations supplémentaires pour les instantanés VNDK.
Exemple: Mise à niveau de l'image système uniquement
Doit inclure l'instantané VNDK et les fichiers de configuration de l'espace de noms du linker pour l'image du fournisseur dans l'image système. Les fichiers de configuration de l'espace de noms du linker sont automatiquement configurés pour rechercher des bibliothèques VNDK dans /system/lib[64]/vndk-${VER}
et /system/lib[64]/vndk-sp-${VER}
.

Exemple: Mise à niveau de l'image système, modification mineure de l'image du fournisseur
La création d'une image du fournisseur à partir d'un instantané VNDK n'est pas encore prise en charge. Vous devez donc créer l'image du fournisseur séparément avec son code source d'origine, puis mettre à niveau l'image système comme décrit dans l'exemple précédent.
Architecture des instantanés VNDK
Pour rendre une image système Android 9 compatible avec une image du fournisseur Android 8.1, l'instantané VNDK correspondant à l'image du fournisseur Android 8.1 doit être fourni avec l'image système Android 9, comme illustré ci-dessous:

La conception de l'instantané VNDK inclut les méthodes suivantes:
- Génération d'un instantané pour les bibliothèques VNDK-core et VNDK-SP Android 9 inclut un script que vous pouvez utiliser pour créer un instantané de la version actuelle du VNDK. Ce script regroupe toutes les bibliothèques de
/system/lib[64]/vndk-28
et/system/lib[64]/vndk-sp-28
qui ont été compilées avec la source actuelle en tant qu'instantané VNDK, où28
correspond à la version VNDK d'Android 9. L'instantané inclut également les fichiers de configuration de l'espace de noms du liant/etc/ld.config.28.txt
,/etc/llndk.libraries.28.txt
et/etc/vndksp.libraries.28.txt
. L'instantané généré sera utilisé avec les versions Android plus récentes (supérieures à Android 9). - Installer les bibliothèques VNDK-core et VNDK-SP précompilées à partir d'un instantané Dans Android 9, un instantané VNDK contient un ensemble de bibliothèques VNDK-core précompilées et un ensemble de bibliothèques VNDK-SP, ainsi que des fichiers de configuration d'espace de noms de l'éditeur de liens. Lorsque vous fournissez une liste de versions de clichés VNDK à installer, au moment de la compilation, l'image système installe les bibliothèques de clichés VNDK dans
/system/lib[64]/vndk-${VER}
, ainsi que les répertoires/system/lib[64]/vndk-sp-${VER}
et les fichiers de configuration de l'espace de noms du liant pour ces clichés VNDK dans le répertoire/etc
.
Gestion des versions du VNDK
Chaque version d'Android ne comporte qu'un seul instantané VNDK, et la version du SDK est utilisée comme version VNDK (ce qui signifie que la version VNDK possède un nombre entier, comme 27 pour Android 8.1). La version du VNDK est fixée lors de la publication de la version Android. La version du VNDK utilisée par la partition du fournisseur est stockée automatiquement dans la propriété ro.vndk.version
, qui peut être lue au moment de l'exécution. Cette version permet ensuite d'identifier la version du VNDK du fournisseur pour certaines bibliothèques et la version de l'instantané VNDK pour la configuration de l'espace de noms.
Compiler les bibliothèques VNDK
La commande make vndk
crée des bibliothèques contenant vndk:
{ enabled: true, … }
, y compris des dépendances et des fichiers de configuration d'espace de noms. Si BOARD_VNDK_VERSION := current
est défini, ces bibliothèques sont créées avec la commande make
.
Étant donné que ce build n'installe pas les bibliothèques VNDK à partir de l'instantané, les bibliothèques VNDK installées ne sont pas stables ABI. Toutefois, lorsqu'une version d'Android est publiée, l'ABI de la version VNDK actuelle est corrigée. À ce stade, toute rupture de l'ABI est une erreur de compilation. Par conséquent, les correctifs apportés à la version Android ne doivent pas modifier l'ABI des bibliothèques VNDK.