本页将介绍如何创建 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对于每个服务软件包,请在
/path/to/output/services/ServiceBundleName/src/main.rs中找到 Rust 实现。默认情况下,生成的实现会创建具有默认值的消息,并在发布者和订阅者或 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 } } }
后续步骤
详细了解车辆服务接口定义语言 (VSIDL) 以及如何从头开始定义自己的服务包。