VNDK-Definitionstool

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:

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.