VNDK-Definitionstool

Mit dem VNDK-Definitionstool können Anbieter ihre Quellstruktur in eine Android 8.0-Umgebung Dieses Tool scannt Binärdateien im System und beim Anbieter und löst dann Abhängigkeiten auf. Basierend auf dem Modulabhängigkeitsdiagramm kann das Tool auch Verstöße gegen VNDK-Konzepte erkennen und Informationen/Vorschläge zum Verschieben von Modulen zwischen Partitionen. Wenn ein generisches System Image (GSI) angegeben ist, kann das VNDK-Definitionstool Ihr System vergleichen, mit der GSI-Datei erstellen und die erweiterten Bibliotheken bestimmen.

In diesem Abschnitt werden drei häufig verwendete Befehle für die VNDK-Definition behandelt Tool:

  • vndk Berechnen Sie VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES und EXTRA_VENDOR_LIBRARIES für die Build-System-Problemumgehung in Android 8.0 und höher liegen.
  • check-dep Prüfen Sie die unzulässigen Modulabhängigkeiten Anbietermodule zu nicht zulässigen gemeinsam genutzten Frameworks.
  • deps Drucken Sie die Abhängigkeiten zwischen den gemeinsam genutzten Bibliotheken und ausführbare Dateien.

Weitere Informationen zur erweiterten Befehlsnutzung finden Sie unter README.md im Repository des VNDK-Definitionstools.

VNDK

Mit dem Unterbefehl vndk werden die gemeinsam genutzten Bibliotheken und ausführbare Dateien geladen aus den Systempartitionen und Anbieterpartitionen und löst das Modul auf, um die Bibliotheken zu ermitteln, in die kopiert werden müssen, /system/lib[64]/vndk-sp-${VER} und /vendor/lib[64]. Zu den Optionen für den Unterbefehl vndk gehören:

Option Beschreibung
--system Auf ein Verzeichnis mit den Dateien verweisen, die sich im System befinden -Partition an.
--vendor Verweisen Sie auf ein Verzeichnis mit den Dateien eines Anbieters. -Partition an.
--aosp-system Verweisen Sie auf ein Verzeichnis mit den Dateien, die sich in der generischen System-Image (GSI).
--load-extra-deps Bewegen Sie den Mauszeiger auf eine Datei, in der die impliziten Abhängigkeiten beschrieben werden, z. B.: dlopen()

Führen Sie beispielsweise folgenden Befehl aus, um die VNDK-Bibliothekssätze zu berechnen: Unterbefehl vndk:

./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 Linie steht für eine Beziehung, wobei die Datei vor dem Doppelpunkt stehen muss, je nachdem, welche Datei nach dem Doppelpunkt. Beispiel:

/system/lib/libart.so: /system/lib/libart-compiler.so

Durch diese Zeile wird dem VNDK-Definitionstool mitgeteilt, dass libart.so hängt von libart-compiler.so ab.

Installationsziel

Das VNDK-Definitionstool listet Bibliotheken und entsprechende Installationsverzeichnisse auf. für die folgenden Kategorien:

Kategorie Verzeichnis
Vndk_sp Installation erforderlich in /system/lib[64]/vndk-sp-${VER}
Vndk_sp_ext Installation erforderlich in /vendor/lib[64]/vndk-sp
extra_vendor_libs Installation erforderlich in /vendor/lib[64]

Systemvorlagen erstellen

Nachdem der Anbieter die Ergebnisse aus dem VNDK-Definitionstool erfasst hat, kann er ein Android.mk und füllen Sie VNDK_SP_LIBRARIES aus. VNDK_SP_EXT_LIBRARIES und EXTRA_VENDOR_LIBRARIES nach den Prozess zum Kopieren von Bibliotheken in die vorgesehene Installation zu automatisieren Ziel.

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

