Инструмент определения 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] . Параметры подкоманды 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 сканирует модули сторонних разработчиков и проверяет их зависимости. Если обнаруживаются нарушения, она выводит информацию об использовании зависимой библиотеки и символов, нарушающих зависимость:
./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 можно использовать следующие:
| Вариант | Описание |
|---|---|
--tag-file | Необходимо сослаться на подходящий файл тегов библиотеки (описанный ниже), который представляет собой предоставленную Google электронную таблицу с описанием категорий общих библиотек фреймворков. |
--module-info | Указывает на файл module-info.json , сгенерированный системой сборки Android. Он помогает инструменту определения VNDK связывать бинарные модули с исходным кодом. |
Файл с соответствующими библиотечными тегами
Google предоставляет таблицу совместимости VNDK (например, eligible-list.csv ), в которой указаны библиотеки, используемые модулями сторонних разработчиков:
| Ярлык | Описание |
|---|---|
| ЛЛ-НДК | Общие библиотеки со стабильными ABI/API, которые могут использоваться как модулями фреймворка, так и модулями сторонних разработчиков. |
| ЛЛ-НДК-Частный | Закрытые зависимости библиотек LL-NDK. Модули сторонних разработчиков не должны обращаться к этим библиотекам напрямую. |
| ВНДК-СП | Зависимости от разделяемых библиотек фреймворка SP-HAL. |
| VNDK-SP-Private | Зависимости VNDK-SP, которые недоступны напрямую для всех модулей поставщика. |
| ВНДК | Общие библиотеки фреймворка, доступные для модулей поставщиков (за исключением SP-HAL и SP-HAL-Dep). |
| VNDK-Private | Зависимости VNDK, которые недоступны напрямую для всех модулей поставщика. |
| FWK-ONLY | Библиотеки, используемые только в рамках фреймворка и не допускающие доступа со стороны модулей сторонних разработчиков (ни напрямую, ни косвенно). |
| FWK-ONLY-RS | Библиотеки, используемые только в рамках фреймворка и не допускающие доступа со стороны модулей сторонних разработчиков (за исключением случаев использования в рамках RS). |
В следующей таблице описаны теги, используемые для библиотек, предоставляемых поставщиками:
| Ярлык | Описание |
|---|---|
| СП-ХАЛ | Библиотеки, используемые для реализации HAL в рамках одного процесса. |
| СП-ХАЛ-Деп | Зависимости от библиотек, используемых поставщиками в рамках SP-HAL (также называемые зависимостями SP-HAL, за исключением LL-NDK и VNDK-SP). |
| ТОЛЬКО VND | Невидимые для фреймворка разделяемые библиотеки, к которым модули фреймворка не должны обращаться. Скопированные расширенные библиотеки VNDK также помечены как VND-ONLY. |
Взаимосвязи между тегами:

Рисунок 1. Взаимосвязь между метками.
зависимости
Для отладки зависимостей библиотек подкоманда 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 зависит от шести функций, экспортируемых из libdl.so . Если указаны как параметр --symbol , так и параметр --revert , то выводятся символы, используемые пользователем.