Xác định thông báo và dịch vụ RPC

Hệ thống loại của VSIDLC hoạt động ở 2 cấp độ: Protobuf và VSIDL. Protobuf được dùng để xác định các thông báo được trao đổi giữa nhà xuất bản và người đăng ký do VSIDL xác định. VSIDL tham chiếu các loại do protobuf khai báo.

Trang này giải thích cách xác định các thông báo và phương thức lệnh gọi quy trình từ xa (RPC) để gọi và phản hồi các yêu cầu.

Xác định thông báo

Phần này giải thích cách xác định thông báo trong VSIDL và protobuf.

Mã mẫu sau đây xác định một thông báo TirePressure:

syntax = "proto3";

package com.android.sdv.sample.vsidl;

message TirePressure {
  uint32 pressure = 1;
}

Xác định các dịch vụ RPC

Trong protobuf, một dịch vụ RPC xác định một tập hợp các phương thức có thể được gọi từ xa như thể chúng là các lệnh gọi hàm cục bộ. Ví dụ sau đây xác định các loại thông báo yêu cầu và phản hồi cũng như phương thức dịch vụ RPC dùng để đưa ra yêu cầu và nhận phản hồi:

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

Trong trường hợp:

  • service xác định một tập hợp các phương thức RPC có liên quan.
  • rpc xác định một phương thức RPC duy nhất có các loại thông báo đầu vào và đầu ra (lần lượt là SetSeatHeatingRequestSetSeatHeatingResponse).

Định cấu hình quy trình tích hợp hệ thống xây dựng

Để cho phép vsidlc phát hiện các định nghĩa protobuf của bạn và cho phép hệ thống xây dựng Android biên dịch các định nghĩa đó, bạn phải thêm một tệp Android.bp vào thư mục trên cùng của thư mục danh mục.

Tệp này phải xác định một mục tiêu rust_protobuf nhóm các tệp protobuf của bạn (có đuôi .proto). Mỗi tệp trong danh mục của bạn phải được tính vào một nhóm tệp. Nếu có nhiều nhóm tệp trong tệp Android.bp, vsidlc sẽ lấy nhóm tệp đầu tiên.

Ví dụ sau đây minh hoạ một mục tiêu rust_protobuf điển hình cho danh mục 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: ["**/*"],
  }

Trong trường hợp:

  • name: Giá trị nhận dạng duy nhất cho mục tiêu bản dựng. Theo quy ước, mã này bắt đầu bằng lib.
  • crate_name: Tên của crate Rust được tạo.
  • protos: Danh sách tất cả các tệp protobuf trong danh mục. Hệ thống hỗ trợ các glob như **/*.proto.
  • rustlibs: Phải bao gồm libvsidl_v1_proto_rs để cung cấp các chú thích và loại SDV tiêu chuẩn.
  • proto_flags: Dùng để chỉ định đường dẫn bao gồm. -I external/protobuf/src thường là cần thiết để phân giải các loại protobuf tiêu chuẩn.
  • min_sdk_version: Đặt thành "35" (Android 15) để khai báo khả năng tương thích với các API nền tảng SDV và yêu cầu về bộ công cụ Rust tương ứng.
  • filegroup: Bắt buộc để phát hiện thời gian xây dựng. Đưa mọi tệp VSIDL, protobuf và Android.bp vào srcs để hệ thống xây dựng có thể sao chép các tệp này vào hộp cát biên dịch.

Các bước tiếp theo

Để tiếp tục triển khai cấu trúc dịch vụ, hãy xem phần Xác định cấu trúc dịch vụ.