快速入门:创建和执行 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 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: ["**/*"],
      }
      
  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 Studio 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),以及如何从头开始定义自己的服务包。