메시지 및 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은 입력 및 출력 메시지 유형(각각 SetSeatHeatingRequest 및 SetSeatHeatingResponse)이 있는 단일 RPC 메서드를 식별합니다.

빌드 시스템 통합 구성

vsidlc가 프로토콜 버퍼 정의를 검색하고 Android 빌드 시스템이 이를 컴파일하도록 하려면 카탈로그 디렉터리의 최상위 폴더에 Android.bp 파일을 포함해야 합니다.

이 파일은 protobuf 파일(.proto 확장자 사용)을 그룹화하는 rust_protobuf 타겟을 정의해야 합니다. 카탈로그의 모든 파일은 파일 그룹에 포함되어야 합니다. Android.bp 파일에 파일 그룹이 여러 개 있는 경우 vsidlc은 첫 번째 파일 그룹을 사용합니다.

다음 예시는 VSIDL 카탈로그의 일반적인 rust_protobuf 타겟을 보여줍니다.

  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과 같은 glob이 지원됩니다.
  • rustlibs: 표준 SDV 주석과 유형을 제공하려면 libvsidl_v1_proto_rs을 포함해야 합니다.
  • proto_flags: 포함 경로를 지정하는 데 사용됩니다. -I external/protobuf/src은 표준 protobuf 유형을 해결하는 데 필요한 경우가 많습니다.
  • min_sdk_version: 해당 SDV 플랫폼 API 및 Rust 도구 모음 요구사항과의 호환성을 선언하기 위해 "35" (Android 15)로 설정합니다.
  • filegroup: 빌드 시간 검색에 필요합니다. 빌드 시스템이 컴파일 샌드박스로 복사할 수 있도록 모든 VSIDL, protobuf, Android.bp 파일을 srcs에 포함합니다.

다음 단계

서비스 아키텍처 구현을 계속하려면 서비스 아키텍처 정의를 참고하세요.