VNDK-Definitionstool

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Das VNDK-Definitionstool hilft Anbietern, ihren Quellbaum in eine Android 8.0-Umgebung zu migrieren. Dieses Tool scannt Binärdateien im System und Anbieter-Images und löst dann Abhängigkeiten auf. Basierend auf dem Modulabhängigkeitsdiagramm kann das Tool auch Verstöße gegen VNDK-Konzepte erkennen und Einblicke/Vorschläge zum Verschieben von Modulen zwischen Partitionen geben. Wenn ein generisches Systemabbild (GSI) angegeben ist, kann das VNDK-Definitionstool Ihr Systemabbild mit dem GSI vergleichen und die erweiterten Bibliotheken ermitteln.

Dieser Abschnitt behandelt drei häufig verwendete Befehle für das VNDK-Definitionstool:

  • vndk . Berechnen Sie VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES und EXTRA_VENDOR_LIBRARIES für die Problemumgehung des Build-Systems in Android 8.0 und höher.
  • check-dep . Überprüfen Sie die verletzenden Modulabhängigkeiten von Herstellermodulen zu nicht berechtigten gemeinsam genutzten Framework-Bibliotheken.
  • deps . Drucken Sie die Abhängigkeiten zwischen den gemeinsam genutzten Bibliotheken und ausführbaren Dateien.

Weitere Einzelheiten zur erweiterten Befehlsverwendung finden Sie in der Datei README.md im Repository des VNDK-Definitionstools.

vndk

Der vndk lädt die gemeinsam genutzten Bibliotheken und ausführbaren Dateien von der Systempartition und den Herstellerpartitionen und löst dann Modulabhängigkeiten auf, um die Bibliotheken zu bestimmen, die nach /system/lib[64]/vndk-sp-${VER} und /vendor/lib[64] kopiert werden müssen. /vendor/lib[64] . Zu den Optionen für den vndk gehören:

Möglichkeit Beschreibung
--system Zeigen Sie auf ein Verzeichnis, das die Dateien enthält, die sich in der Systempartition befinden werden.
--vendor Zeigen Sie auf ein Verzeichnis, das die Dateien enthält, die sich in einer Herstellerpartition befinden werden.
--aosp-system Zeigen Sie auf ein Verzeichnis, das die Dateien enthält, die sich im Generic System Image (GSI) befinden werden.
--load-extra-deps Zeigen Sie auf eine Datei, die die impliziten Abhängigkeiten beschreibt, z. B. dlopen() .

Um beispielsweise die VNDK-Bibliothekssätze zu berechnen, führen Sie den folgenden vndk Unterbefehl aus:

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

Geben Sie zusätzliche Abhängigkeiten mit einem einfachen Dateiformat an. Jede Zeile stellt eine Beziehung dar, wobei die Datei vor dem Doppelpunkt von der Datei nach dem Doppelpunkt abhängt. Zum Beispiel:

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

Diese Zeile teilt dem VNDK-Definitionstool mit, dass libart.so von libart-compiler.so abhängt.

Installationsziel

Das VNDK-Definitionstool listet Bibliotheken und entsprechende Installationsverzeichnisse für die folgenden Kategorien auf:

Kategorie Verzeichnis
vndk_sp Muss in /system/lib[64]/vndk-sp-${VER} installiert werden
vndk_sp_ext Muss unter /vendor/lib[64]/vndk-sp installiert werden
extra_vendor_libs Muss nach /vendor/lib[64] installiert werden

Erstellen Sie Systemvorlagen

Nach dem Sammeln von Ausgaben des VNDK-Definitionstools kann ein Anbieter eine Android.mk -Datei erstellen und VNDK_SP_LIBRARIES , VNDK_SP_EXT_LIBRARIES und EXTRA_VENDOR_LIBRARIES , um den Prozess zum Kopieren von Bibliotheken an das vorgesehene Installationsziel zu automatisieren.

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

Scheckabh

Der Unterbefehl check-dep scannt Herstellermodule und überprüft ihre Abhängigkeiten. Wenn es Verstöße erkennt, gibt es die verletzenden abhängigen Bibliotheks- und Symbolverwendungen aus:

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

Die folgende Beispielausgabe zeigt beispielsweise eine verletzende Abhängigkeit von libRS_internal.so zu 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

Zu den Optionen für den Unterbefehl check-dep gehören:

