Vendor Native Development Kit (VNDK) требует внесения нескольких изменений в кодовую базу, чтобы разделить проблемы между поставщиком и системой. Используйте следующее руководство, чтобы включить VNDK в кодовой базе поставщика/OEM.
Сборка системных библиотек
Система сборки содержит несколько типов объектов, включая библиотеки (общие, статические или заголовочные) и двоичные файлы.
Рисунок 1. Сборка системных библиотек.
-
core
библиотеки используются образом системы в образе системы. Эти библиотеки не могут использоватьсяvendor
vndk
vendor_available
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
.