Генерация промежуточного программного обеспечения

Промежуточное ПО VSIDL (Vehicle Services Interface Definition Language) определяет набор библиотек Rust, создающих абстрактный слой поверх стека связи программно-определяемого транспортного средства (SDV) для упрощения использования экосистемы SDV. Промежуточное ПО предоставляет стандартизированный способ взаимодействия сервисов друг с другом. И сгенерированный код VSIDL, и ваш собственный код используют эти библиотеки.

Компилятор языка определения интерфейса служб транспортных средств (VSIDLC) проверяет определения, генерирует файлы сборки ( Android.bp ), содержащие цели genrule для создания кода промежуточного ПО Rust в процессе сборки, и создает конфигурации развертывания из файлов VSIDL и protobuf в каталоге. На рисунке 1 показаны входные данные для VSIDLC и выходные данные, сгенерированные VSIDLC:

Входы и выходы VSIDLC

Рисунок 1. Входы и выходы VSIDLC.

Ниже приведено пояснение к диаграмме:

  1. В качестве входных данных вы предоставляете следующие файлы, организованные в каталоги, известные как каталоги:

    • Протофайлы (с расширением .proto ) содержат структуры данных, которыми обмениваются сервисные модули, определенные VSIDL.
    • Файлы VSIDL (с расширением .vsidl ) определяют пакеты услуг, единицы услуг и принадлежность типов единиц.
    • Файлы Android.bp в каждом каталоге определяют цели сборки rust_protobuf для всех proto-файлов в каталоге. VSIDLC использует crate_name указанный в этих целях, для ссылки на сгенерированные типы сообщений protobuf в Rust.
  2. Для вывода следующих файлов необходимо запустить VSIDLC:

    • Файлы Android.bp генерируются в папке каждого пакета сервиса. Если вы установите --genrule , эти цели будут генерировать актуальные файлы Rust в процессе сборки и включать необходимые зависимости библиотеки rust_protobuf .

    • Для каждого пакета сервисов генерируются файлы service_bundle.rs , содержащие основную struct и функции для взаимодействия с компонентами промежуточного программного обеспечения.

    • Для каждой службы RPC, принадлежащей пакету, генерируются файлы lib.rs , которые помещаются в подпапку, названную в честь службы RPC. Эти файлы включают в себя:

    • Трейт Interface реализует логику на стороне сервера.

    • Структура Client выполняет вызовы к RPC-сервису.

    • Файлы diagnostics.rs генерируются, если в файле VSIDL присутствует параметр diagnostics_declaration , предоставляющий необходимые привязки для диагностики на основе UDS.

    • Конфигурации развертывания и безопасности генерируются при использовании флага --apex . Они размещаются в каталогах apex/ и configs/ и включают файлы .textproto для оркестрации, а также политики безопасности (разрешения), необходимые для взаимодействия между сервисами.

    • При использовании флага --services генерируется шаблон сервиса. Он размещается в каталоге services/ и содержит основу приложения Rust, включая файл main.rs , для быстрого запуска вашей реализации.

Запустите VSIDLC

Для запуска VSIDLC:

  1. Если вы еще не настроили свою среду, запустите команду source build/envsetup.sh .

  2. Для сборки VSIDLC выполните следующую команду:

    m vsidlc
    
  3. Убедитесь, что в каталоге VSIDL находятся необходимые файлы сборки, protobuf и VSIDL.

  4. Выполните команду vsidlc :

    vsidlc -c path_to_catalog -o output_directory -p
    

    Где:

    • -c path_to_catalog указывает путь к основному каталогу каталога.
    • -o output_directory указывает родительский каталог, в котором создается выходной каталог generated_rs .
    • (необязательно) --apex генерирует артефакты оркестровки и конфигурации безопасности.
    • (необязательно) --services генерирует шаблон приложения Rust для быстрого запуска.
    • (необязательно) -p удаляет существующие сгенерированные каталоги (например, generated_rs , а также, если применимо, apex , configs или services ) перед генерацией новых файлов.
    • (необязательно) --genrule генерирует правила генерации Android.bp вместо кода Rust. Правила генерации генерируют необходимый код Rust на лету при запуске m , чтобы избежать помещения сгенерированных артефактов под систему контроля версий.

    Создается каталог generated_rs , содержащий файл Android.bp и сгенерированные файлы промежуточного ПО. Этот каталог организован в подкаталоги, соответствующие полным именам определенных вами пакетов служб.

Обработка зависимостей

По умолчанию VSIDLC генерирует код только для основного каталога, а не для каталогов зависимостей. Если ваш каталог использует типы или сервисные единицы, определенные в других каталогах, укажите путь к каждому каталогу зависимостей с помощью флага -d :

vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...

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

Пример дерева зависимостей VSIDLC

Рисунок 2. Пример дерева зависимостей VSIDLC.

Для генерации промежуточного ПО для каждого каталога в дереве необходимо выполнить следующие команды:

Целевой каталог Зависимости Командование
Каталог SDV Core Н/Д vsidlc -o ./generated -c ./path/to/sdv_core_catalog
Каталог диагностических средств Каталог SDV Core vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog
Каталог SOMEIP Каталог диагностических средств, основной каталог SDV vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog
Каталог OEM Каталог диагностических данных, каталог SOMEIP, (транзитивно) основной каталог SDV. vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog

Форматировать вывод Rust

По умолчанию VSIDL использует rustfmt для форматирования вывода Rust. Для корректной работы по умолчанию установите переменную окружения $ANDROID_BUILD_TOP или переменные окружения RUSTFMT_PATH и RUSTFMT_TOML_PATH . Чтобы изменить формат вывода Rust по умолчанию, используйте параметр --rust-formatter с параметром pretty-please или none :

  • Чтобы изменить формат вывода на prettyplease , используйте значение pretty-please :

    vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-please
    
  • Чтобы изменить формат вывода на «нет», используйте значение none :

    vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
    

Что дальше?

После создания промежуточного программного обеспечения перейдите к разделу «Реализация бизнес-логики» .