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 du système et du fournisseur résout ensuite les dépendances. D'après le graphique des dépendances du module, peut également détecter les violations des concepts VNDK et fournir informations/suggestions pour déplacer les modules entre les partitions. Si un système générique l'image (GSI) est spécifiée, l'outil de définition VNDK peut comparer votre système avec le GSI et déterminer les bibliothèques étendues.

Cette section présente trois commandes fréquemment utilisées pour la définition du VNDK outil:

  • vndk Calculer 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 plus élevée.
  • check-dep Vérifiez les dépendances du module non conformes modules fournisseurs vers les bibliothèques partagées du framework non éligibles.
  • deps Imprimer les dépendances entre les bibliothèques partagées et exécutables.

Pour en savoir plus sur l'utilisation des commandes avancées, consultez 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 de la partition système et des partitions du fournisseur, puis résout le module dépendances pour déterminer les bibliothèques qui doivent être copiées /system/lib[64]/vndk-sp-${VER} et /vendor/lib[64]. Les options de la sous-commande vndk incluent:

Option Description
--system Pointer vers un répertoire contenant les fichiers qui se trouvent sur le système partition.
--vendor Pointer vers un répertoire contenant les fichiers qui se trouvent chez un fournisseur partition.
--aosp-system Pointez vers un répertoire contenant les fichiers qui se trouvent dans le répertoire générique image système (GSI).
--load-extra-deps Pointez vers un fichier décrivant les dépendances implicites, tel que dlopen()

Par exemple, pour calculer les ensembles de bibliothèques VNDK, exécutez la commande suivante : Sous-commande vndk:

./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 avec le fichier placé avant les deux-points, selon le fichier situé après le signe 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 À installer dans /system/lib[64]/vndk-sp-${VER}
ext_vndk_sp À installer dans /vendor/lib[64]/vndk-sp
autres_vendor_libs À installer dans /vendor/lib[64]

Modèles de système de compilation

Après avoir collecté les résultats de l'outil de définition VNDK, un fournisseur peut créer un Android.mk et renseignez VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES et EXTRA_VENDOR_LIBRARIES à Automatiser le processus de copie des bibliothèques dans l'installation désignée vers votre destination.

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)),)

délai de vérification

La sous-commande check-dep analyse les modules du fournisseur et vérifie leur les dépendances. S'il détecte des cas de non-respect des règles, il affiche les éléments concernés utilisations de bibliothèques et de symboles:

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

L'exemple de résultat suivant montre une dépendance non conforme à 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 balise de bibliothèque éligible (décrit ci-dessous), qui est un Feuille de calcul fournie par Google décrivant les catégories de cadres partagés bibliothèques.
--module-info Pointe vers le module-info.json généré par le build Android du système d'exploitation. Il permet à l'outil de définition VNDK d'associer des modules binaires à la source. du code source.

Fichier de tag de bibliothèque éligible

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

Taguer Description
LL-NDK Des bibliothèques partagées avec des ABI/API stables pouvant être utilisées à la fois de framework et de fournisseur.
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 auxquelles tous les fournisseurs ne peuvent pas accéder directement modules.
VNDK Bibliothèques partagées de framework mises à la disposition des modules des fournisseurs (sauf SP-HAL et SP-HAL-Dep).
VNDK – Privé Dépendances VNDK qui ne sont pas directement accessibles à tous les fournisseurs modules.
FWK UNIQUEMENT Bibliothèques partagées basées uniquement sur un framework, auxquelles le fournisseur ne doit pas avoir accès modules (ni directement, ni indirectement).
FWK-UNIQUEMENT-RS Bibliothèques partagées basées uniquement sur un framework, auxquelles le fournisseur ne doit pas avoir accès (sauf pour les RS).

Le tableau suivant décrit les balises utilisées pour les bibliothèques partagées par les fournisseurs:

Taguer Description
SP-HAL Bibliothèques partagées pour l'implémentation HAL du même processus.
Dép. SP-HAL Dépendances de bibliothèques partagées des fournisseurs SP-HAL (également appelées dépendances SP-HAL) à l'exception de LL-NDK et VNDK-SP).
VND UNIQUEMENT Des bibliothèques partagées invisibles au niveau du framework qui ne doivent pas être accessibles modules du framework. Les bibliothèques VNDK étendues copiées sont marquées en tant que VND UNIQUEMENT.

Relations entre les balises:

Relations entre les balises

Figure 1 : Relations entre les balises

dépendances

Pour déboguer les dépendances de la bibliothèque, la sous-commande deps affiche les dépendances du module:

./vndk_definition_tool.py deps \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

Le résultat se compose de plusieurs lignes. La ligne sans tabulation commence une nouvelle section. La ligne contenant un caractère de tabulation dépend de la longueur . 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 libc.so dépend de libdl.so.

Lorsque vous spécifiez l'option --revert, deps affiche les utilisations des bibliothèques (inversé dépendances):

./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, libdl.so dépend de ld-android.so De plus, ce résultat montre que libdl.so est le seul utilisateur de ld-android.so.

Lorsque vous spécifiez l'option --symbol, 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 de libdl.so. Si les options --symbol et L'option --revert est spécifiée, les symboles utilisés par l'utilisateur. sont imprimées.