Для использования комплекта разработки 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.