تعریف پیام‌ها و سرویس‌های 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.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 در کاتالوگ. از globهایی مانند **/*.proto پشتیبانی می‌شود.
  • rustlibs : باید شامل libvsidl_v1_proto_rs باشد تا حاشیه‌نویسی‌ها و انواع استاندارد SDV را ارائه دهد.
  • proto_flags : برای مشخص کردن مسیرهای شامل شده استفاده می‌شود. -I external/protobuf/src اغلب برای حل انواع استاندارد protobuf مورد نیاز است.
  • min_sdk_version : برای اعلام سازگاری با APIهای پلتفرم SDV مربوطه و الزامات زنجیره ابزار Rust، روی "35" (اندروید 15) تنظیم کنید.
  • filegroup : برای کشف در زمان ساخت مورد نیاز است. هر فایل VSIDL، protobuf و Android.bp را در srcs قرار دهید تا سیستم ساخت بتواند آنها را در sandbox کامپایل کپی کند.

قدم بعدی چیست؟

برای ادامه پیاده‌سازی معماری سرویس خود، به بخش تعریف معماری سرویس مراجعه کنید.