La herramienta de definición de VNDK ayuda a los proveedores a migrar su árbol de origen a un entorno de Android 8.0. Esta herramienta escanea los archivos binarios en el sistema y las imágenes del proveedor y, luego, resuelve las dependencias. En función del grafo de dependencias del módulo, la herramienta también puede detectar incumplimientos de los conceptos de VNDK y proporcionar estadísticas o sugerencias para mover módulos entre particiones. Si se especifica una imagen genérica del sistema (GSI), la herramienta de definición de VNDK puede comparar tu imagen del sistema con la GSI y determinar las bibliotecas extendidas.
En esta sección, se abordan tres comandos de uso frecuente para la herramienta de definición de VNDK:
vndk
. Calcula VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES y EXTRA_VENDOR_LIBRARIES para la solución del sistema de compilación en Android 8.0 y versiones posteriores.check-dep
. Verifica las dependencias de módulos que incumplen los módulos del proveedor a las bibliotecas compartidas del framework no aptas.deps
. Imprime las dependencias entre las bibliotecas compartidas y los ejecutables.
Para obtener más detalles sobre el uso de comandos avanzados, consulta el archivo README.md en el repositorio de la herramienta de definición de VNDK.
vndk
El subcomando vndk
carga las bibliotecas compartidas y los ejecutables de la partición del sistema y las particiones del proveedor y, luego, resuelve las dependencias del módulo para determinar las bibliotecas que se deben copiar en /system/lib[64]/vndk-sp-${VER}
y /vendor/lib[64]
.
Entre las opciones del subcomando vndk
, se incluyen las siguientes:
Opción | Descripción |
---|---|
--system |
Dirige a un directorio que contenga los archivos que residen en la partición del sistema. |
--vendor |
Dirige a un directorio que contenga los archivos que residen en una partición del proveedor. |
--aosp-system |
Dirige a un directorio que contenga los archivos que residen en la imagen genérica del sistema (GSI). |
--load-extra-deps |
Dirige a un archivo que describa las dependencias implícitas, como dlopen() . |
Por ejemplo, para calcular los conjuntos de bibliotecas de VNDK, ejecuta el siguiente subcomando 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
Especifica dependencias adicionales con un formato de archivo simple. Cada línea representa una relación, en la que el archivo anterior al dos puntos depende del archivo posterior al dos puntos. Por ejemplo:
/system/lib/libart.so: /system/lib/libart-compiler.so
Esta línea le informa a la herramienta de definición de VNDK que libart.so
depende de libart-compiler.so
.
Destino de la instalación
La herramienta de definición de VNDK enumera las bibliotecas y los directorios de instalación correspondientes para las siguientes categorías:
Categoría | Directorio |
---|---|
vndk_sp | Se debe instalar en /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Se debe instalar en /vendor/lib[64]/vndk-sp |
extra_vendor_libs | Se debe instalar en /vendor/lib[64] |
Plantillas del sistema de compilación
Después de recopilar los resultados de la herramienta de definición del VNDK, un proveedor puede crear un Android.mk
y completar VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
y EXTRA_VENDOR_LIBRARIES
para automatizar el proceso de copia de bibliotecas en el destino de instalación designado.
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
El subcomando check-dep
analiza los módulos del proveedor y verifica sus dependencias. Si detecta infracciones, imprime los usos de símbolos y bibliotecas dependientes que incumplen las reglas:
./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
Por ejemplo, en el siguiente resultado de muestra, se muestra una dependencia que infringe de 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
Entre las opciones del subcomando check-dep
, se incluyen las siguientes:
Opción | Descripción |
---|---|
--tag-file |
Debe hacer referencia a un archivo de etiqueta de biblioteca apto (que se describe a continuación), que es una hoja de cálculo proporcionada por Google que describe las categorías de bibliotecas compartidas del framework. |
--module-info |
Apunta al module-info.json que genera el sistema de compilación de Android. Ayuda a la herramienta de definición de VNDK a asociar módulos binarios con código fuente. |
Archivo de etiqueta de biblioteca apto
Google proporciona una hoja de cálculo de VNDK apta (p.ej., eligible-list.csv
) que etiqueta las bibliotecas compartidas del framework que pueden usar los módulos del proveedor:
Etiqueta | Descripción |
---|---|
LL-NDK | Bibliotecas compartidas con ABI o APIs estables que pueden usar los módulos del framework y del proveedor. |
LL-NDK-Private | Dependencias privadas de bibliotecas de LL-NDK. Los módulos de proveedores no deben acceder directamente a estas bibliotecas. |
VNDK-SP | Dependencias de bibliotecas compartidas del framework de SP-HAL. |
VNDK-SP-Private | Dependencias de VNDK-SP a las que no se puede acceder directamente desde todos los módulos del proveedor |
VNDK | Bibliotecas compartidas del framework que están disponibles para los módulos de proveedores (excepto SP-HAL y SP-HAL-Dep). |
VNDK-Private | Dependencias de VNDK a las que no todos los módulos del proveedor pueden acceder directamente |
FWK-ONLY | Bibliotecas compartidas solo de framework a las que no deben acceder los módulos del proveedor (ni de forma directa ni indirecta). |
FWK-ONLY-RS | Son bibliotecas compartidas solo de framework a las que no deben acceder los módulos del proveedor (excepto para los usos de RS). |
En la siguiente tabla, se describen las etiquetas que se usan para las bibliotecas compartidas del proveedor:
Etiqueta | Descripción |
---|---|
SP-HAL | Bibliotecas compartidas de implementación de HAL del mismo proceso |
SP-HAL-Dep | Dependencias de bibliotecas compartidas del proveedor de SP-HAL (también llamadas dependencias de SP-HAL, sin incluir LL-NDK y VNDK-SP) |
VND-ONLY | Bibliotecas compartidas invisibles para el framework a las que no deben acceder los módulos del framework. Las bibliotecas de VNDK extendidas copiadas también se etiquetan como VND-ONLY. |
Relaciones entre etiquetas:

Figura 1: Relaciones entre etiquetas
dependencias
Para depurar las dependencias de la biblioteca, el subcomando deps
imprime las dependencias del módulo:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
El resultado consta de varias líneas. La línea sin un carácter de tabulación comienza una sección nueva. La línea con un carácter de tabulación depende de la sección anterior. Por ejemplo:
/system/lib/ld-android.so /system/lib/libc.so /system/lib/libdl.so
Este resultado muestra que ld-android.so
no tiene una dependencia y que libc.so
depende de libdl.so
.
Cuando especificas la opción --revert
, el subcomando deps
imprime los usos de las bibliotecas (dependencias inversas):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Por ejemplo:
/system/lib/ld-android.so /system/lib/libdl.so
Este resultado muestra que libdl.so
usa ld-android.so
, o en otras palabras, que libdl.so
depende de ld-android.so
. Además, este resultado muestra que
libdl.so
es el único usuario de ld-android.so
.
Cuando especificas la opción --symbol
, el subcomando deps
imprime los símbolos que se usan:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Por ejemplo:
/system/lib/libc.so /system/lib/libdl.so android_get_application_target_sdk_version dl_unwind_find_exidx dlclose dlerror dlopen dlsym
Este resultado muestra que libc.so
depende de seis funciones exportadas desde libdl.so
. Si se especifican las opciones --symbol
y --revert
, se imprimen los símbolos que usa el usuario.