このページでは、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各サービス バンドルの Rust 実装は
/path/to/output/services/ServiceBundleName/src/main.rsにあります。デフォルトでは、生成された実装はデフォルト値でメッセージを作成し、パブリッシャーとサブスクライバー、または 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)と、独自のサービス バンドルをゼロから定義する方法について学習します。