이 페이지에서는 SDV 서비스 번들을 만들고, APEX 파일 형식으로 패키징하고, 가상 Cuttlefish 기기에서 실행하는 방법을 보여줍니다. SDV 시스템에서 코드 실행의 기본 단위는 서비스 번들입니다. 서비스 번들은 시스템 상태가 변경될 때 시스템이 실행하는 수명 주기 메서드를 제공합니다.
빌드 환경 설정
작업 디렉터리 내에서
envsetup.sh스크립트를 제공하여 빌드 환경을 설정하고, Cuttlefish를 빌드 타겟으로 설정하고,vsidlc코드 생성기를 빌드합니다.source build/envsetup.sh lunch sdv_core_cf-trunk_staging-userdebug m vsidlc다음 파일이 포함된
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: 서비스 번들과 통신을 정의합니다.
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: ["**/*"], }
다음을 실행하여 스켈레톤 구현 및 구성 파일을 생성합니다.
vsidlc -c /path/to/catalog -o /path/to/output --services --apex각 서비스 번들의 경우 Rust 구현을
/path/to/output/services/ServiceBundleName/src/main.rs에서 찾습니다.기본적으로 생성된 구현은 기본값이 있는 메시지를 만들고 게시자와 구독자 또는 RPC 클라이언트와 서버 간에 전송합니다. 이 동작을 수정하려면
main.rs에서TODO주석을 찾고 환경설정에 맞게 조정합니다. 예를 들면 다음과 같습니다.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(); } }번들을 시스템 이미지에 포함하려면 생성된 APEX 모듈 이름을 제품 Makefile에 추가합니다.
제품 Makefile (예:
/device/google/sdv/sdv_core_base/sdv_samples_core_services.mk)을 엽니다.다음을 추가하여 모듈을
PRODUCT_PACKAGES에 추가합니다.PRODUCT_PACKAGES += com.android.sdv.sample.quickstart PRODUCT_PACKAGES += com_android_sdv_sample_quickstart_orchestration_configurations
이미지를 빌드합니다.
m서비스 번들 실행을 실행하고 확인합니다.
가상 Cuttlefish 기기를 시작합니다.
sdv-cf create --instance_name=instance1시스템이 부팅될 때 서비스 번들을 실행합니다.
수동
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서비스 번들의 실행을 확인합니다.
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 } } }
다음 단계
Vehicle Services Interface Definition Language (VSIDL) 및 서비스 번들을 처음부터 정의하는 방법을 자세히 알아보세요.