本頁說明如何建立 SDV 服務套件、封裝成 APEX 檔案格式,並在虛擬 Cuttlefish 裝置上執行。SDV 系統上執行程式碼的主要單位是服務套件。服務套件提供生命週期方法,系統會在系統狀態變更時執行這些方法。
設定建構環境
在目前使用的目錄中,執行
envsetup.sh指令碼來設定建構環境、將 Cuttlefish 設為建構目標,並建構vsidlc程式碼產生器:source build/envsetup.sh lunch sdv_core_cf-aosp_current-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:定義服務套件及其通訊 (如要在 Android Studio 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: ["**/*"], }
執行下列指令,產生骨架實作和設定檔:
vsidlc -c /path/to/catalog -o /path/to/output --services --apex在
/path/to/output/services/ServiceBundleName/src/main.rs中,找出每個服務套件的 Rust 實作。根據預設,產生的實作會建立具有預設值的訊息,並在發布端和訂閱端之間,或 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(); } }如要在系統映像檔中加入套件,請將產生的 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系統映像檔包含 APEX (或用於簽署 APEX 的金鑰) 後,您也可以直接在 Android Studio for Platform 中,透過
apex/Android.bp邊線圖示建構及部署疊代變更。詳情請參閱「部署 SDV 服務套件」。執行並驗證服務套件:
啟動虛擬 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 } } }
後續步驟
進一步瞭解車輛服務介面定義語言 (VSIDL),以及如何從頭開始定義自己的服務套件。