Mit dem VNDK-Definition-Tool können Anbieter ihren Quellbaum in eine Android 8.0-Umgebung migrieren. Dieses Tool scannt Binärdateien im System und in Anbieter-Images und löst dann Abhängigkeiten. Anhand des Modulabhängigkeitsdiagramms kann das Tool auch Verstöße gegen VNDK-Konzepte erkennen und Informationen/Vorschläge zum Verschieben von Modulen zwischen Partitionen bereitstellen. Wenn ein generisches System-Image (GSI) angegeben ist, kann das VNDK-Definition-Tool Ihr System-Image mit dem GSI vergleichen und die erweiterten Bibliotheken ermitteln.
In diesem Abschnitt werden drei häufig verwendete Befehle für das VNDK-Definitiontool beschrieben:
vndk
. VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES und EXTRA_VENDOR_LIBRARIES für die Build-System-Umgehung unter Android 8.0 und höher berechnen.check-dep
. Prüfen Sie die nicht zulässigen Modulabhängigkeiten von Anbietermodulen zu nicht zulässigen gemeinsam genutzten Framework-Bibliotheken.deps
. Drucken Sie die Abhängigkeiten zwischen den gemeinsam genutzten Bibliotheken und den ausführbaren Dateien.
Weitere Informationen zur erweiterten Verwendung von Befehlen finden Sie in der Datei README.md im VNDK Definition Tool-Repository.
vndk
Der Unterbefehl vndk
lädt die gemeinsam genutzten Bibliotheken und ausführbaren Dateien aus der Systempartition und den Anbieterpartitionen und löst dann die Modulabhängigkeiten auf, 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 |
Sie müssen auf ein Verzeichnis verweisen, das die Dateien in einer Anbieterpartition enthält. |
--aosp-system |
Geben Sie einen Pfad zu einem Verzeichnis an, das die Dateien im generischen System-Image (GSI) enthält. |
--load-extra-deps |
Sie können auf eine Datei verweisen, die die impliziten Abhängigkeiten beschreibt, z. B. dlopen() . |
Wenn Sie beispielsweise die VNDK-Bibliothekssätze berechnen möchten, 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. Beispiel:
/system/lib/libart.so: /system/lib/libart-compiler.so
Anhand dieser Zeile weiß das VNDK-Definitiontool, dass libart.so
von libart-compiler.so
abhängt.
Installationsort
Das VNDK-Definition-Tool listet Bibliotheken und entsprechende Installationsverzeichnisse für die folgenden Kategorien auf:
Kategorie | Verzeichnis |
---|---|
vndk_sp | Muss auf /system/lib[64]/vndk-sp-${VER} installiert werden |
vndk_sp_ext | Muss auf /vendor/lib[64]/vndk-sp installiert werden |
extra_vendor_libs | Muss unter /vendor/lib[64] installiert werden |
Build-Systemvorlagen
Nachdem ein Anbieter die Ausgabe des VNDK-Definition-Tools erfasst hat, kann er eine Android.mk
erstellen und VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
und EXTRA_VENDOR_LIBRARIES
ausfüllen, um das Kopieren von Bibliotheken an das angegebene 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ängigen Bibliotheken und Symbolverwendungen mit Verstöß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 richtlinienverletzende 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 freigegebenen Framework-Bibliotheken beschrieben werden. |
--module-info |
Verweist auf die vom Android-Build-System generierte module-info.json . Es hilft dem VNDK-Definition-Tool, Binärmodule dem Quellcode zuzuordnen. |
Zulässige Datei mit Bibliotheks-Tags
Google stellt eine geeignete VNDK-Tabelle (z.B. eligible-list.csv
) bereit, in der die freigegebenen Framework-Bibliotheken getaggt 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. Anbietermodule dürfen nicht direkt auf diese Bibliotheken zugreifen. |
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. |
FWK-ONLY | Nur für das Framework freigegebene Bibliotheken, auf die keine Anbietermodule zugreifen dürfen (weder direkt noch indirekt). |
FWK-ONLY-RS | Nur für das Framework freigegebene freigegebene Bibliotheken, auf die keine Anbietermodule zugreifen dürfen (außer bei RS-Nutzung). |
In der folgenden Tabelle werden Tags für freigegebene Bibliotheken von Anbietern beschrieben:
Taggen | Beschreibung |
---|---|
SP-HAL | Gemeinsam genutzte Bibliotheken der HAL-Implementierung im selben Prozess. |
SP-HAL-Dep | Abhängigkeiten von gemeinsam genutzten SP-HAL-Bibliotheken von Anbietern (auch SP-HAL-Abhängigkeiten genannt, ausgenommen LL-NDK und VNDK-SP) |
NUR VND | Für das Framework unsichtbare freigegebene Bibliotheken, auf die Framework-Module nicht zugreifen dürfen. Die kopierten erweiterten VNDK-Bibliotheken sind ebenfalls mit „VND-ONLY“ getaggt. |
Beziehungen zwischen Tags:

Abbildung 1: Beziehungen zwischen Tags.
deps
Zum Debuggen der Bibliotheksabhängigkeiten werden mit dem Unterbefehl deps
die Modulabhängigkeiten ausgegeben:
./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 Verwendung 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 ist hier zu sehen, dass libdl.so
der einzige Nutzer von ld-android.so
ist.
Wenn Sie die Option --symbol
angeben, werden mit dem Unterbefehl deps
die verwendeten Symbole ausgegeben:
./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 wurden. Wenn sowohl die Option --symbol
als auch die Option --revert
angegeben sind, werden die vom Nutzer verwendeten Symbole gedruckt.