Herramienta de definición VNDK

La herramienta de definición del VNDK ayuda a los proveedores a migrar su árbol de origen a un entorno de Android 8.0. Esta herramienta analiza los archivos binarios en las imágenes del sistema y del proveedor, y, luego, resuelve las dependencias. Según el gráfico de dependencias de módulos, la herramienta también puede detectar incumplimientos de los conceptos del VNDK y proporcionar sugerencias o información para mover módulos entre particiones. Si se especifica una imagen genérica del sistema (GSI), la herramienta de definición del VNDK puede comparar tu imagen del sistema con la GSI y determinar las bibliotecas extendidas.

En esta sección, se abordan tres comandos que se usan con frecuencia para la herramienta de definición del VNDK:

  • vndk: Calcula VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES y EXTRA_VENDOR_LIBRARIES para la solución alternativa del sistema de compilación en Android 8.0 y versiones posteriores.
  • check-dep. Verifica las dependencias de los módulos infractores de los módulos del proveedor en las bibliotecas compartidas del framework que no son aptas.
  • deps: Imprime las dependencias entre las bibliotecas compartidas y los ejecutables.

Para obtener más detalles sobre el uso avanzado de los comandos, consulta el archivo README.md en el repositorio de VNDK Definition Tool.

vndk

El subcomando vndk carga las bibliotecas compartidas y los ejecutables desde la partición del sistema y las particiones del proveedor, y, luego, resuelve las dependencias de los módulos para determinar las bibliotecas que se deben copiar en /system/lib[64]/vndk-sp-${VER} y /vendor/lib[64]. Las opciones para el subcomando vndk incluyen las siguientes:

Opción Descripción
--system Apunta a un directorio que contiene los archivos que residen en la partición del sistema.
--vendor Apunta a un directorio que contiene los archivos que residen en una partición del proveedor.
--aosp-system Apunta a un directorio que contenga los archivos que residen en la imagen genérica del sistema (GSI).
--load-extra-deps Apunta a un archivo que describa las dependencias implícitas, como dlopen().

Por ejemplo, para calcular los conjuntos de bibliotecas del 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 que aparece antes de los dos puntos depende del archivo que aparece 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 del VNDK saber que libart.so depende de libart-compiler.so.

Destino de instalación

La herramienta de definición del 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 incumplimientos, imprime los usos de la biblioteca y los símbolos dependientes que incumplen la política:

./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 infractora 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 las siguientes:

Opción Descripción
--tag-file Debe hacer referencia a un archivo de etiquetas de biblioteca apto (que se describe a continuación), que es una hoja de cálculo proporcionada por Google en la que se describen las categorías de bibliotecas compartidas del framework.
--module-info Apunta al module-info.json generado por el sistema de compilación de Android. Ayuda a la herramienta de definición del VNDK a asociar módulos binarios con código fuente.

Archivo de etiquetas de biblioteca apto

Google proporciona una hoja de cálculo del 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 Son bibliotecas compartidas con ABIs/APIs estables que pueden usar tanto los módulos del framework como los del proveedor.
LL-NDK-Private Son las dependencias privadas de las bibliotecas del LL-NDK. Los módulos del proveedor no deben acceder a estas bibliotecas directamente.
VNDK-SP Son las dependencias de las bibliotecas compartidas del framework de SP-HAL.
VNDK-SP-Private Son dependencias de VNDK-SP a las que no se puede acceder directamente desde todos los módulos del proveedor.
VNDK Son bibliotecas compartidas del framework que están disponibles para los módulos del proveedor (excepto SP-HAL y SP-HAL-Dep).
VNDK-Private Son dependencias del VNDK a las que no se puede acceder directamente desde todos los módulos del proveedor.
FWK-ONLY Son bibliotecas compartidas solo del framework a las que no deben acceder los módulos del proveedor (ni de forma directa ni indirecta).
FWK-ONLY-RS Bibliotecas compartidas solo del 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 de proveedores:

Etiqueta Descripción
SP-HAL Bibliotecas compartidas de implementación de HAL en el 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 ni VNDK-SP)
SOLO EN VND Son bibliotecas compartidas invisibles para el framework a las que no deben acceder los módulos del framework. Las bibliotecas VNDK extendidas copiadas también se etiquetan como VND-ONLY.

Relaciones entre etiquetas:

Son las relaciones entre las etiquetas.

Figura 1: Son las relaciones entre las 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 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 que libc.so depende de libdl.so.

Cuando se especifica 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
        

En esta salida, se muestra que ld-android.so se usa en libdl.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 se especifica 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 tanto la opción --symbol como la opción --revert, se imprimen los símbolos que usa el usuario.