Hızlı başlangıç: SDV hizmet paketleri oluşturma ve yürütme

Bu sayfada, SDV hizmet paketi oluşturma, APEX dosya biçiminde paketleme ve sanal bir Cuttlefish cihazında yürütme işlemleri gösterilmektedir. SDV sistemindeki birincil kod yürütme birimleri hizmet paketleridir. Hizmet paketleri, sistem durumu değiştiğinde sistemin yürüttüğü yaşam döngüsü yöntemleri sağlar.

  1. Derleme ortamınızı ayarlama

    Çalışma dizininizde, derleme ortamınızı ayarlamak, derleme hedefi olarak Cuttlefish'i belirlemek ve vsidlc kod üreten modeli derlemek için envsetup.sh komut dosyasını kaynaklandırın:

    source build/envsetup.sh
    lunch sdv_core_cf-trunk_staging-userdebug
    m vsidlc
    
  2. Aşağıdaki dosyaları içeren my_catalog adlı bir klasör oluşturarak mimarinizi tanımlayın:

    • tire.proto: Gönderdiğiniz veri yapısını tanımlar:

      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: Hizmet paketlerini ve bunların iletişimini tanımlar:

      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: Derleme işlemini tanımlar:

      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. Aşağıdaki komutu çalıştırarak iskelet uygulama ve yapılandırma dosyaları oluşturun:

    vsidlc -c /path/to/catalog -o /path/to/output --services --apex
    
  4. Her hizmet paketi için Rust uygulamasını /path/to/output/services/ServiceBundleName/src/main.rs konumunda bulabilirsiniz.

  5. Oluşturulan uygulama, varsayılan olarak varsayılan değerlere sahip mesajlar oluşturur ve bunları yayıncılar ile aboneler veya RPC istemcileri ile sunucuları arasında gönderir. Bu davranışı değiştirmek için TODO içindeki yorumları main.rs bulun ve tercihlerinize göre ayarlayın. Örneğin:

      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. Paketinizi sistem görüntüsüne dahil etmek için oluşturulan APEX modülü adını ürün makefile'ınıza ekleyin.

    1. Ürününüzün makefile'ını açın (ör. /device/google/sdv/sdv_core_base/sdv_samples_core_services.mk).

    2. Aşağıdakileri ekleyerek modülü PRODUCT_PACKAGES'ya ekleyin:

      PRODUCT_PACKAGES += com.android.sdv.sample.quickstart
      PRODUCT_PACKAGES += com_android_sdv_sample_quickstart_orchestration_configurations
      
  7. Görüntüyü oluşturun:

    m
    
  8. Hizmet paketi yürütmesini çalıştırın ve doğrulayın:

    1. Sanal Cuttlefish cihaz başlatma:

      sdv-cf create --instance_name=instance1
      
    2. Sistem başlatıldığında hizmet paketini çalıştırma:

      Manuel Olarak

      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
      

      Orkestraya uyarlayan

      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. Hizmet paketinin yürütülmesini doğrulayın:

      adb logcat *:F com_android_sdv_sample_quickstart_Manager_instance:* com_android_sdv_sample_quickstart_Monitor_instance:*
      

      Bu komut, mesaj alışverişi yapan hizmet paketlerini gösteren günlükleri görüntüler:

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

Sonraki adımlar

Araç Hizmetleri Arayüzü Tanım Dili (VSIDL) ve kendi hizmet paketlerinizi sıfırdan nasıl tanımlayacağınız hakkında daha fazla bilgi edinin.