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

این صفحه به شما نشان می‌دهد که چگونه یک بسته سرویس SDV ایجاد کنید، آن را در قالب فایل APEX بسته‌بندی کنید، و آن را در یک دستگاه مجازی Cuttlefish اجرا کنید. واحدهای اصلی اجرای کد در سیستم «خودروی نرم‌افزارمحور» دسته‌های سرویس هستند. دسته‌های سرویس روش‌های چرخه حیاتی را ارائه می‌دهند که سیستم هنگام تغییر وضعیت سیستم اجرا می‌کند.

  1. راه‌اندازی محیط ساخت

    از درون فهرست راهنمای کاری‌تان، اسکریپت envsetup.sh را منبع قرار دهید تا محیط ساختتان را راه‌اندازی کنید، Cuttlefish را به‌عنوان هدف ساخت تنظیم کنید، و تولیدکننده کد vsidlc را بسازید:

    source build/envsetup.sh
    lunch sdv_core_cf-aosp_current-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: دسته‌های سرویس و ارتباط آن‌ها را تعریف می‌کند (برای برجسته‌سازی نحو، اعتبارسنجی، و تکمیل خودکار در Android Studio برای پلاتفرم، به ویرایش فایل‌های 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: ["**/*"],
      }
      
      برای پرهیز از ابهام، تأیید کنید که هر فایل .proto فقط به یک هدف کتابخانه در کاتالوگ تعلق دارد.
  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 جستجو کنید و آن‌ها را مطابق با اولویت‌هایتان تنظیم کنید. برای مثال:

    rust async fn handle_tire_pressure_pressure_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#PRESSURE"); publisher.publish(&message).unwrap(); } }

  6. برای گنجاندن بسته‌تان در تصویر سیستم، نام واحد APEX تولیدشده را به فایل makefile محصولتان اضافه کنید.

    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
    

    پس‌از اینکه تصویر سیستم شامل APEX (یا کلید استفاده‌شده برای امضای آن) شد، می‌توانید تغییرات تکراری را مستقیماً از نماد حاشیه apex/Android.bp در Android Studio for Platform بسازید و مستقر کنید. برای اطلاعات بیشتر، به استقرار بسته‌های سرویس SDV مراجعه کنید.

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