شروع سریع: ایجاد و اجرای بسته‌های سرویس SDV

این صفحه به شما نشان می‌دهد که چگونه یک بسته سرویس SDV ایجاد کنید، آن را در قالب فایل APEX بسته‌بندی کنید و آن را روی یک دستگاه مجازی Cuttlefish اجرا کنید. واحدهای اصلی اجرای کد در سیستم 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. برای هر بسته سرویس، پیاده‌سازی Rust را در /path/to/output /services/ ServiceBundleName /src/main.rs پیدا کنید.

  5. به طور پیش‌فرض، پیاده‌سازی تولید شده پیام‌هایی با مقادیر پیش‌فرض ایجاد می‌کند و آنها را بین ناشران و مشترکین یا کلاینت‌ها و سرورهای RPC ارسال می‌کند. برای تغییر این رفتار، به دنبال نظرات TODO در main.rs بگردید و آنها را مطابق با تنظیمات خود تنظیم کنید. به عنوان مثال:

      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. یک دستگاه مجازی Cuttlefish را راه اندازی کنید:

      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) و نحوه تعریف بسته‌های خدمات خود از ابتدا بیشتر بدانید.