VNDK-Definitionstool

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.
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. 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.