Инструмент определения VNDK помогает поставщикам перенести исходное дерево в среду Android 8.0. Этот инструмент сканирует двоичные файлы в системе и изображениях поставщиков, а затем разрешает зависимости. На основе графа зависимостей модулей инструмент также может обнаруживать нарушения концепций VNDK и предоставлять информацию/предложения по перемещению модулей между разделами. Если указан универсальный образ системы (GSI), инструмент определения VNDK может сравнить ваш образ системы с GSI и определить расширенные библиотеки.
В этом разделе рассматриваются три часто используемые команды инструмента определения VNDK:
-
vndk
. Вычислите VNDK_SP_LIBRARIES, VNDK_SP_EXT_LIBRARIES и EXTRA_VENDOR_LIBRARIES для обхода системы сборки в Android 8.0 и выше. -
check-dep
. Проверьте зависимости нарушающих модулей от модулей поставщика до недопустимых общих библиотек платформы. -
deps
. Распечатайте зависимости между общими библиотеками и исполняемыми файлами.
Дополнительные сведения об использовании расширенных команд см. в файле README.md в репозитории VNDK Definition Tool.
вндк
vndk
загружает общие библиотеки и исполняемые файлы из системного раздела и разделов поставщиков, затем разрешает зависимости модулей, чтобы определить библиотеки, которые необходимо скопировать в /system/lib[64]/vndk-sp-${VER}
и /vendor/lib[64]
. /vendor/lib[64]
. Опции подкоманды vndk
включают:
Вариант | Описание |
---|---|
--system | Укажите каталог, содержащий файлы, которые будут находиться в системном разделе. |
--vendor | Укажите каталог, содержащий файлы, которые будут находиться в разделе поставщика. |
--aosp-system | Укажите каталог, содержащий файлы, которые будут находиться в универсальном образе системы (GSI). |
--load-extra-deps | Укажите файл, описывающий неявные зависимости, например dlopen() . |
Например, чтобы вычислить наборы библиотек VNDK, выполните следующую подкоманду 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
Укажите дополнительные зависимости с помощью простого формата файла. Каждая строка представляет отношение, где файл перед двоеточием зависит от файла после двоеточия. Например:
/system/lib/libart.so: /system/lib/libart-compiler.so
Эта строка сообщает инструменту определения VNDK, что libart.so
зависит от libart-compiler.so
.
Место установки
Инструмент определения VNDK перечисляет библиотеки и соответствующие каталоги установки для следующих категорий:
Категория | Каталог |
---|---|
vndk_sp | Необходимо установить в /system/lib[64]/vndk-sp-${VER} |
vndk_sp_ext | Необходимо установить в /vendor/lib[64]/vndk-sp |
extra_vendor_libs | Необходимо установить в /vendor/lib[64] |
Создание системных шаблонов
После сбора выходных данных из инструмента определения VNDK поставщик может создать Android.mk
и заполнить VNDK_SP_LIBRARIES
, VNDK_SP_EXT_LIBRARIES
и EXTRA_VENDOR_LIBRARIES
, чтобы автоматизировать процесс копирования библиотек в указанное место установки.
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
dep сканирует модули поставщиков и проверяет их зависимости. Если он обнаруживает нарушения, он печатает нарушающую зависимую библиотеку и использование символов:
./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
Например, следующий пример вывода показывает нарушение зависимости от libRS_internal.so
до 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
Опции подкоманды check-dep
dep включают:
Вариант | Описание |
---|---|
--tag-file | Должен ссылаться на подходящий файл библиотечных тегов (описанный ниже), который представляет собой электронную таблицу, предоставленную Google, с описанием категорий общих библиотек фреймворка. |
--module-info | Указывает на module-info.json , сгенерированный системой сборки Android. Это помогает инструменту определения VNDK связать двоичные модули с исходным кодом. |
Допустимый файл библиотечных тегов
Google предоставляет подходящую электронную таблицу VNDK (например eligible-list.csv
), которая помечает общие библиотеки фреймворка, которые могут использоваться модулями поставщика:
Ярлык | Описание |
---|---|
ЛЛ-НДК | Общие библиотеки со стабильными ABI/API, которые могут использоваться как модулями платформы, так и модулями поставщиков. |
LL-NDK-Частный | Частные зависимости библиотек LL-NDK. Модули производителя не должны обращаться к этим библиотекам напрямую. |
ВНДК-СП | Зависимости общих библиотек платформы SP-HAL. |
ВНДК-СП-Приват | Зависимости VNDK-SP, которые не доступны напрямую для всех модулей поставщика. |
ВНДК | Общие библиотеки Framework, доступные для модулей поставщиков (кроме SP-HAL и SP-HAL-Dep). |
ВНДК-Приват | Зависимости VNDK, которые не доступны напрямую для всех модулей поставщиков. |
ТОЛЬКО FWK | Общие библиотеки только для платформы, к которым не должны обращаться модули поставщиков (ни прямо, ни косвенно). |
FWK-ONLY-RS | Совместно используемые библиотеки только для платформы, к которым не должны обращаться модули поставщиков (за исключением использования RS). |
В следующей таблице описаны теги, используемые для общих библиотек поставщиков:
Ярлык | Описание |
---|---|
СП-ХАЛ | Совместно используемые библиотеки реализации HAL для одного и того же процесса. |
SP-HAL-Dep | Зависимости общих библиотек поставщика SP-HAL (также известные как зависимости SP-HAL, за исключением LL-NDK и VNDK-SP). |
ТОЛЬКО VND | Невидимые для фреймворка общие библиотеки, к которым не должны обращаться модули фреймворка. Скопированные расширенные библиотеки VNDK также будут помечены как VND-ONLY. |
Отношения между тегами:

депс
Для отладки зависимостей библиотеки подкоманда deps
выводит зависимости модуля:
./vndk_definition_tool.py deps \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Вывод состоит из нескольких строк. Строка без символа табуляции начинает новый раздел. Строка с символом табуляции зависит от предыдущего раздела. Например:
/system/lib/ld-android.so
/system/lib/libc.so
/system/lib/libdl.so
Этот вывод показывает, что ld-android.so
не имеет зависимости, а libc.so
зависит от libdl.so
.
При указании параметра --revert
подкоманда deps
выводит использование библиотек (обратные зависимости):
./vndk_definition_tool.py deps \
--revert \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Например:
/system/lib/ld-android.so
/system/lib/libdl.so
Этот вывод показывает, что ld-android.so
используется libdl.so
, или, другими словами, libdl.so
зависит от ld-android.so
. Кроме того, эти выходные данные показывают, что libdl.so
является единственным пользователем ld-android.so
.
При указании параметра --symbol
подкоманда deps
печатает используемые символы:
./vndk_definition_tool.py deps \
--symbol \
--system ${ANDROID_PRODUCT_OUT}/system \
--vendor ${ANDROID_PRODUCT_OUT}/vendor
Например:
/system/lib/libc.so
/system/lib/libdl.so
android_get_application_target_sdk_version
dl_unwind_find_exidx
dlclose
dlerror
dlopen
dlsym
Этот вывод показывает, что libc.so
зависит от 6 функций, экспортированных из libdl.so
. Если указаны и параметр --symbol
, и параметр --revert
, будут напечатаны символы, используемые пользователем.