빠른 시작: 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 스튜디오 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. 각 서비스 번들의 경우 /path/to/output/services/ServiceBundleName/src/main.rs에서 Rust 구현을 찾습니다.

  5. 기본적으로 생성된 구현은 기본값으로 메시지를 만들고 게시자와 구독자 또는 RPC 클라이언트와 서버 간에 전송합니다. 이 동작을 수정하려면 main.rs에서 TODO 주석을 찾아 환경설정에 맞게 조정합니다. 예를 들면 다음과 같습니다.

    rust 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. 시스템 이미지에 번들을 포함하려면 생성된 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 (또는 서명에 사용된 키)가 포함되면 Android 스튜디오 for Platform의 apex/Android.bp 여백 아이콘에서 직접 반복적인 변경사항을 빌드하고 배포할 수도 있습니다. 자세한 내용은 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)와 자체 서비스 번들을 처음부터 정의하는 방법을 자세히 알아보세요.