Включение ВНДК

VNDK требует внесения нескольких изменений в кодовую базу, чтобы разделить проблемы между поставщиком и системой. Используйте следующее руководство, чтобы включить VNDK в кодовой базе поставщика/OEM.

Сборка системных библиотек

Система сборки содержит несколько типов объектов, включая библиотеки (общие, статические или заголовочные) и двоичные файлы.

Сборка системных библиотек
Рисунок 1. Сборка системных библиотек
  • core библиотеки используются образом системы в образе системы. Эти библиотеки не могут vndk vendor , 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 для базы кода:

  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 .