Lo strumento di definizione VNDK aiuta i fornitori a eseguire la migrazione della struttura ad albero delle sorgenti a un ambiente Android 8.0. Questo strumento esegue la scansione dei file binari nelle immagini del sistema e del fornitore, quindi risolve le dipendenze. In base al grafo delle dipendenze dei moduli, lo strumento può anche rilevare violazioni dei concetti VNDK e fornire approfondimenti/suggerimenti per spostare i moduli tra le partizioni. Se viene specificata un'immagine di sistema generica (GSI), lo strumento di definizione VNDK può confrontare l'immagine di sistema con la GSI e determinare le librerie estese.
Questa sezione illustra tre comandi di uso frequente per lo strumento di definizione VNDK:
vndk
. Calcola VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES e EXTRA_VENDOR_LIBRARIES per la soluzione alternativa del sistema di compilazione in Android 8.0 e versioni successive.check-dep
. Controlla 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 maggiori dettagli sull'utilizzo dei comandi avanzati, consulta il file README.md nel repository dello strumento di definizione VNDK.
vndk
Il sottocomando vndk
carica le librerie condivise e gli eseguibili
dalla partizione di sistema e dalle partizioni del fornitore, quindi risolve le dipendenze del modulo per determinare le librerie da copiare in
/system/lib[64]/vndk-sp-${VER}
e /vendor/lib[64]
.
Le opzioni per il sottocomando vndk
includono:
Opzione | Descrizione |
---|---|
--system |
Fai riferimento a una directory contenente i file che si trovano nella partizione di sistema. |
--vendor |
Fai riferimento a una directory contenente i file che si trovano in una partizione del fornitore. |
--aosp-system |
Indica una directory contenente i file che si trovano nell'immagine di sistema generica (GSI). |
--load-extra-deps |
Fai riferimento a un file che descrive le dipendenze implicite, ad esempio dlopen() . |
Ad esempio, per calcolare gli insiemi di librerie VNDK, esegui il seguente
vndk
sottocomando:
./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 aggiuntive con un semplice formato file. Ogni riga rappresenta una relazione, con il file prima dei due punti che dipende dal file dopo i due punti. Ad 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 dell'installazione
Lo strumento di definizione VNDK elenca le librerie e le directory di installazione corrispondenti per le seguenti categorie:
Categoria | Directory |
---|---|
vndk_sp | Deve essere installato in /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Deve essere installato in /vendor/lib[64]/vndk-sp |
extra_vendor_libs | Deve essere installato in /vendor/lib[64] |
Crea 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 la procedura 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-dep
Il sottocomando check-dep
esegue la scansione dei moduli del fornitore e ne controlla le dipendenze. Se rileva violazioni, stampa gli utilizzi della libreria e dei simboli dipendenti in violazione:
./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, l'output di esempio seguente 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 della libreria idoneo (descritto di seguito), ovvero un foglio di lavoro fornito da Google che descrive le categorie di librerie condivise del framework. |
--module-info |
Indica il file module-info.json generato dal sistema di compilazione Android. Aiuta lo strumento di definizione VNDK ad associare i moduli binari al codice
sorgente. |
File del tag della raccolta idoneo
Google fornisce un foglio di lavoro VNDK idoneo (ad es.
eligible-list.csv
) che contrassegna le librerie condivise del framework che
possono essere utilizzate dai moduli del fornitore:
Tagga | Descrizione |
---|---|
LL-NDK | Librerie condivise con ABI/API stabili che possono essere utilizzate sia dal framework sia dai moduli del fornitore. |
LL-NDK-Private | 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-Private | Dipendenze VNDK-SP non direttamente accessibili a tutti i moduli del fornitore. |
VNDK | Librerie condivise del framework disponibili per i moduli del fornitore (tranne SP-HAL e SP-HAL-Dep). |
VNDK-Private | Dipendenze VNDK non direttamente accessibili a tutti i moduli del fornitore. |
SOLO FWK | Librerie condivise solo per il framework a cui non deve essere eseguito l'accesso da parte dei moduli del fornitore (né direttamente né indirettamente). |
FWK-ONLY-RS | Librerie condivise solo per il framework a cui non devono accedere i moduli del fornitore (tranne per gli utilizzi di RS). |
La seguente tabella descrive i tag utilizzati per le librerie condivise del fornitore:
Tagga | Descrizione |
---|---|
SP-HAL | Librerie condivise per l'implementazione di HAL nello stesso processo. |
SP-HAL-Dep | Dipendenze delle librerie condivise del fornitore SP-HAL (chiamate anche dipendenze SP-HAL escluse LL-NDK e VNDK-SP). |
SOLO VND | Librerie condivise invisibili al framework a cui non devono accedere i moduli del framework. Anche le librerie VNDK estese copiate sono contrassegnate come VND-ONLY. |
Relazioni tra i tag:

Figura 1. Relazioni tra i tag.
dipendenze
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 un carattere tabulazione inizia una nuova sezione. La riga con un carattere tabulazione dipende dalla sezione precedente. Ad esempio:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
Questo output mostra che ld-android.so
non ha dipendenze
e libc.so
dipende da libdl.so
.
Quando specifichi l'opzione --revert
, il subcomando deps
stampa gli usi delle librerie (dipendenze in ordine inverso):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Ad esempio:
/system/lib/ld-android.so /system/lib/libdl.so
Questo output mostra che ld-android.so
viene utilizzato da
libdl.so
, 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 specifichi l'opzione --symbol
, il sottocomando deps
stampa i simboli in uso:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Ad 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 sei funzioni esportate da libdl.so
. Se sono specificate sia l'opzione --symbol
sia l'opzione --revert
, vengono stampati i simboli utilizzati dall'utente.