Möglichkeit Beschreibung
--tag-file Muss auf eine berechtigte Bibliotheks-Tag-Datei (unten beschrieben) verweisen, bei der es sich um eine von Google bereitgestellte Tabelle handelt, in der Kategorien von gemeinsam genutzten Framework-Bibliotheken beschrieben werden.
--module-info Verweist auf die vom Android-Buildsystem generierte module-info.json . Es hilft dem VNDK-Definitionstool, Binärmodule mit Quellcode zu verknüpfen.

Berechtigte Bibliotheks-Tag-Datei

Google stellt eine zulässige VNDK-Tabelle (z. B. eligible-list.csv ) bereit, die die gemeinsam genutzten Bibliotheken des Frameworks kennzeichnet, die von Anbietermodulen verwendet werden können:

Schild Beschreibung
LL-NDK Gemeinsam genutzte Bibliotheken mit stabilen ABIs/APIs, die sowohl von Framework- als auch von Herstellermodulen verwendet werden können.
LL-NDK-Privat Private Abhängigkeiten von LL-NDK-Bibliotheken. Herstellermodule dürfen nicht direkt auf diese Bibliotheken zugreifen.
VNDK-SP Abhängigkeiten von gemeinsam genutzten Bibliotheken des SP-HAL-Frameworks.
VNDK-SP-Privat VNDK-SP-Abhängigkeiten, auf die nicht alle Anbietermodule direkt zugreifen können.
VNDK Gemeinsam genutzte Framework-Bibliotheken, die für Herstellermodule verfügbar sind (außer SP-HAL und SP-HAL-Dep).
VNDK-Privat VNDK-Abhängigkeiten, auf die nicht alle Anbietermodule direkt zugreifen können.
NUR FWK Nur Framework-gemeinsam genutzte Bibliotheken, auf die nicht von Herstellermodulen zugegriffen werden darf (weder direkt noch indirekt).
FWK-NUR-RS Nur Framework-gemeinsam genutzte Bibliotheken, auf die nicht von Herstellermodulen zugegriffen werden darf (mit Ausnahme von RS-Nutzungen).

Die folgende Tabelle beschreibt Tags, die für gemeinsam genutzte Bibliotheken von Anbietern verwendet werden:

Schild Beschreibung
SP-HAL Gemeinsam genutzte Bibliotheken für die HAL-Implementierung mit demselben Prozess.
SP-HAL-Abt Abhängigkeiten von gemeinsam genutzten Bibliotheken von SP-HAL-Anbietern (auch bekannt als SP-HAL-Abhängigkeiten mit Ausnahme von LL-NDK und VNDK-SP).
NUR VND Framework-unsichtbare gemeinsam genutzte Bibliotheken, auf die nicht von Framework-Modulen zugegriffen werden darf. Die kopierten erweiterten VNDK-Bibliotheken werden ebenfalls als VND-ONLY gekennzeichnet.

Beziehungen zwischen Tags:

Abbildung 1. Beziehungen zwischen Tags.

abhängig

Um die Bibliotheksabhängigkeiten zu debuggen, gibt der Unterbefehl deps die deps :

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

Die Ausgabe besteht aus mehreren Zeilen. Die Zeile ohne Tabulatorzeichen beginnt einen neuen Abschnitt. Die Zeile mit einem Tabulatorzeichen hängt vom vorhergehenden Abschnitt ab. Zum Beispiel:

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

Diese Ausgabe zeigt, dass ld-android.so keine Abhängigkeit hat und libc.so von libdl.so abhängt.

Wenn Sie die Option --revert , gibt der Unterbefehl deps die Verwendung von Bibliotheken (umgekehrte Abhängigkeiten) aus:

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

Zum Beispiel:

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

Diese Ausgabe zeigt, dass ld-android.so von libdl.so verwendet wird, oder mit anderen Worten, libdl.so hängt von ld-android.so . Darüber hinaus zeigt diese Ausgabe, dass libdl.so der einzige Benutzer von ld-android.so ist.

Wenn Sie die Option --symbol , gibt der deps die verwendeten Symbole aus:

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

Zum Beispiel:

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

Diese Ausgabe zeigt, dass libc.so von 6 Funktionen abhängt, die aus libdl.so exportiert wurden. Wenn sowohl die Option --symbol als auch die Option --revert angegeben sind, werden die vom Benutzer verwendeten Symbole gedruckt.