دليل البدء السريع: إنشاء حِزم خدمات SDV وتنفيذها

توضّح لك هذه الصفحة كيفية إنشاء حزمة خدمة SDV وتجميعها في تنسيق ملف APEX وتنفيذها على جهاز Cuttlefish افتراضي. إنّ الوحدات الأساسية لتنفيذ الرموز البرمجية على نظام SDV هي حِزم الخدمات. توفّر حِزم الخدمات طرقًا لمراحل النشاط ينفّذها النظام عندما تتغيّر حالته.

  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" للنظام الأساسي، يُرجى الاطّلاع على تعديل ملفات 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. By default, the generated implementation creates messages with default values and sends them between publishers and subscribers or RPC clients and servers. لتعديل هذا السلوك، ابحث عن تعليقات TODO في main.rs واضبطها وفقًا لتفضيلاتك. على سبيل المثال:

    rust 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 التي تم إنشاؤها إلى ملف makefile الخاص بالمنتج.

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