Das VNDK-Definitions-Tool unterstützt Anbieter bei der Migration ihres Quellbaums in eine Android 8.0-Umgebung. Dieses Tool scannt Binärdateien im System und in Anbieter-Images und löst dann Abhängigkeiten auf. Anhand des Modulabhängigkeitsdiagramms kann das Tool auch Verstöße gegen VNDK-Konzepte erkennen und Informationen/Vorschläge zum Verschieben von Modulen zwischen Partitionen liefern. Wenn ein generisches Systemimage (Generic System Image, GSI) angegeben ist, kann das VNDK-Definitionstool Ihr Systemimage mit dem GSI vergleichen und die erweiterten Bibliotheken ermitteln.
In diesem Abschnitt werden drei häufig verwendete Befehle für das VNDK-Definitionstool behandelt:
vndk
. Berechne VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES und EXTRA_VENDOR_LIBRARIES für den Build-System-Workaround in Android 8.0 und höher.check-dep
: Prüfen Sie die Modulabhängigkeiten, die gegen die Richtlinien verstoßen, von Vendormodulen zu nicht infrage kommenden gemeinsam genutzten Framework-Bibliotheken.deps
. Gibt die Abhängigkeiten zwischen den gemeinsam genutzten Bibliotheken und ausführbaren Dateien aus.
Weitere Informationen zur erweiterten Verwendung von Befehlen finden Sie in der Datei README.md im Repository des VNDK Definition Tool.
vndk
Mit dem Unterbefehl vndk
werden die gemeinsam genutzten Bibliotheken und ausführbaren Dateien aus der Systempartition und den Anbieterpartitionen geladen. Anschließend werden die Modulabhängigkeiten aufgelöst, um die Bibliotheken zu ermitteln, die in /system/lib[64]/vndk-sp-${VER}
und /vendor/lib[64]
kopiert werden müssen.
Zu den Optionen für den vndk
-Unterbefehl gehören:
Option | Beschreibung |
---|---|
--system |
Geben Sie ein Verzeichnis an, das die Dateien enthält, die sich auf der Systempartition befinden. |
--vendor |
Geben Sie ein Verzeichnis an, das die Dateien enthält, die sich in einer Anbieterpartition befinden. |
--aosp-system |
Geben Sie ein Verzeichnis an, das die Dateien enthält, die sich im generischen Systemimage (GSI) befinden. |
--load-extra-deps |
Verweisen Sie auf eine Datei, die die impliziten Abhängigkeiten beschreibt, z. B. dlopen() . |
Führen Sie beispielsweise den folgenden vndk
-Unterbefehl aus, um die VNDK-Bibliothekssätze zu berechnen:
./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
Zusätzliche Abhängigkeiten mit einem einfachen Dateiformat angeben Jede Zeile stellt eine Beziehung dar. Die Datei vor dem Doppelpunkt hängt von der Datei nach dem Doppelpunkt ab. Beispiel:
/system/lib/libart.so: /system/lib/libart-compiler.so
Diese Zeile informiert das VNDK-Definitions-Tool darüber, dass libart.so
von libart-compiler.so
abhängt.
Installationsziel
Das VNDK-Definitions-Tool listet Bibliotheken und die entsprechenden 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 in /vendor/lib[64]/vndk-sp installiert werden |
extra_vendor_libs | Muss in /vendor/lib[64] installiert werden |
Build-Systemvorlagen
Nachdem ein Anbieter die Ausgaben des VNDK-Definitions-Tools gesammelt hat, kann er ein Android.mk
erstellen und VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
und EXTRA_VENDOR_LIBRARIES
ausfüllen, 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)),)
check-dep
Mit dem Unterbefehl check-dep
werden Anbietermodule gescannt und ihre Abhängigkeiten geprüft. Wenn Verstöße erkannt werden, werden die abhängige Bibliothek und die Symbolverwendungen, die gegen die Richtlinien verstoßen, ausgegeben:
./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 regelwidrige 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 check-dep
-Unterbefehl gehören:
Option | Beschreibung |
---|---|
--tag-file |
Muss auf eine zulässige Bibliotheks-Tag-Datei verweisen (siehe unten). Das ist eine von Google bereitgestellte Tabelle, in der Kategorien von gemeinsam genutzten Framework-Bibliotheken beschrieben werden. |
--module-info |
Verweist auf die module-info.json , die vom Android-Build-System generiert wurde. Es hilft dem VNDK-Definitions-Tool, binäre Module mit Quellcode zu verknüpfen. |
Zulässige Datei mit Bibliotheks-Tag
Google stellt eine entsprechende VNDK-Tabelle (z.B. eligible-list.csv
) bereit, in der die gemeinsam genutzten Framework-Bibliotheken gekennzeichnet sind, die von Anbietermodulen verwendet werden können:
Taggen | Beschreibung |
---|---|
LL-NDK | Gemeinsam genutzte Bibliotheken mit stabilen ABIs/APIs, die sowohl von Framework- als auch von Anbietermodulen verwendet werden können. |
LL-NDK-Private | Private Abhängigkeiten von LL-NDK-Bibliotheken. Auf diese Bibliotheken darf nicht direkt über Vendormodule zugegriffen werden. |
VNDK-SP | Abhängigkeiten von gemeinsam genutzten Bibliotheken des SP-HAL-Frameworks. |
VNDK-SP-Private | VNDK-SP-Abhängigkeiten, auf die nicht alle Anbietermodule direkt zugreifen können. |
VNDK | Gemeinsam genutzte Framework-Bibliotheken, die für Anbietermodule verfügbar sind (außer SP-HAL und SP-HAL-Dep). |
VNDK-Private | VNDK-Abhängigkeiten, auf die nicht alle Anbietermodule direkt zugreifen können. |
NUR FWK | Nur für Frameworks bestimmte freigegebene Bibliotheken, auf die nicht von Anbietermodulen zugegriffen werden darf (weder direkt noch indirekt). |
FWK-ONLY-RS | Gemeinsam genutzte Bibliotheken, die nur für das Framework bestimmt sind und auf die nicht von Vendormodulen zugegriffen werden darf (außer für RS-Verwendungen). |
In der folgenden Tabelle werden Tags beschrieben, die für von Anbietern freigegebene Bibliotheken verwendet werden:
Taggen | Beschreibung |
---|---|
SP-HAL | Gemeinsam genutzte Bibliotheken für die Same-Process-HAL-Implementierung. |
SP-HAL-Dep | Abhängigkeiten von gemeinsam genutzten Bibliotheken des SP-HAL-Anbieters (auch SP-HAL-Abhängigkeiten genannt, 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 mit VND-ONLY gekennzeichnet. |
Beziehungen zwischen Tags:

Abbildung 1: Beziehungen zwischen Tags.
deps
Um die Bibliotheksabhängigkeiten zu debuggen, gibt der Unterbefehl deps
die Modulabhängigkeiten aus:
./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 vorherigen Abschnitt ab. 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
angeben, gibt der Unterbefehl deps
die Verwendungen von Bibliotheken (umgekehrte Abhängigkeiten) aus:
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Beispiel:
/system/lib/ld-android.so /system/lib/libdl.so
Diese Ausgabe zeigt, dass ld-android.so
von libdl.so
verwendet wird. Mit anderen Worten: libdl.so
hängt von ld-android.so
ab. Außerdem wird in dieser Ausgabe angezeigt, dass libdl.so
der einzige Nutzer von ld-android.so
ist.
Wenn Sie die Option --symbol
angeben, gibt der Unterbefehl deps
die verwendeten Symbole aus:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
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 sechs Funktionen abhängt, die aus libdl.so
exportiert werden. Wenn sowohl die Option --symbol
als auch die Option --revert
angegeben sind, werden die vom Nutzer verwendeten Symbole gedruckt.