Definisci messaggi e servizi RPC

Il sistema di tipi di VSIDLC opera a due livelli: Protobuf e VSIDL. Protobuf viene utilizzato per definire i messaggi scambiati tra l'editore e gli abbonati definiti da VSIDL. VSIDL fa riferimento ai tipi dichiarati da protobuf.

Questa pagina spiega come definire i messaggi e i metodi di chiamata di procedure remote (RPC) per chiamare e rispondere alle richieste.

Definisci i messaggi

Questa sezione spiega come vengono definiti i messaggi in VSIDL e protobuf.

Il seguente esempio di codice definisce un messaggio TirePressure:

syntax = "proto3";

package com.android.sdv.sample.vsidl;

message TirePressure {
  uint32 pressure = 1;
}

Definisci i servizi RPC

In protobuf, un servizio RPC definisce un insieme di metodi che possono essere chiamati in remoto come se fossero chiamate di funzioni locali. L'esempio seguente definisce i tipi di messaggi di richiesta e risposta e il metodo del servizio RPC utilizzato per effettuare una richiesta e ricevere una risposta:

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);
}

Dove:

  • service identifica una raccolta di metodi RPC correlati.
  • rpc identifica un singolo metodo RPC con tipi di messaggi di input e output (rispettivamente SetSeatHeatingRequest e SetSeatHeatingResponse).

Configura l'integrazione del sistema di compilazione

Per consentire a vsidlc di rilevare le definizioni protobuf e consentire al sistema di compilazione Android di compilarle, devi includere un file Android.bp nella cartella di primo livello della directory del catalogo.

Questo file deve definire una destinazione rust_protobuf che raggruppa i file protobuf (con estensione .proto). Ogni file del catalogo deve essere incluso in un gruppo di file. Se nel file Android.bp sono presenti più gruppi di file, vsidlc prende il primo.

Il seguente esempio mostra un target rust_protobuf tipico per un catalogo 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: ["**/*"],
  }

Dove:

  • name: un identificatore univoco per la destinazione di build. Per convenzione, inizia con lib.
  • crate_name: il nome della crate Rust generata.
  • protos: un elenco di tutti i file protobuf nel catalogo. Sono supportati i glob come **/*.proto.
  • rustlibs: Deve includere libvsidl_v1_proto_rs per fornire le annotazioni e i tipi SDV standard.
  • proto_flags: utilizzato per specificare i percorsi di inclusione. -I external/protobuf/src è spesso necessario per risolvere i tipi protobuf standard.
  • min_sdk_version: impostato su "35" (Android 15) per dichiarare la compatibilità con i requisiti corrispondenti delle API della piattaforma SDV e della toolchain Rust.
  • filegroup: obbligatorio per l'individuazione in fase di compilazione. Includi ogni file VSIDL, protobuf e Android.bp in srcs in modo che il sistema di compilazione possa copiarli nella sandbox di compilazione.

Passaggi successivi

Per continuare a implementare l'architettura del servizio, vedi Definisci l'architettura del servizio.