دليل البدء السريع: إنشاء حِزم خدمات 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 التي تم إنشاؤها إلى ملف make الخاص بالمنتج.

    1. افتح ملف make الخاص بالمنتج (على سبيل المثال، /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) وكيفية تحديد حزم الخدمات الخاصة بك من البداية