Для использования Vendor Native Development Kit (VNDK) требуется внести ряд изменений в кодовую базу, чтобы разделить задачи между поставщиком и системой. Следуйте приведенному ниже руководству, чтобы включить VNDK в кодовой базе поставщика/OEM.
Системные библиотеки сборки
Система сборки содержит несколько типов объектов, включая библиотеки (разделяемые, статические или заголовочные) и бинарные файлы.

Рисунок 1. Создание системных библиотек.
-
coreбиблиотеки используются образом системы, находящимся в этом образе системы. Эти библиотеки не могут использоваться библиотекамиvendor,vendor_available,vndkилиvndk-sp.cc_library { name: "libThatIsCore", ... }
- Библиотеки,
vendor-only(илиproprietary), используются образом поставщика, на самом образе поставщика.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- Библиотеки,
vendor_available, используются образом поставщика, на этом образе поставщика (могут содержать дубликатыcoreбиблиотек).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
- Библиотеки
vndkиспользуются образом поставщика в образе системы.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- Библиотеки
vndk-spиспользуются как образом производителя, так и косвенно образом образом системы.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- Библиотеки
llndkиспользуются как системными образами, так и образами от производителя.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
Если библиотека помечена как vendor_available:true , она собирается дважды:
- Один раз для платформы (и, следовательно, установлен в
/system/lib) - Один раз для поставщика (и, следовательно, установлен в
/vendor/libили VNDK APEX)
Версии библиотек от сторонних производителей собираются с флагом -D__ANDROID_VNDK__ . Частные системные компоненты, которые могут существенно измениться в будущих версиях Android, отключаются с помощью этого флага. Кроме того, разные библиотеки экспортируют разные наборы заголовочных файлов (например, liblog ). Параметры, специфичные для варианта библиотеки от стороннего производителя, можно указать в файле Android.bp в:
target: { vendor: { … } }Включите VNDK для кодовой базы
Чтобы включить VNDK для кодовой базы:
- Определите соответствие требованиям, рассчитав необходимые размеры разделов
vendor.imgиsystem.img. - Включите
BOARD_VNDK_VERSION=current. Вы можете добавить его вBoardConfig.mkили собрать компоненты с его использованием напрямую (например,m -j BOARD_VNDK_VERSION=current MY-LIB).
После включения параметра BOARD_VNDK_VERSION=current система сборки устанавливает следующие требования к зависимостям и заголовочным файлам.
Управление зависимостями
Объект vendor , зависящий от core компонента, который отсутствует в vndk или в качестве объекта vendor , должен быть разрешен с использованием одного из следующих вариантов:
- Зависимость можно удалить.
- Если
coreкомпонент принадлежитvendor, он может быть помечен какvendor_availableилиvendor. - Изменение, в результате которого основной объект станет частью
vndkможет быть передано в Google.
Кроме того, если core компонент имеет зависимости от vendor компонента, этот vendor компонент должен быть преобразован в core компонент , или же зависимость должна быть устранена иным способом (например, путем удаления зависимости или перемещения зависимости в vendor компонент).
Управление заголовками
Необходимо удалить глобальные зависимости заголовочных файлов, чтобы система сборки могла определить, следует ли собирать заголовочные файлы с -D__ANDROID_VNDK__ или без него. Например, к заголовочным файлам libutils, таким как utils/StrongPointer.h по-прежнему можно получить доступ с помощью библиотеки заголовочных файлов libutils_headers .
Некоторые заголовочные файлы (например, unistd.h ) больше нельзя включать транзитивно, но их можно включать локально.
Наконец, публичная часть файла private/android_filesystem_config.h была перенесена в cutils/android_filesystem_config.h . Для управления этими заголовочными файлами выполните одно из следующих действий:
- Удалите зависимость от
private/android_filesystem_config.h, заменив все макросыAID_*вызовамиgetgrnam/getpwnam, если это возможно. Например:-
(uid_t)AID_WIFIпреобразуется вgetpwnam("wifi")->pw_uid. -
(gid_t)AID_SDCARD_Rпреобразуется вgetgrnam("sdcard_r")->gr_gid.
private/android_filesystem_config.h. -
- Для жестко заданных параметров AIS добавьте
cutils/android_filesystem_config.h.