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

Bu sayfada, SDV hizmet paketi oluşturma, paketi APEX dosya biçiminde paketleme ve sanal bir Cuttlefish cihazında yürütme adımları gösterilmektedir. SDV sisteminde kod yürütmenin birincil 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 dizininizden, derleme ortamınızı ayarlamak için envsetup.sh komut dosyasını kaynak olarak kullanın, derleme hedefi olarak Cuttlefish'i ayarlayın ve vsidlc kod oluşturucuyu derleyin:

    source build/envsetup.sh
    lunch sdv_core_cf-aosp_current-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 (Android Studio for Platform'da söz dizimi vurgulama, doğrulama ve otomatik tamamlama için VSIDL dosyalarını düzenleme bölümüne bakın):

      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 sürecini 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 dizininde 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 main.rs dosyasındaki TODO yorumlarını bulun ve tercihlerinize göre ayarlayın. Örneğin:

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

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

    2. Aşağıdakileri ekleyerek modülü PRODUCT_PACKAGES dosyasına 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
    

    Sistem görüntüsü APEX'i (veya imzalamak için kullanılan anahtarı) içerdikten sonra, Android Studio for Platform'daki apex/Android.bp kenar boşluğu simgesinden doğrudan yinelemeli değişiklikler oluşturup dağıtabilirsiniz. Daha fazla bilgi için SDV hizmet paketlerini dağıtma başlıklı makaleyi inceleyin.

  8. Hizmet paketi yürütme işlemini çalıştırın ve doğrulayın:

    1. Sanal bir Cuttlefish cihazı başlatın:

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

      • 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
        
      • Düzenleyiciyi kullanma:

        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, hizmet paketlerinin mesaj alışverişini 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ımlama Dili (VSIDL) ve kendi hizmet paketlerinizi sıfırdan nasıl tanımlayacağınız hakkında daha fazla bilgi edinin.