La herramienta de definición de VNDK ayuda a los proveedores a migrar su árbol de fuentes a un entorno de Android 8.0. Esta herramienta escanea archivos binarios en el sistema y las imágenes del proveedor y luego resuelve las dependencias. Basándose en el gráfico de dependencia del módulo, la herramienta también puede detectar violaciones a los conceptos de VNDK y proporcionar información/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 la imagen de su sistema con la GSI y determinar las bibliotecas extendidas.
Esta sección cubre tres comandos de uso frecuente para la herramienta de definición de VNDK:
-
vndk
Calcule 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
. Verifique las dependencias del módulo infractor desde los módulos del proveedor hasta las bibliotecas compartidas del marco no elegible. -
deps
. Imprime las dependencias entre las bibliotecas compartidas y los ejecutables.
Para obtener más detalles sobre el uso de comandos avanzados, consulte 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 desde la partición del sistema y las particiones del proveedor, luego resuelve las dependencias del módulo para determinar las bibliotecas que deben copiarse en /system/lib[64]/vndk-sp-${VER}
y /vendor/lib[64]
. Las opciones para el subcomando vndk
incluyen:
Opción | Descripción |
---|---|
--system | Apunte a un directorio que contenga los archivos que residirán en la partición del sistema. |
--vendor | Apunte a un directorio que contenga los archivos que residirán en una partición de proveedor. |
--aosp-system | Apunte a un directorio que contenga los archivos que residirán en la imagen genérica del sistema (GSI). |
--load-extra-deps | Apunte a un archivo que describa las dependencias implícitas, como dlopen() . |
Por ejemplo, para calcular los conjuntos de bibliotecas VNDK, ejecute 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
Especifique dependencias adicionales con un formato de archivo simple. Cada línea representa una relación, con el archivo antes de los dos puntos dependiendo del archivo después de los dos puntos. Por ejemplo:
/system/lib/libart.so: /system/lib/libart-compiler.so
Esta línea le permite a la herramienta de definición de VNDK saber que libart.so
depende de libart-compiler.so
.
Destino de 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 | Debe instalarse en /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Debe instalarse en /vendor/lib[64]/vndk-sp |
extra_vendor_libs | Debe instalarse en /vendor/lib[64] |
Construir plantillas de sistema
Después de recopilar los resultados de la herramienta de definición de 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
escanea los módulos del proveedor y verifica sus dependencias. Si detecta infracciones, imprime la biblioteca dependiente infractora y los usos de símbolos:
./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, el siguiente resultado de muestra muestra una dependencia violatoria 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
Las opciones para el subcomando check-dep
incluyen:
Opción | Descripción |
---|---|
--tag-file | Debe hacer referencia a un archivo de etiqueta de biblioteca elegible (descrito a continuación), que es una hoja de cálculo proporcionada por Google que describe las categorías de bibliotecas compartidas del marco. |
--module-info | Apunta al module-info.json generado por 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 elegible
Google proporciona una hoja de cálculo VNDK elegible (por ejemplo eligible-list.csv
) que etiqueta las bibliotecas compartidas del marco que pueden usar los módulos del proveedor:
Etiqueta | Descripción |
---|---|
LL-NDK | Bibliotecas compartidas con ABI/API estables que pueden usar tanto el marco como los módulos del proveedor. |
LL-NDK-Privado | Dependencias privadas de bibliotecas LL-NDK. Los módulos de proveedores no deben acceder a estas bibliotecas directamente. |
VNDK-SP | Dependencias de bibliotecas compartidas del marco SP-HAL. |
VNDK-SP-Privado | Dependencias de VNDK-SP a las que no todos los módulos de proveedores pueden acceder directamente. |
VNDK | Bibliotecas compartidas del marco que están disponibles para los módulos del proveedor (excepto SP-HAL y SP-HAL-Dep). |
VNDK-Privado | Dependencias de VNDK a las que no todos los módulos de proveedores pueden acceder directamente. |
SOLO FWK | Bibliotecas compartidas solo del marco a las que no deben acceder los módulos del proveedor (ni directa ni indirectamente). |
FWK-SÓLO-RS | Bibliotecas compartidas solo del marco de trabajo a las que no deben acceder los módulos del proveedor (excepto para usos de RS). |
La siguiente tabla describe las etiquetas utilizadas para las bibliotecas compartidas de proveedores:
Etiqueta | Descripción |
---|---|
SP-HAL | Bibliotecas compartidas de implementación HAL del mismo proceso. |
SP-HAL-Dep | Dependencias de bibliotecas compartidas del proveedor de SP-HAL (también conocidas como dependencias de SP-HAL que excluyen LL-NDK y VNDK-SP). |
SOLO VND | Bibliotecas compartidas invisibles del marco a las que no deben acceder los módulos del marco. Las bibliotecas VNDK extendidas copiadas también se etiquetarán como VND-ONLY. |
Relaciones entre etiquetas:
deps
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
La salida consta de varias líneas. La línea sin carácter de tabulación inicia una nueva sección. 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 libc.so
depende de libdl.so
.
Al especificar 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 ld-android.so
usa libdl.so
o, en otras palabras, libdl.so
depende de ld-android.so
. Además, este resultado muestra que libdl.so
es el único usuario de ld-android.so
.
Al especificar la opción --symbol
, el subcomando deps
imprime los símbolos que se están utilizando:
./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 6 funciones exportadas desde libdl.so
. Si se especifican tanto la opción --symbol
como la opción --revert
, se imprimirán los símbolos utilizados por el usuario.