메시지 및 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은 입력 및 출력 메시지 유형(각각 SetSeatHeatingRequestSetSeatHeatingResponse)이 있는 단일 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에 포함합니다.

다음 단계

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