দ্রুত শুরু: SDV পরিষেবা বান্ডেল তৈরি এবং কার্যকর করুন

এই পৃষ্ঠাটি আপনাকে দেখাবে কীভাবে একটি SDV সার্ভিস বান্ডেল তৈরি করতে হয়, সেটিকে APEX ফাইল ফরম্যাটে প্যাক করতে হয় এবং একটি ভার্চুয়াল কাটলফিশ ডিভাইসে এক্সিকিউট করতে হয়। SDV সিস্টেমে কোড এক্সিকিউশনের প্রধান একক হলো সার্ভিস বান্ডেলগুলো। সার্ভিস বান্ডেলগুলো এমন লাইফসাইকেল মেথড সরবরাহ করে, যা সিস্টেমের অবস্থা পরিবর্তিত হলে সিস্টেমটি এক্সিকিউট করে।

  1. আপনার বিল্ড পরিবেশ সেট আপ করুন

    আপনার ওয়ার্কিং ডিরেক্টরির ভেতর থেকে, আপনার বিল্ড এনভায়রনমেন্ট সেট আপ করতে envsetup.sh স্ক্রিপ্টটি সোর্স করুন, বিল্ড টার্গেট হিসেবে Cuttlefish সেট করুন, এবং vsidlc কোড জেনারেটরটি বিল্ড করুন:

    source build/envsetup.sh
    lunch sdv_core_cf-trunk_staging-userdebug
    m vsidlc
    
  2. এই ফাইলগুলো দিয়ে my_catalog নামের একটি ফোল্ডার তৈরি করে আপনার আর্কিটেকচার নির্ধারণ করুন:

    • tire.proto: আপনি যে ডেটা স্ট্রাকচারটি পাঠাচ্ছেন তা সংজ্ঞায়িত করে:

      syntax = "proto3";
      
      package com.android.sdv.sample.quickstart;
      
      import "google/protobuf/empty.proto";
      import "sdv/vsidl/v1/annotations.proto";
      
      message TirePressure {
        uint32 pressure = 1;
      }
      
      message TireInfoResponse {
        string serial_number = 1;
        uint32 max_pressure = 2;
      }
      
      service TireService {
        rpc GetTireInfo(google.protobuf.Empty) returns (TireInfoResponse);
      }
      
    • architecture.vsidl: সার্ভিস বান্ডেল এবং তাদের যোগাযোগ ব্যবস্থা সংজ্ঞায়িত করে:

      package: "com.android.sdv.sample.quickstart"
      
      service_bundle {
        name: "Manager"
      
        publisher {
          message: "TirePressure"
          topic: "pressure"
          capacity: 8
        }
      
        server {
          service: "TireService"
          channel: "tire-service"
        }
      }
      
      service_bundle {
        name: "Monitor"
      
        subscriber {
          message: "TirePressure"
          topic: "pressure"
        }
      
        client {
          service: "TireService"
          channel: "tire-service"
        }
      }
      
    • Android.bp: বিল্ড প্রক্রিয়া নির্ধারণ করে:

      rust_protobuf {
          name: "libquickstart_sample_tire_proto",
          crate_name: "quickstart_sample_tire_proto",
          protos: [
              "tire.proto",
          ],
          source_stem: "quickstart_sample_tire_proto_source",
          rustlibs: [
              "libvsidl_v1_stdlib_proto_rs",
          ],
          proto_flags: [
              "-I external/protobuf/src",
          ],
          vendor_available: true,
          product_available: true,
          apex_available: [
              "//apex_available:platform",
              "//apex_available:anyapex",
          ],
          min_sdk_version: "35",
      }
      
      filegroup {
          name: "vsidl_quickstart_catalog",
          srcs: ["**/*"],
      }
      
  3. নিম্নলিখিত কমান্ডটি চালিয়ে একটি স্কেলেটন ইমপ্লিমেন্টেশন এবং কনফিগারেশন ফাইল তৈরি করুন:

    vsidlc -c /path/to/catalog -o /path/to/output --services --apex
    
  4. প্রতিটি সার্ভিস বান্ডেলের জন্য, /path/to/output /services/ ServiceBundleName /src/main.rs -এ রাস্ট ইমপ্লিমেন্টেশনটি খুঁজুন।

  5. ডিফল্টরূপে, তৈরি হওয়া ইমপ্লিমেন্টেশনটি ডিফল্ট মান সহ মেসেজ তৈরি করে এবং পাবলিশার ও সাবস্ক্রাইবারদের মধ্যে অথবা RPC ক্লায়েন্ট ও সার্ভারের মধ্যে সেগুলো পাঠায়। এই আচরণটি পরিবর্তন করতে, main.rs এ থাকা TODO কমেন্টগুলো খুঁজুন এবং আপনার পছন্দ অনুযায়ী সেগুলো পরিবর্তন করুন। উদাহরণস্বরূপ:

      async fn handle_tire_pressure_front_left_publisher(publisher: sdv::mw::Publisher<TirePressure>) {
          loop {
              // TODO: Modify the frequency of publishing messages here.
              sleep(Duration::from_secs(1)).await;
              // TODO: Modify the message content here.
              let message = TirePressure::default();
              info!("Publishing on TirePressure#FRONT_LEFT");
              publisher.publish(&message).unwrap();
          }
      }
    
  6. সিস্টেম ইমেজে আপনার বান্ডেলটি অন্তর্ভুক্ত করতে, আপনার প্রোডাক্ট মেকফাইলে জেনারেট করা APEX মডিউলের নামটি যোগ করুন।

    1. আপনার প্রোডাক্টের মেকফাইলটি খুলুন (উদাহরণস্বরূপ, /device/google/sdv/sdv_core_base/sdv_samples_core_services.mk )।

    2. PRODUCT_PACKAGES এ মডিউলটি যোগ করতে নিম্নলিখিতটি যোগ করুন:

      PRODUCT_PACKAGES += com.android.sdv.sample.quickstart
      PRODUCT_PACKAGES += com_android_sdv_sample_quickstart_orchestration_configurations
      
  7. ছবিটি তৈরি করুন:

    m
    
  8. সার্ভিস বান্ডেলটির নির্বাহ চালানো এবং যাচাই করা:

    1. একটি ভার্চুয়াল কাটলফিশ ডিভাইস চালু করুন:

      sdv-cf create --instance_name=instance1
      
    2. সিস্টেম বুট করার সময় সার্ভিস বান্ডেলটি চালান:

      ম্যানুয়ালি

      adb wait-for-device
      adb root
      adb shell sdv_service_bundle start local-vm:com.android.sdv.sample.quickstart.Manager/instance
      adb shell sdv_service_bundle start local-vm:com.android.sdv.sample.quickstart.Monitor/instance
      

      অর্কেস্ট্রেটর

      adb wait-for-device
      adb root
      # Apply global orchestration configuration by setting system property
      adb shell setprop persist.sdv.orchestrator_config_path "etc/orch/vm_quickstart_orch_config.textproto"
      adb reboot
      
    3. সার্ভিস বান্ডেলটির নির্বাহ যাচাই করুন:

      adb logcat *:F com_android_sdv_sample_quickstart_Manager_instance:* com_android_sdv_sample_quickstart_Monitor_instance:*
      

      এই কমান্ডটি সার্ভিস বান্ডেলগুলোর বার্তা আদান-প্রদানের লগ প্রদর্শন করে:

      03-30 13:41:31.505   967   976 I com_android_sdv_sample_quickstart_Manager_instance: sdv_lm_manager: Publishing on TirePressure#PRESSURE
      03-30 13:41:31.505   983   991 I com_android_sdv_sample_quickstart_Monitor_instance: sdv_lm_monitor: Received message on TirePressure#PRESSURE: [TirePressure { pressure: 0, special_fields: SpecialFields { unknown_fields: UnknownFields { fields: None }, cached_size: CachedSize { size: 0 } } }]
      03-30 13:41:31.626   983   991 I com_android_sdv_sample_quickstart_Monitor_instance: sdv_lm_monitor: Sending request on Monitor/TireService
      03-30 13:41:31.627   967   976 I com_android_sdv_sample_quickstart_Manager_instance: sdv_lm_manager: Received request on Manager/TireService: Empty { special_fields: SpecialFields { unknown_fields: UnknownFields { fields: None }, cached_size: CachedSize { size: 0 } } }
      03-30 13:41:31.627   983   991 I com_android_sdv_sample_quickstart_Monitor_instance: sdv_lm_monitor: Received response on Monitor/TireService: TireInfoResponse { serial_number: "", max_pressure: 0, special_fields: SpecialFields { unknown_fields: UnknownFields { fields: None }, cached_size: CachedSize { size: 0 } } }
      

এরপর কী?

ভেহিকেল সার্ভিসেস ইন্টারফেস ডেফিনিশন ল্যাঙ্গুয়েজ (VSIDL) সম্পর্কে আরও জানুন এবং কীভাবে একেবারে গোড়া থেকে আপনার নিজস্ব সার্ভিস বান্ডেল তৈরি করবেন তা শিখুন।