Conception d'instantanés VNDK

Les instantanés VNDK peuvent être utilisés par une image système pour fournir les bibliothèques VNDK correctes aux images du fournisseur, même lorsque les images du système et du fournisseur sont créées à partir de différentes versions d'Android. La création d'un instantané VNDK nécessite de capturer les bibliothèques VNDK sous forme d'instantané et de les marquer avec un numéro de version. L'image du fournisseur peut être liée à une version spécifique du VNDK qui fournit les ABI requis pour les modules de l'image du fournisseur. Cependant, au sein d'une même version du VNDK, les bibliothèques du VNDK doivent être stables en ABI .

La conception d'instantanés VNDK comprend des méthodes permettant de générer les pré-constructions d'un instantané VNDK à partir de l'image système actuelle et d'installer ces bibliothèques prédéfinies sur la partition système d'une version Android plus récente.

À propos des bibliothèques VNDK

HIDL-HAL , introduits dans Android 8.0, permettent des mises à niveau distinctes pour les partitions système et fournisseur. VNDK définit des ensembles de bibliothèques (VNDK-core, VNDK-SP et LL-NDK) avec lesquelles le code du fournisseur peut être lié et empêche les fournisseurs d'utiliser des bibliothèques qui ne font pas partie d'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.

Noyau VNDK

L'ensemble de bibliothèques VNDK-core est installé dans /system/lib[64]/vndk-${VER} et est disponible uniquement pour les processus fournisseurs dont le niveau d'API est égal à ${VER} . Les processus système ne peuvent pas utiliser ces bibliothèques et doivent plutôt utiliser les bibliothèques 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 à l'abri du 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 fournisseur et les processus système (via les bibliothèques SP-HAL installées dans la partition fournisseur). Les bibliothèques VNDK-SP peuvent être à double chargement.

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 les bibliothèques de stub 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 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-stables de LL-NDK, l'instantané VNDK n'a pas besoin d'inclure les bibliothèques LL-NDK pour les images des anciens fournisseurs.

À propos des instantanés VNDK

Android 8.1 incluait des bibliothèques VNDK construites à partir du code source . Cependant, 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é-construction pour permettre la liaison vers 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 anciennes versions dans le code source d'Android. Au moment de la construction, 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 le fournisseur partition), où ${VER} est la variable de chaîne qui représente le nom de version de l'instantané VNDK.

Comme les bibliothèques d'instantanés VNDK peuvent différer pour chaque version du VNDK, l'instantané VNDK inclut également les configurations d'espace de noms de l'éditeur de liens, installées sous etc/ld.config.${VER}.txt , /etc/llndk.libraries.${VER}.txt , et /etc/vndksp.libraries.${VER}.txt .

Exemple : mise à niveau des images du système et des fournisseurs

Aucun instantané requis ; construire 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 de l'éditeur de liens pour l'image du fournisseur dans l'image système. Les fichiers de configuration de l'espace de noms de l'éditeur de liens sont automatiquement configurés pour rechercher les bibliothèques VNDK dans /system/lib[64]/vndk-${VER} et /system/lib[64]/vndk-sp-${VER} .

Figure 1. Mise à niveau du système uniquement

Exemple : mise à niveau de l'image système, modification mineure de l'image du fournisseur

La création d'une image de 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 d'instantanés VNDK

Pour rendre une image système Android 9 compatible avec une image du fournisseur Android 8.1, l'instantané VNDK qui correspond à l'image du fournisseur Android 8.1 doit être fourni avec l'image système Android 9, comme indiqué ci-dessous :

Figure 2. Architecture des instantanés VNDK

La conception d'instantanés VNDK comprend 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 dans /system/lib[64]/vndk-28 et /system/lib[64]/vndk-sp-28 qui ont été créées avec la source actuelle sous forme d'instantané VNDK, où 28 est la version VNDK de Android 9. L'instantané inclut également les fichiers de configuration de l'espace de noms de l'éditeur de liens /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).
  • Installation des bibliothèques VNDK-core et VNDK-SP prédéfinies à partir d'un instantané . Dans Android 9, un instantané VNDK contient un ensemble de bibliothèques VNDK-core prédéfinies 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 des versions d'instantanés VNDK à installer, au moment de la construction, l'image système installe les bibliothèques d'instantanés VNDK dans /system/lib[64]/vndk-${VER} et /system/lib[64]/vndk-sp-${VER} et fichiers de configuration d'espace de noms de l'éditeur de liens pour ces instantanés VNDK dans le répertoire /etc .

Gestion des versions 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 a un nombre entier, tel que 27 pour Android 8.1). La version VNDK est corrigée lors de la sortie de la version Android. La version VNDK utilisée par la partition du fournisseur est stockée automatiquement dans la propriété ro.vndk.version , qui peut être lue lors de l'exécution. Cette version est ensuite utilisée pour identifier la version du fournisseur VNDK pour certaines bibliothèques et pour identifier la version de l'instantané VNDK pour la configuration de l'espace de noms.

Construire des bibliothèques VNDK

La commande make vndk crée des bibliothèques qui ont vndk: { enabled: true, … } , y compris les dépendances et les fichiers de configuration d'espace de noms. Si BOARD_VNDK_VERSION := current est défini, ces bibliothèques sont construites avec la commande make .

Étant donné que cette version n'installe pas les bibliothèques VNDK à partir de l'instantané, les bibliothèques VNDK installées ne sont pas stables pour ABI. Cependant, lorsqu'une version Android est publiée, l'ABI de la version actuelle du VNDK est corrigé. À ce stade, toute rupture d'ABI est une erreur de construction, donc les correctifs apportés à la version Android ne doivent pas modifier l'ABI pour les bibliothèques VNDK.