Der Unterbefehl check-dep scannt Anbietermodule und prüft deren Abhängigkeiten. Wenn Verstöße erkannt werden, wird die entsprechende Abhängigkeit ausgegeben. Verwendung von Bibliotheken und Symbolen:

./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 gegen die Richtlinien verstoßende Abhängigkeit von libRS_internal.so in 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:

Option Beschreibung
--tag-file Muss auf eine geeignete Bibliotheks-Tag-Datei verweisen (unten beschrieben), die ein Von Google bereitgestellte Tabelle, in der die Kategorien des Frameworks beschrieben sind Bibliotheken.
--module-info Punkte auf die module-info.json, die vom Android-Build generiert wurden System. Es hilft dem VNDK-Definitionstool, Binärmodule mit Quelle zu verknüpfen. Code.

Zulässige Bibliotheks-Tag-Datei

Google stellt eine zulässige VNDK-Tabelle (z.B. eligible-list.csv) enthalten, die die gemeinsam genutzten Framework-Bibliotheken mit Tags kennzeichnen, können von Anbietermodulen verwendet werden:

Taggen Beschreibung
LL-NDK Gemeinsam genutzte Bibliotheken mit stabilen ABIs/APIs, die von beiden verwendet werden können Framework- und Anbietermodule.
LL-NDK-Privat Private Abhängigkeiten von LL-NDK-Bibliotheken. Anbietermodule dürfen nicht zugreifen direkt an diese Bibliotheken.
VNDK-SP Abhängigkeiten des SP-HAL-Frameworks für gemeinsam genutzte Bibliotheken.
VNDK-SP-Privat VNDK-SP-Abhängigkeiten, die nicht für alle Anbieter direkt zugänglich sind Module.
VNDK (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, die nicht für alle Anbieter direkt zugänglich sind Module.
NUR FÜR FWK Nur für Framework freigegebene gemeinsam genutzte Bibliotheken, auf die der Anbieter nicht zugreifen darf (weder direkt noch indirekt).
FWK-ONLY-RS Nur für Framework freigegebene gemeinsam genutzte Bibliotheken, auf die der Anbieter nicht zugreifen darf (außer für RS-Nutzung).

In der folgenden Tabelle werden Tags beschrieben, die für gemeinsam genutzte Bibliotheken des Anbieters verwendet werden:

Taggen Beschreibung
SP-HAL Gemeinsam genutzte Bibliotheken für die HAL-Implementierung im selben Prozess.
SP-HAL-Dep Abhängigkeiten von SP-HAL-Anbietern von gemeinsam genutzten Bibliotheken (auch als SP-HAL-Abhängigkeiten bezeichnet) außer LL-NDK und VNDK-SP).
NUR VND Framework-unsichtbaren gemeinsam genutzten Bibliotheken, auf die nicht zugegriffen werden darf. Framework-Modulen. Die kopierten erweiterten VNDK-Bibliotheken sind getaggt als NUR VND.

Beziehungen zwischen Tags:

Beziehungen zwischen Tags

Abbildung 1: Beziehungen zwischen Tags

Abfahrten

Zum Debuggen der Bibliotheksabhängigkeiten gibt der Unterbefehl deps aus die Modulabhängigkeiten:

./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 einen neuen Abschnitt beginnt. Die Zeile mit einem Tabulatorzeichen hängt vom vorhergehenden . 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 hängt von libdl.so ab.

Bei Angabe der Option --revert muss deps Unterbefehl gibt die Nutzung von Bibliotheken aus (umgekehrte Abhängigkeiten):

./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, oder mit anderen Worten, libdl.so hängt von ld-android.so Darüber hinaus zeigt diese Ausgabe, dass libdl.so ist der einzige Nutzer von ld-android.so.

Bei Angabe der Option --symbol muss der deps Unterbefehl gibt 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 exportierten Funktionen abhängt von libdl.so. Wenn sowohl die Option --symbol als auch --revert angegeben wurden, also die vom Nutzer verwendeten Symbole gedruckt werden.