เริ่มต้นอย่างรวดเร็ว: สร้างและเรียกใช้แพ็กเกจบริการ 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 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: กำหนดกระบวนการบิลด์ ดังนี้

      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 (หรือคีย์ที่ใช้ลงชื่อ) แล้ว คุณยังสามารถสร้างและติดตั้งใช้งานการเปลี่ยนแปลงซ้ำๆ ได้โดยตรงจากไอคอน 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
        
      • การใช้ Orchestrator

        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) และวิธีกำหนดแพ็กเกจบริการของคุณเองตั้งแต่ต้น