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 du système et du fournisseur, puis résout les dépendances. Sur la base du graphique de dépendance des modules, l'outil peut également détecter les violations des concepts VNDK et fournir des informations/suggestions pour déplacer les 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 avec la GSI et déterminer les bibliothèques étendues.

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

  • vndk . Calculez VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES et EXTRA_VENDOR_LIBRARIES pour créer une solution de contournement du système dans Android 8.0 et versions ultérieures.
  • check-dep . Vérifiez les dépendances de module en infraction, des modules du fournisseur aux bibliothèques partagées du framework non éligibles.
  • deps . Imprimez les dépendances entre les bibliothèques partagées et les exécutables.

Pour plus de détails sur l'utilisation avancée des commandes, reportez-vous au fichier README.md dans le référentiel VNDK Definition Tool.

vndk

La sous-commande vndk charge les bibliothèques partagées et les exécutables à partir de la partition système et des partitions 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 incluent :

Option Description
--system Pointez vers un répertoire contenant les fichiers qui résideront dans la partition système.
--vendor Pointez vers un répertoire contenant les fichiers qui résideront dans une partition fournisseur.
--aosp-system Pointez vers un répertoire contenant les fichiers qui résideront dans l’image système générique (GSI).
--load-extra-deps Pointez vers un fichier qui décrit les dépendances implicites, telles que 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 les deux points dépendant du fichier après les deux points. Par exemple:

/system/lib/libart.so: /system/lib/libart-compiler.so

Cette ligne permet à l'outil de définition du VNDK de savoir que libart.so dépend de libart-compiler.so .

Destination d'installation

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

Catégorie Annuaire
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]

Créer des modèles de système

Après avoir collecté les résultats de l'outil de définition VNDK, un fournisseur peut créer un Android.mk et remplir 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)),)

chèque-dépôt

La sous-commande check-dep analyse les modules du fournisseur et vérifie leurs dépendances. S'il détecte des violations, il imprime les utilisations de la bibliothèque dépendante et des symboles en violation :

./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 incluent :

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 build Android. Il aide l'outil de définition VNDK à associer les modules binaires au code source.

Fichier de balises de bibliothèque éligible

Google fournit une feuille de calcul VNDK éligible (par exemple eligible-list.csv ) qui balise les bibliothèques partagées du framework qui peuvent être utilisées par les modules du fournisseur :

Étiqueter Description
LL-NDK Bibliothèques partagées avec des ABI/API stables qui peuvent être utilisées à la fois par les modules du framework et des fournisseurs.
LL-NDK-Privé 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-Privé Dépendances VNDK-SP qui ne sont pas directement accessibles à tous les modules fournisseurs.
VNDK Bibliothèques partagées du framework disponibles pour les modules du fournisseur (sauf SP-HAL et SP-HAL-Dep).
VNDK-Privé Dépendances VNDK qui ne sont pas directement accessibles à tous les modules fournisseurs.
FWK UNIQUEMENT Bibliothèques partagées uniquement Framework auxquelles les modules du fournisseur ne doivent pas accéder (ni directement ni indirectement).
FWK-ONLY-RS Bibliothèques partagées uniquement 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 :

Étiqueter Description
SP-HAL Bibliothèques partagées d’implémentation HAL avec le même processus.
SP-HAL-Dép Dépendances des bibliothèques partagées du fournisseur SP-HAL (c'est-à-dire dépendances SP-HAL à l'exclusion de LL-NDK et VNDK-SP).
VND UNIQUEMENT Bibliothèques partagées invisibles dans le framework et auxquelles les modules du framework ne doivent pas accéder. Les bibliothèques VNDK étendues copiées seront également étiquetées comme VND-ONLY.

Relations entre les balises :

Relations entre les balises.
Figure 1. Relations entre les balises.

dépôts

Pour déboguer les dépendances de la bibliothèque, la sous-commande deps imprime les dépendances du 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 démarre une nouvelle section. La ligne avec un caractère de tabulation dépend de la section précédente. Par exemple:

/system/lib/ld-android.so
/system/lib/libc.so
        /system/lib/libdl.so

Cette sortie montre que ld-android.so n'a pas de dépendance et libc.so dépend de libdl.so .

Lors de la spécification de l'option --revert , la sous-commande deps imprime 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

Par 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, libdl.so dépend de ld-android.so . De plus, cette sortie montre que libdl.so est le seul utilisateur de ld-android.so .

Lors de la spécification de 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
    

Par exemple:

/system/lib/libc.so
        /system/lib/libdl.so
                android_get_application_target_sdk_version
                dl_unwind_find_exidx
                dlclose
                dlerror
                dlopen
                dlsym

Cette sortie montre que libc.so dépend de 6 fonctions exportées depuis libdl.so . Si les options --symbol et --revert sont spécifiées, les symboles utilisés par l'utilisateur seront imprimés.