Outil de définition VNDK

L'outil de définition VNDK aide les fournisseurs à migrer leur arborescence source vers un environnement Android 8.0. Cet outil analyse les fichiers binaires dans les images système et fournisseur, puis résout les dépendances. En se basant sur le graphique de dépendances des modules, l'outil peut également détecter les cas de non-respect des concepts VNDK et fournir des informations/suggestions pour déplacer des modules entre les partitions. Si une image système générique (GSI) est spécifiée, l'outil de définition VNDK peut comparer votre image système à la GSI et déterminer les bibliothèques étendues.

Cette section couvre trois commandes fréquemment utilisées pour l'outil de définition du VNDK :

  • vndk. Calculez VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES et EXTRA_VENDOR_LIBRARIES pour la solution de contournement du système de compilation dans Android 8.0 et versions ultérieures.
  • check-dep. Vérifiez les dépendances des modules non conformes des modules du fournisseur aux bibliothèques partagées du framework non éligibles.
  • deps. Imprime 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 dans le 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 des partitions système et fournisseur, puis résout les dépendances des modules pour déterminer les bibliothèques à copier dans /system/lib[64]/vndk-sp-${VER} et /vendor/lib[64]. Voici les options disponibles pour la sous-commande vndk :

Option Description
--system Indiquez un répertoire contenant les fichiers qui se trouvent dans la partition système.
--vendor Pointez sur un répertoire contenant les fichiers qui se trouvent dans une partition du 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 Indiquez un fichier qui décrit les dépendances implicites, par exemple 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 VNDK que libart.so dépend de libart-compiler.so.

Destination de l'installation

L'outil de définition VNDK liste les bibliothèques et les répertoires d'installation correspondants pour les catégories suivantes :

Catégorie Répertoire
vndk_sp Doit être installé sur /system/lib[64]/vndk-sp-${VER}
vndk_sp_ext Doit être installé sur /vendor/lib[64]/vndk-sp
extra_vendor_libs Doit être installé sur /vendor/lib[64]

Modèles de système de compilation

Après avoir collecté les sorties de l'outil de définition 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. S'il détecte des cas de non-respect, il affiche les utilisations de la bibliothèque et des symboles dépendants concernés :

./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 résultat 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

Voici les options disponibles pour la sous-commande check-dep :

Option Description
--tag-file Doit faire référence à un fichier de balises de bibliothèque éligible (décrit ci-dessous), qui est une feuille de calcul fournie par Google décrivant 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 VNDK à associer les modules binaires au code source.

Fichier de tag de bibliothèque éligible

Google fournit une feuille de calcul VNDK éligible (par exemple, eligible-list.csv) qui identifie 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 par les modules du framework et 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 (sauf SP-HAL et SP-HAL-Dep).
VNDK-Private Dépendances VNDK qui ne sont pas directement accessibles à tous les modules du fournisseur.
FWK-ONLY (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 tags utilisés pour les bibliothèques partagées par les fournisseurs :

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'exclusion de LL-NDK et VNDK-SP).
VND-ONLY Bibliothèques partagées invisibles pour le framework, auxquelles les modules du framework ne doivent pas accéder. Les bibliothèques VNDK étendues copiées sont également taguées comme VND-ONLY.

Relations entre les balises :

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 de tabulation commence une nouvelle section. La ligne comportant un caractère de tabulation 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 indique 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
        

Ce résultat 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, ce résultat indique que libdl.so est le seul utilisateur de ld-android.so.

Lorsque vous spécifiez l'option --symbol, la sous-commande deps affiche 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 à partir de libdl.so. Si les options --symbol et --revert sont spécifiées, les symboles utilisés par l'utilisateur sont imprimés.