Mulai cepat: Membuat dan menjalankan paket layanan SDV

Halaman ini menunjukkan cara membuat paket layanan SDV, mengemasnya ke dalam format file APEX, dan menjalankannya di perangkat Cuttlefish virtual. Unit utama eksekusi kode pada sistem SDV adalah paket layanan. Paket layanan menyediakan metode siklus proses yang dijalankan sistem saat status sistem berubah.

  1. Menyiapkan lingkungan build

    Dari dalam direktori kerja Anda, sumberkan skrip envsetup.sh untuk menyiapkan lingkungan build, menetapkan Cuttlefish sebagai target build, dan membuat pembuat kode vsidlc:

    source build/envsetup.sh
    lunch sdv_core_cf-trunk_staging-userdebug
    m vsidlc
    
  2. Tentukan arsitektur Anda dengan membuat folder bernama my_catalog dengan file berikut:

    • tire.proto: Menentukan struktur data yang Anda kirim:

      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: Menentukan paket layanan dan komunikasinya:

      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: Menentukan proses 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. Buat file konfigurasi dan implementasi kerangka dengan menjalankan:

    vsidlc -c /path/to/catalog -o /path/to/output --services --apex
    
  4. Untuk setiap paket layanan, temukan implementasi Rust di /path/to/output/services/ServiceBundleName/src/main.rs.

  5. Secara default, implementasi yang dihasilkan akan membuat pesan dengan nilai default dan mengirimkannya antara penayang dan pelanggan atau klien dan server RPC. Untuk mengubah perilaku ini, cari komentar TODO di main.rs dan sesuaikan dengan preferensi Anda. Contoh:

      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. Untuk menyertakan paket Anda dalam image sistem, tambahkan nama modul APEX yang dihasilkan ke makefile produk Anda.

    1. Buka makefile produk Anda (misalnya, /device/google/sdv/sdv_core_base/sdv_samples_core_services.mk).

    2. Tambahkan modul ke PRODUCT_PACKAGES dengan menambahkan:

      PRODUCT_PACKAGES += com.android.sdv.sample.quickstart
      PRODUCT_PACKAGES += com_android_sdv_sample_quickstart_orchestration_configurations
      
  7. Buat gambar:

    m
    
  8. Jalankan dan verifikasi eksekusi paket layanan:

    1. Mulai perangkat Cuttlefish virtual:

      sdv-cf create --instance_name=instance1
      
    2. Jalankan paket layanan saat sistem di-boot:

      Secara manual

      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
      

      Orkestrator

      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. Verifikasi eksekusi paket layanan:

      adb logcat *:F com_android_sdv_sample_quickstart_Manager_instance:* com_android_sdv_sample_quickstart_Monitor_instance:*
      

      Perintah ini menampilkan log yang menunjukkan paket layanan bertukar pesan:

      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 } } }
      

Langkah berikutnya

Pelajari lebih lanjut Vehicle Services Interface Definition Language (VSIDL) dan cara menentukan paket layanan Anda sendiri dari awal.