Strumento di definizione VNDK

Lo strumento di definizione VNDK aiuta i fornitori a migrare il proprio albero di origine in un ambiente Android 8.0. Questo strumento esegue la scansione dei file binari nel sistema e delle immagini del fornitore, quindi risolve le dipendenze. In base al grafico delle dipendenze dei moduli, lo strumento può anche rilevare violazioni dei concetti VNDK e fornire informazioni/suggerimenti per lo spostamento dei moduli tra le partizioni. Se viene specificata un'immagine di sistema generica (GSI), lo strumento di definizione VNDK può confrontare l'immagine del sistema con GSI e determinare le librerie estese.

Questa sezione copre tre comandi utilizzati di frequente per lo strumento di definizione VNDK:

  • vndk . Calcola VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES e EXTRA_VENDOR_LIBRARIES per una soluzione alternativa al sistema di compilazione in Android 8.0 e versioni successive.
  • check-dep . Controllare le dipendenze dei moduli in violazione dai moduli del fornitore alle librerie condivise del framework non idonee.
  • deps . Stampa le dipendenze tra le librerie condivise e gli eseguibili.

Per ulteriori dettagli sull'utilizzo avanzato dei comandi, fare riferimento al file README.md nel repository VNDK Definition Tool.

vndk

Il sottocomando vndk carica le librerie condivise e gli eseguibili dalla partizione di sistema e dalle partizioni del fornitore, quindi risolve le dipendenze dei moduli per determinare le librerie che devono essere copiate in /system/lib[64]/vndk-sp-${VER} e /vendor/lib[64] . Le opzioni per il sottocomando vndk includono:

Opzione Descrizione
--system Punta a una directory contenente i file che risiederanno nella partizione di sistema.
--vendor Puntare a una directory contenente i file che risiederanno in una partizione del fornitore.
--aosp-system Puntare a una directory contenente i file che risiederanno nell'immagine di sistema generica (GSI).
--load-extra-deps Punta a un file che descrive le dipendenze implicite, come dlopen() .

Ad esempio, per calcolare i set di librerie VNDK, eseguire il seguente sottocomando 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

Specifica dipendenze extra con un formato file semplice. Ogni riga rappresenta una relazione, con il file prima dei due punti che dipende dal file dopo i due punti. Per esempio:

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

Questa riga consente allo strumento di definizione VNDK di sapere che libart.so dipende da libart-compiler.so .

Destinazione di installazione

Lo strumento di definizione VNDK elenca le librerie e le directory di installazione corrispondenti per le seguenti categorie:

Categoria Direttorio
vndk_sp Deve essere installato su /system/lib[64]/vndk-sp-${VER}
vndk_sp_ext È necessario installarlo in /vendor/lib[64]/vndk-sp
extra_vendor_libs Deve essere installato in /vendor/lib[64]

Costruisci modelli di sistema

Dopo aver raccolto gli output dallo strumento di definizione VNDK, un fornitore può creare un Android.mk e compilare VNDK_SP_LIBRARIES , VNDK_SP_EXT_LIBRARIES e EXTRA_VENDOR_LIBRARIES per automatizzare il processo di copia delle librerie nella destinazione di installazione designata.

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

Il sottocomando check-dep analizza i moduli del fornitore e controlla le loro dipendenze. Se rileva violazioni, stampa la libreria dipendente in violazione e gli usi dei simboli:

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

Ad esempio, il seguente output di esempio mostra una dipendenza in violazione da libRS_internal.so a 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

Le opzioni per il sottocomando check-dep includono:

Opzione Descrizione
--tag-file Deve fare riferimento a un file di tag di libreria idoneo (descritto di seguito), ovvero un foglio di calcolo fornito da Google che descrive le categorie di librerie condivise del framework.
--module-info Punta al module-info.json generato dal sistema di compilazione Android. Aiuta lo strumento di definizione VNDK ad associare i moduli binari al codice sorgente.

File di tag della libreria idoneo

Google fornisce un foglio di calcolo VNDK idoneo (ad esempio eligible-list.csv ) che contrassegna le librerie condivise del framework che possono essere utilizzate dai moduli del fornitore:

Etichetta Descrizione
LL-NDK Librerie condivise con ABI/API stabili che possono essere utilizzate sia dal framework che dai moduli del fornitore.
LL-NDK-Privato Dipendenze private delle librerie LL-NDK. I moduli del fornitore non devono accedere direttamente a queste librerie.
VNDK-SP Dipendenze delle librerie condivise del framework SP-HAL.
VNDK-SP-Privato Dipendenze VNDK-SP che non sono direttamente accessibili a tutti i moduli del fornitore.
VNDK Librerie condivise del framework disponibili per i moduli del fornitore (eccetto SP-HAL e SP-HAL-Dep).
VNDK-Privato Dipendenze VNDK che non sono direttamente accessibili a tutti i moduli del fornitore.
SOLO FWK Librerie condivise solo framework a cui non è consentito l'accesso da parte dei moduli del fornitore (né direttamente né indirettamente).
FWK-SOLO-RS Librerie condivise solo framework a cui non è consentito accedere dai moduli del fornitore (ad eccezione degli utilizzi RS).

La tabella seguente descrive i tag utilizzati per le librerie condivise del fornitore:

Etichetta Descrizione
SP-HAL Librerie condivise di implementazione HAL dello stesso processo.
SP-HAL-Dip Dipendenze delle librerie condivise del fornitore SP-HAL (ovvero dipendenze SP-HAL escludendo LL-NDK e VNDK-SP).
SOLO VND Librerie condivise invisibili al framework a cui non è necessario accedere dai moduli del framework. Anche le librerie VNDK estese copiate verranno contrassegnate come VND-ONLY.

Relazioni tra i tag:

Relazioni tra tag.
Figura 1. Relazioni tra tag.

dipende

Per eseguire il debug delle dipendenze della libreria, il sottocomando deps stampa le dipendenze del modulo:

./vndk_definition_tool.py deps \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

L'output è costituito da più righe. La riga senza carattere di tabulazione inizia una nuova sezione. La riga con un carattere di tabulazione dipende dalla sezione precedente. Per esempio:

/system/lib/ld-android.so
/system/lib/libc.so
        /system/lib/libdl.so

Questo output mostra che ld-android.so non ha una dipendenza e libc.so dipende da libdl.so .

Quando si specifica l'opzione --revert , il sottocomando deps stampa gli utilizzi delle librerie (dipendenze invertite):

./vndk_definition_tool.py deps \
    --revert \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor

Per esempio:

/system/lib/ld-android.so
        /system/lib/libdl.so
        

Questo output mostra che ld-android.so è utilizzato da libdl.so o, in altre parole, libdl.so dipende da ld-android.so . Inoltre, questo output mostra che libdl.so è l'unico utente di ld-android.so .

Quando si specifica l'opzione --symbol , il sottocomando deps stampa i simboli utilizzati:

./vndk_definition_tool.py deps \
    --symbol \
    --system ${ANDROID_PRODUCT_OUT}/system \
    --vendor ${ANDROID_PRODUCT_OUT}/vendor
    

Per esempio:

/system/lib/libc.so
        /system/lib/libdl.so
                android_get_application_target_sdk_version
                dl_unwind_find_exidx
                dlclose
                dlerror
                dlopen
                dlsym

Questo output mostra che libc.so dipende da 6 funzioni esportate da libdl.so . Se vengono specificate sia l'opzione --symbol che l'opzione --revert , verranno stampati i simboli utilizzati dall'utente.