Das VNDK-Definitionstool unterstützt Anbieter bei der Migration ihres Quellbaums auf eine Android 8.0-Umgebung. Dieses Tool scannt Binärdateien im System und Hersteller-Images und löst dann Abhängigkeiten auf. Basierend auf dem Modulabhängigkeitsdiagramm kann das Tool auch Verstöße gegen VNDK-Konzepte erkennen und Erkenntnisse/Vorschläge für das Verschieben von Modulen zwischen Partitionen liefern. Wenn ein Generic System Image (GSI) angegeben ist, kann das VNDK-Definitionstool 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-Definitionstool behandelt:
-
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 Anbietermodulen zu nicht berechtigten gemeinsam genutzten Framework-Bibliotheken. -
deps
. Drucken Sie die Abhängigkeiten zwischen den gemeinsam genutzten Bibliotheken und ausführbaren Dateien aus.
Weitere Einzelheiten zur erweiterten Befehlsverwendung 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 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 Unterbefehl vndk
gehören:
Möglichkeit | Beschreibung |
---|---|
--system | Zeigen Sie auf ein Verzeichnis mit den Dateien, die in der Systempartition gespeichert werden sollen. |
--vendor | Zeigen Sie auf ein Verzeichnis mit den Dateien, die sich in einer Herstellerpartition befinden werden. |
--aosp-system | Zeigen Sie auf ein Verzeichnis mit den Dateien, 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 steht, abhängig von der Datei nach dem Doppelpunkt. 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 nach /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 der Ausgaben des VNDK-Definitionstools kann ein Anbieter eine 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-Abt
Der Unterbefehl check-dep
scannt Anbietermodule und überprüft ihre Abhängigkeiten. Wenn Verstöße festgestellt werden, werden die betreffenden abhängigen Bibliotheks- und Symbolverwendungen 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 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 geeignete Bibliotheks-Tag-Datei (unten beschrieben) verweisen, bei der es sich um eine von Google bereitgestellte Tabelle handelt, die Kategorien von gemeinsam genutzten Framework-Bibliotheken beschreibt. |
--module-info | Verweist auf die vom Android-Buildsystem generierte module-info.json . Es hilft dem VNDK-Definitionstool, Binärmodule dem Quellcode zuzuordnen. |
Berechtigte Bibliotheks-Tag-Datei
Google stellt eine geeignete VNDK-Tabelle (z. B. eligible-list.csv
) bereit, die die gemeinsam genutzten Framework-Bibliotheken markiert, die von Anbietermodulen verwendet werden können:
Etikett | Beschreibung |
---|---|
LL-NDK | Gemeinsam genutzte Bibliotheken mit stabilen ABIs/APIs, die sowohl von Framework- als auch von Anbietermodulen 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 Anbietermodule 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 für das Framework freigegebene gemeinsam genutzte Bibliotheken, auf die Herstellermodule nicht zugreifen dürfen (weder direkt noch indirekt). |
FWK-ONLY-RS | Nur für das Framework freigegebene gemeinsam genutzte Bibliotheken, auf die Herstellermodule nicht zugreifen dürfen (außer bei RS-Verwendungen). |
In der folgenden Tabelle werden Tags beschrieben, die für gemeinsam genutzte Bibliotheken von Anbietern verwendet werden:
Etikett | Beschreibung |
---|---|
SP-HAL | Gemeinsam genutzte HAL-Implementierungsbibliotheken für den gleichen Prozess. |
SP-HAL-Abt | Abhängigkeiten von gemeinsam genutzten SP-HAL-Anbieterbibliotheken (auch bekannt als SP-HAL-Abhängigkeiten mit Ausnahme von LL-NDK und VNDK-SP). |
NUR VND | Für das Framework unsichtbare gemeinsam genutzte Bibliotheken, auf die Framework-Module nicht zugreifen dürfen. Die kopierten erweiterten VNDK-Bibliotheken werden ebenfalls als VND-ONLY gekennzeichnet. |
Beziehungen zwischen Tags:
![Beziehungen zwischen Tags.](https://source.android.com/docs/core/architecture/images/treble_vndk_design.png?authuser=6&hl=de)
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. 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.
Bei Angabe der Option --revert
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
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
ab. Darüber hinaus zeigt diese Ausgabe, dass libdl.so
der einzige Benutzer von ld-android.so
ist.
Bei Angabe der Option --symbol
gibt der Unterbefehl 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 aus libdl.so
exportierten Funktionen abhängt. Wenn sowohl die Option --symbol
als auch die Option --revert
angegeben sind, werden die vom Benutzer verwendeten Symbole gedruckt.