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