התחלה מהירה: יצירה והפעלה של חבילות שירות SDV

בדף הזה מוסבר איך ליצור חבילת שירות של SDV, לארוז אותה בפורמט קובץ APEX ולהפעיל אותה במכשיר Cuttlefish וירטואלי. יחידות הקוד העיקריות שמופעלות במערכת ה-SDV הן חבילות השירות. חבילות שירות מספקות שיטות של מחזור חיים שהמערכת מבצעת כשמצב המערכת משתנה.

  1. הגדרת סביבת ה-build

    בספריית העבודה, מפעילים את הסקריפט envsetup.sh כדי להגדיר את סביבת ה-build, מגדירים את Cuttlefish כיעד ה-build ויוצרים את מחולל הקוד 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 for Platform, ראו עריכת קובצי 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: מגדיר את תהליך ה-build:

      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 ושנו אותן לפי ההעדפות שלכם. לדוגמה:

    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. פותחים את קובץ ה-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 (או את המפתח שמשמש לחתימה עליו), אפשר גם ליצור ולפרוס שינויים איטרטיביים ישירות מסמל ה-gutter של 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) ואיך להגדיר חבילות שירות משלכם מאפס.