Включить ВНДК

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

  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 .