Определение сообщений и служб RPC

Система типов 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 , чтобы система сборки могла скопировать их в песочницу компиляции.

Что дальше?

Для продолжения реализации архитектуры сервисов см. раздел «Определение архитектуры сервисов» .