VNDK-Definitionstool

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:

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.