L'outil de définition du VNDK aide les fournisseurs à migrer leur arborescence source vers un environnement Android 8.0. Cet outil analyse les fichiers binaires dans les images du système et du fournisseur, puis résout les dépendances. Sur la base du graphique des dépendances des modules, l'outil peut également détecter les cas de non-respect des concepts VNDK et fournir des insights/suggestions pour déplacer des modules entre des partitions. Si une image système générique (GSI) est spécifiée, l'outil de définition du VNDK peut comparer votre image système à la GSI et déterminer les bibliothèques étendues.
Cette section décrit trois commandes fréquemment utilisées pour l'outil de définition VNDK:
vndk
: calcul de VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES et EXTRA_VENDOR_LIBRARIES pour contourner le système de compilation sous Android 8.0 et versions ultérieures.check-dep
. Vérifiez les dépendances de module non conformes des modules du fournisseur aux bibliothèques partagées de framework non éligibles.deps
. Imprimez les dépendances entre les bibliothèques partagées et les exécutables.
Pour en savoir plus sur l'utilisation avancée des commandes, consultez le fichier README.md du dépôt de l'outil de définition VNDK.
vndk
La sous-commande vndk
charge les bibliothèques partagées et les exécutables à partir de la partition système et des partitions du fournisseur, puis résout les dépendances de module pour déterminer les bibliothèques qui doivent être copiées dans /system/lib[64]/vndk-sp-${VER}
et /vendor/lib[64]
.
Les options de la sous-commande vndk
sont les suivantes:
Option | Description |
---|---|
--system |
Pointez vers un répertoire contenant les fichiers situés dans la partition système. |
--vendor |
Pointez vers un répertoire contenant les fichiers situés dans une partition de fournisseur. |
--aosp-system |
Pointez vers un répertoire contenant les fichiers qui se trouvent dans l'image système générique (GSI). |
--load-extra-deps |
Pointez vers un fichier qui décrit les dépendances implicites, comme dlopen() . |
Par exemple, pour calculer les ensembles de bibliothèques VNDK, exécutez la sous-commande vndk
suivante:
./vndk_definition_tool.py vndk \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--aosp-system ${ANDROID_PRODUCT_OUT}/../generic_arm64_ab/system\
--load-extra-deps dlopen.dep
Spécifiez des dépendances supplémentaires avec un format de fichier simple. Chaque ligne représente une relation, le fichier avant le deux-points dépendant du fichier après le deux-points. Exemple :
/system/lib/libart.so: /system/lib/libart-compiler.so
Cette ligne indique à l'outil de définition du VNDK que libart.so
dépend de libart-compiler.so
.
Destination de l'installation
L'outil de définition du VNDK répertorie les bibliothèques et les répertoires d'installation correspondants pour les catégories suivantes:
Catégorie | Répertoire |
---|---|
vndk_sp | Doit être installé dans /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Doit être installé dans /vendor/lib[64]/vndk-sp |
extra_vendor_libs | Doit être installé dans /vendor/lib[64] |
Modèles de système de compilation
Après avoir rassemblé les sorties de l'outil de définition du VNDK, un fournisseur peut créer un Android.mk
et renseigner VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
et EXTRA_VENDOR_LIBRARIES
pour automatiser le processus de copie des bibliothèques vers la destination d'installation désignée.
ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),) VNDK_SP_LIBRARIES := ##_VNDK_SP_## VNDK_SP_EXT_LIBRARIES := ##_VNDK_SP_EXT_## EXTRA_VENDOR_LIBRARIES := ##_EXTRA_VENDOR_LIBS_## #------------------------------------------------------------------------------- # VNDK Modules #------------------------------------------------------------------------------- LOCAL_PATH := $(call my-dir) define define-vndk-lib include $$(CLEAR_VARS) LOCAL_MODULE := $1.$2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_PREBUILT_MODULE_FILE := $$(TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so LOCAL_STRIP_MODULE := false LOCAL_MULTILIB := first LOCAL_MODULE_TAGS := optional LOCAL_INSTALLED_MODULE_STEM := $1.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_RELATIVE_PATH := $3 LOCAL_VENDOR_MODULE := $4 include $$(BUILD_PREBUILT) ifneq ($$(TARGET_2ND_ARCH),) ifneq ($$(TARGET_TRANSLATE_2ND_ARCH),true) include $$(CLEAR_VARS) LOCAL_MODULE := $1.$2 LOCAL_MODULE_CLASS := SHARED_LIBRARIES LOCAL_PREBUILT_MODULE_FILE := $$($$(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATE_LIBRARIES)/$1.so LOCAL_STRIP_MODULE := false LOCAL_MULTILIB := 32 LOCAL_MODULE_TAGS := optional LOCAL_INSTALLED_MODULE_STEM := $1.so LOCAL_MODULE_SUFFIX := .so LOCAL_MODULE_RELATIVE_PATH := $3 LOCAL_VENDOR_MODULE := $4 include $$(BUILD_PREBUILT) endif # TARGET_TRANSLATE_2ND_ARCH is not true endif # TARGET_2ND_ARCH is not empty endef $(foreach lib,$(VNDK_SP_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-sp-gen,vndk-sp,))) $(foreach lib,$(VNDK_SP_EXT_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-sp-ext-gen,vndk-sp,true))) $(foreach lib,$(EXTRA_VENDOR_LIBRARIES),\ $(eval $(call define-vndk-lib,$(lib),vndk-ext-gen,,true))) #------------------------------------------------------------------------------- # Phony Package #------------------------------------------------------------------------------- include $(CLEAR_VARS) LOCAL_MODULE := $(YOUR_DEVICE_NAME)-vndk LOCAL_MODULE_TAGS := optional LOCAL_REQUIRED_MODULES := \ $(addsuffix .vndk-sp-gen,$(VNDK_SP_LIBRARIES)) \ $(addsuffix .vndk-sp-ext-gen,$(VNDK_SP_EXT_LIBRARIES)) \ $(addsuffix .vndk-ext-gen,$(EXTRA_VENDOR_LIBRARIES)) include $(BUILD_PHONY_PACKAGE) endif # ifneq ($(filter $(YOUR_DEVICE_NAME),$(TARGET_DEVICE)),)
check-dep
La sous-commande check-dep
analyse les modules du fournisseur et vérifie leurs dépendances. Si des cas de non-respect sont détectés, la bibliothèque dépendante et les utilisations de symboles non conformes sont affichées:
./vndk_definition_tool.py check-dep \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor \
--tag-file eligible-list.csv \
--module-info ${ANDROID_PRODUCT_OUT}/module-info.json \
1> check_dep.txt \
2> check_dep_err.txt
Par exemple, l'exemple de sortie suivant montre une dépendance non conforme de libRS_internal.so
à libmediandk.so
:
/system/lib/libRS_internal.so MODULE_PATH: frameworks/rs /system/lib/libmediandk.so AImageReader_acquireNextImage AImageReader_delete AImageReader_getWindow AImageReader_new AImageReader_setImageListener
Les options de la sous-commande check-dep
sont les suivantes:
Option | Description |
---|---|
--tag-file |
Doit faire référence à un fichier de balise de bibliothèque éligible (décrit ci-dessous), qui est une feuille de calcul fournie par Google qui décrit les catégories de bibliothèques partagées du framework. |
--module-info |
Pointe vers le module-info.json généré par le système de compilation Android. Il aide l'outil de définition du VNDK à associer des modules binaires au code source. |
Fichier de balise de bibliothèque éligible
Google fournit une feuille de calcul VNDK éligible (par exemple, eligible-list.csv
) qui tague les bibliothèques partagées du framework pouvant être utilisées par les modules du fournisseur:
Taguer | Description |
---|---|
LL-NDK | Bibliothèques partagées avec des ABI/API stables pouvant être utilisées à la fois par le framework et les modules du fournisseur. |
LL-NDK-Private | Dépendances privées des bibliothèques LL-NDK. Les modules du fournisseur ne doivent pas accéder directement à ces bibliothèques. |
VNDK-SP | Dépendances des bibliothèques partagées du framework SP-HAL. |
VNDK-SP-Private | Dépendances VNDK-SP qui ne sont pas directement accessibles à tous les modules du fournisseur. |
VNDK | Bibliothèques partagées du framework disponibles pour les modules du fournisseur (à l'exception de SP-HAL et SP-HAL-Dep). |
VNDK-Private | Dépendances VNDK qui ne sont pas directement accessibles à tous les modules du fournisseur. |
FWK-ONLY | Bibliothèques partagées réservées au framework auxquelles les modules du fournisseur ne doivent pas accéder (ni directement, ni indirectement). |
FWK-ONLY-RS | Bibliothèques partagées réservées au framework auxquelles les modules du fournisseur ne doivent pas accéder (sauf pour les utilisations RS). |
Le tableau suivant décrit les balises utilisées pour les bibliothèques partagées du fournisseur:
Taguer | Description |
---|---|
SP-HAL | Bibliothèques partagées d'implémentation HAL du même processus. |
SP-HAL-Dep | Dépendances des bibliothèques partagées du fournisseur SP-HAL (également appelées dépendances SP-HAL, à l'exception de LL-NDK et VNDK-SP). |
VND uniquement | Bibliothèques partagées invisibles par le framework auxquelles les modules de framework ne doivent pas avoir accès. Les bibliothèques VNDK étendues copiées sont également taguées comme VND-ONLY. |
Relations entre les balises:

Figure 1 : Relations entre les balises.
dépendances
Pour déboguer les dépendances de bibliothèque, la sous-commande deps
affiche les dépendances de module:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
La sortie se compose de plusieurs lignes. La ligne sans caractère d'onglet commence une nouvelle section. La ligne avec un caractère d'onglet dépend de la section précédente. Exemple :
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
Ce résultat montre que ld-android.so
n'a pas de dépendance et que libc.so
dépend de libdl.so
.
Lorsque vous spécifiez l'option --revert
, la sous-commande deps
affiche les utilisations des bibliothèques (dépendances inversées):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Exemple :
/system/lib/ld-android.so /system/lib/libdl.so
Cette sortie montre que ld-android.so
est utilisé par libdl.so
, ou en d'autres termes, que libdl.so
dépend de ld-android.so
. En outre, cette sortie montre que libdl.so
est le seul utilisateur de ld-android.so
.
Lorsque vous spécifiez l'option --symbol
, la sous-commande deps
imprime les symboles utilisés:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Exemple :
/system/lib/libc.so /system/lib/libdl.so android_get_application_target_sdk_version dl_unwind_find_exidx dlclose dlerror dlopen dlsym
Ce résultat montre que libc.so
dépend de six fonctions exportées depuis libdl.so
. Si les options --symbol
et --revert
sont spécifiées, les symboles utilisés par l'utilisateur sont imprimés.