Google is committed to advancing racial equity for Black communities. See how.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Herramienta de definición de VNDK

La herramienta de definición de VNDK ayuda a los proveedores a migrar su árbol de origen a un entorno Android 8.0. Esta herramienta escanea archivos binarios en el sistema y las imágenes del proveedor y luego resuelve las dependencias. Según 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 de sistema genérica (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 crear una solución alternativa del sistema en Android 8.0 y versiones posteriores.
  • check-dep . Verifique las dependencias de los módulos infractores desde los módulos del proveedor hasta las bibliotecas compartidas de marcos no elegibles.
  • deps . Imprima 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 de 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 Señale un directorio que contenga los archivos que residirán en la imagen del sistema genérico (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 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 instalar en /system/lib[64]/vndk-sp-${VER}
vndk_sp_ext Debe instalar en /vendor/lib[64]/vndk-sp
extra_vendor_libs Debe instalar 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 para copiar bibliotecas al 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)),)

cheque-dep

El subcomando check-dep escanea los módulos del proveedor y verifica sus dependencias. Si detecta infracciones, imprime los usos de símbolos y bibliotecas dependientes infractores:

./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, la siguiente salida de muestra muestra una dependencia libRS_internal.so 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 categorías de bibliotecas compartidas de marco.
--module-info Apunta al module-info.json generado por el sistema de compilación de Android. Ayuda a la herramienta de definición VNDK a asociar módulos binarios con el código fuente.

Archivo de etiqueta de biblioteca elegible

Google proporciona una hoja de cálculo VNDK elegible (p. Ej eligible-list.csv ) que etiqueta las bibliotecas compartidas del marco que pueden utilizar los módulos de proveedores:

Etiqueta Descripción
LL-NDK Bibliotecas compartidas con ABI / API estables que pueden ser utilizadas tanto por el marco como por los módulos del proveedor.
LL-NDK-Privado Dependencias privadas de bibliotecas LL-NDK. Los módulos de los 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 que no son directamente accesibles para todos los módulos de proveedores.
VNDK Bibliotecas compartidas de framework que están disponibles para módulos de proveedores (excepto SP-HAL y SP-HAL-Dep).
VNDK-Privado Dependencias de VNDK que no son directamente accesibles para todos los módulos de proveedores.
SOLO FWK Bibliotecas compartidas de solo marco a las que no deben acceder los módulos de proveedores (ni directa ni indirectamente).
FWK-ONLY-RS Bibliotecas compartidas de solo marco a las que no deben acceder los módulos de proveedores (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 de HAL del mismo proceso.
SP-HAL-Dep Dependencias de bibliotecas compartidas del proveedor SP-HAL (también conocidas como dependencias SP-HAL, excluidas LL-NDK y VNDK-SP).
SOLO VND Bibliotecas compartidas invisibles para el 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:

Figura 1. 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 un 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

Esta salida 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 invertidas):

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

Esta salida muestra que ld-android.so es usado por libdl.so , o en otras palabras, libdl.so depende de ld-android.so . Además, esta salida 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 utilizan:

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

Esta salida muestra que libc.so depende de 6 funciones exportadas desde libdl.so . Si se especifican tanto la opción --symbol opción --revert , se --revert los símbolos utilizados por el usuario.