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

Рисунок 1. Входы и выходы VSIDLC.
Ниже приведено пояснение к диаграмме:
В качестве входных данных вы предоставляете следующие файлы, организованные в каталоги, известные как каталоги:
- Протофайлы (с расширением
.proto) содержат структуры данных, которыми обмениваются сервисные модули, определенные VSIDL. - Файлы VSIDL (с расширением
.vsidl) определяют пакеты услуг, единицы услуг и принадлежность типов единиц. - Файлы
Android.bpв каждом каталоге определяют цели сборкиrust_protobufдля всех proto-файлов в каталоге. VSIDLC используетcrate_nameуказанный в этих целях, для ссылки на сгенерированные типы сообщений protobuf в Rust.
- Протофайлы (с расширением
Для вывода следующих файлов необходимо запустить 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:
Если вы еще не настроили свою среду, запустите команду
source build/envsetup.sh.Для сборки VSIDLC выполните следующую команду:
m vsidlcУбедитесь, что в каталоге VSIDL находятся необходимые файлы сборки, protobuf и VSIDL.
Выполните команду
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 ...
Необходимо указать пути ко всему графу зависимостей, включая транзитивные зависимости (зависимости зависимостей). Например, предположим, у вас есть следующее дерево зависимостей каталога:

Рисунок 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
Что дальше?
После создания промежуточного программного обеспечения перейдите к разделу «Реализация бизнес-логики» .