বার্তা এবং RPC পরিষেবা সংজ্ঞায়িত করুন

VSIDLC-এর টাইপ সিস্টেম দুটি স্তরে কাজ করে: প্রোটোবাফ এবং VSIDL। প্রোটোবাফ ব্যবহার করা হয় সেইসব মেসেজ সংজ্ঞায়িত করার জন্য, যা VSIDL দ্বারা সংজ্ঞায়িত পাবলিশার এবং সাবস্ক্রাইবারদের মধ্যে আদান-প্রদান করা হয়। VSIDL, প্রোটোবাফ দ্বারা ঘোষিত টাইপগুলোকে রেফারেন্স করে।

এই পৃষ্ঠায় অনুরোধে সাড়া দেওয়া ও কল করার জন্য মেসেজ এবং রিমোট প্রসিডিউর কল (RPC) মেথড কীভাবে সংজ্ঞায়িত করতে হয়, তা ব্যাখ্যা করা হয়েছে।

বার্তা সংজ্ঞায়িত করুন

এই অংশে VSIDL এবং protobuf-এ কীভাবে মেসেজ সংজ্ঞায়িত করা হয় তা ব্যাখ্যা করা হয়েছে।

নিম্নলিখিত কোড নমুনাটি একটি TirePressure বার্তা সংজ্ঞায়িত করে:

syntax = "proto3";

package com.android.sdv.sample.vsidl;

message TirePressure {
  uint32 pressure = 1;
}

RPC পরিষেবাগুলি সংজ্ঞায়িত করুন

প্রোটোবাফে, একটি 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 আপনার প্রোটোবাফ ডেফিনিশনগুলো খুঁজে পেতে এবং অ্যান্ড্রয়েড বিল্ড সিস্টেমকে সেগুলো কম্পাইল করার সুযোগ দিতে, আপনাকে আপনার ক্যাটালগ ডিরেক্টরির সর্ব্বোচ্চ ফোল্ডারে একটি Android.bp ফাইল অন্তর্ভুক্ত করতে হবে।

এই ফাইলে অবশ্যই একটি rust_protobuf টার্গেট সংজ্ঞায়িত করতে হবে, যা আপনার প্রোটোবাফ ফাইলগুলোকে (যাদের .proto এক্সটেনশন আছে) গ্রুপ করবে। আপনার ক্যাটালগের প্রতিটি ফাইলকে অবশ্যই একটি ফাইলগ্রুপের অন্তর্ভুক্ত করতে হবে। যদি 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 : তৈরি হওয়া রাস্ট ক্রেটের নাম।
  • protos : ক্যাটালগে থাকা সমস্ত প্রোটোবাফ ফাইলের তালিকা। **/*.proto এর মতো গ্লোব সমর্থিত।
  • rustlibs : স্ট্যান্ডার্ড SDV অ্যানোটেশন এবং টাইপগুলো সরবরাহ করার জন্য অবশ্যই libvsidl_v1_proto_rs অন্তর্ভুক্ত করতে হবে।
  • proto_flags : ইনক্লুড পাথ নির্দিষ্ট করতে ব্যবহৃত হয়। স্ট্যান্ডার্ড প্রোটোবাফ টাইপগুলো রিজলভ করার জন্য প্রায়শই -I external/protobuf/src প্রয়োজন হয়।
  • min_sdk_version : সংশ্লিষ্ট SDV প্ল্যাটফর্ম API এবং Rust টুলচেইনের প্রয়োজনীয়তার সাথে সামঞ্জস্যতা ঘোষণা করতে এটিকে "35" (Android 15) এ সেট করুন।
  • filegroup : বিল্ড-টাইম ডিসকভারির জন্য আবশ্যক। প্রতিটি VSIDL, protobuf, এবং Android.bp ফাইল srcs এ অন্তর্ভুক্ত করুন, যাতে বিল্ড সিস্টেম সেগুলোকে কম্পাইলেশন স্যান্ডবক্সে কপি করতে পারে।

এরপর কী?

আপনার পরিষেবা স্থাপত্যের বাস্তবায়ন চালিয়ে যেতে, পরিষেবা স্থাপত্য সংজ্ঞায়িত করুন দেখুন।