Система типов VSIDLC работает на двух уровнях: Protobuf и VSIDL. Protobuf используется для определения сообщений, которыми обмениваются издатель и подписчики, определенные VSIDL. VSIDL ссылается на типы, объявленные в Protobuf.
На этой странице объясняется, как определять сообщения и методы удаленного вызова процедур (RPC) для вызова и обработки запросов.
Определить сообщения
В этом разделе объясняется, как определяются сообщения в VSIDL и protobuf.
В следующем примере кода определяется сообщение, TirePressure :
syntax = "proto3";
package com.android.sdv.sample.vsidl;
message TirePressure {
uint32 pressure = 1;
}
Определение служб RPC
В protobuf служба RPC определяет набор методов, которые можно вызывать удалённо, как если бы это были локальные вызовы функций. В следующем примере определены типы сообщений запроса и ответа, а также метод службы RPC, используемый для отправки запроса и получения ответа:
syntax = "proto3";
package com.google.sdv;
enum SeatHeatingLevel {
OFF = 0;
LOW = 1;
HIGH = 2;
}
// Request to set seat heating
message SetSeatHeatingRequest {
enum Seat {
DRIVER = 0;
PASSENGER = 1;
}
Seat seat = 1;
SeatHeatingLevel level = 2;
}
// Response to setting seat heating
message SetSeatHeatingResponse {
bool success = 1;
}
// Seat heating service
service SeatHeatingService {
rpc SetSeatHeating (SetSeatHeatingRequest) returns (SetSeatHeatingResponse);
}
Где:
-
serviceидентифицирует набор связанных методов RPC. -
rpcидентифицирует один метод RPC с типами входных и выходных сообщений (SetSeatHeatingRequestиSetSeatHeatingResponseсоответственно).
Настройка интеграции с системой сборки
Чтобы vsidlc мог обнаружить ваши определения protobuf и позволить системе сборки Android скомпилировать их, необходимо добавить файл Android.bp в корневую папку каталога.
В этом файле необходимо определить цель rust_protobuf , которая группирует ваши protobuf-файлы (с расширением .proto ). Каждый файл в вашем каталоге должен быть учтен в группе файлов. Если в файле Android.bp есть несколько групп файлов, vsidlc берет первую из них.
В следующем примере показана типичная цель rust_protobuf для каталога VSIDL:
rust_protobuf {
name: "liboem_vehicle_messages",
crate_name: "oem_vehicle_messages",
source_stem: "oem_vehicle_messages_source",
protos: [
"**/*.proto",
],
rustlibs: [
"libvsidl_v1_proto_rs",
],
proto_flags: [
"-I external/protobuf/src",
],
apex_available: [
"//apex_available:platform",
"//apex_available:anyapex",
],
vendor_available: true,
product_available: true,
min_sdk_version: "35",
}
filegroup {
name: "catalog_oem_vehicle_messages",
srcs: ["**/*"],
}
Где:
-
name: Уникальный идентификатор целевого объекта сборки. По соглашению, он начинается сlib. -
crate_name: Название сгенерированного Rust-крейта. -
protos: Список всех файлов protobuf в каталоге. Поддерживаются шаблоны типа**/*.proto. -
rustlibs: Необходимо включитьlibvsidl_v1_proto_rsдля предоставления стандартных аннотаций и типов SDV. -
proto_flags: Используется для указания путей включения.-I external/protobuf/srcчасто требуется для разрешения стандартных типов protobuf. -
min_sdk_version: Установите значение"35"(Android 15), чтобы объявить о совместимости с соответствующими API платформы SDV и требованиями к инструментарию Rust. -
filegroup: Необходимо для обнаружения во время сборки. Включает все файлы VSIDL, protobuf иAndroid.bpвsrcs, чтобы система сборки могла скопировать их в песочницу компиляции.
Что дальше?
Для продолжения реализации архитектуры сервисов см. раздел «Определение архитектуры сервисов» .