Как включить VNDK

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

  1. Определите, соответствует ли устройство требованиям, рассчитав необходимые размеры разделов vendor.img и system.img.
  2. Включить функцию 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.