设置 IDE 以进行 SDV 开发

Android Studio for Platform (ASfP) 是建议用于 Android Automotive OS (AAOS) 软件定义车辆 (SDV) 平台开发的集成开发环境 (IDE)。ASfP 支持 AAOS SDV 平台使用的所有语言,包括用于 SDV 服务捆绑包的 Rust。

本页仅介绍 SDV 特有的设置。如需详细了解 ASfP 的一般功能和工作流,请参阅 Android Studio for Platform。

ASfP 仅在具有 x86-64 CPU 的 64 位 Linux 上运行。您可以在本地 Linux 工作站或云端使用它。如需详细了解云设置,请参阅云开发。

安装 ASfP

如需详细了解如何下载和安装 ASfP 以及如何检查系统要求,请参阅安装 Android Studio for Platform。

对平台代码库进行索引会占用大量内存,尤其是在同一台机器上运行多虚拟机 Cuttlefish 设备时。如果 ASfP 运行缓慢,请在 ASfP 内存设置中增加最大堆大小,以适应您的项目和机器,并将项目范围限定为您正在处理的目录。

创建 SDV 项目

在开始之前,请先初始化、同步并构建 AAOS SDV 结账。如需详细了解如何设置结账,请参阅代码位置和下载、构建和运行。

如需创建 SDV 项目,请按以下步骤操作:

  1. 在 ASfP 中创建一个新项目,然后选择 AAOS SDV 代码库签出的根目录作为代码库签出。如需详细了解向导步骤,请参阅创建或导入项目。
  2. 在 ASfP 创建项目后,选择 ASfP > Project > Open Config 以打开 .asfp-project 文件。
  3. 将该文件的内容替换为以下示例,然后将 repo 设置为您的签出路径:

    repo: /path/to/sdv_source
    lunch: sdv_core_cf-aosp_current-userdebug
    directories:
      include:
        -   system/software_defined_vehicle/samples
    other_languages:
      -   rust
    
  4. 更新您工作区域的 lunch 和 directories。为确保索引编制和同步快速进行,请仅包含您经常修改的目录。下表列出了常见的 SDV 目标和目录:

    SDV 开发重点 lunch 项目标 推荐 directories
    SDV 服务包 sdv_core_cf-aosp_current-userdebug 您的服务目录和套装目录,例如 system/software_defined_vehicle/samples
    SDV 核心平台集成 sdv_core_cf-aosp_current-userdebug system/software_defined_vehicle/middleware、system/software_defined_vehicle/automotive_services、device/google/sdv
    SDV Gateway on SDV IVI sdv_ivi_cf-aosp_current-userdebug system/software_defined_vehicle/sdv_gateway、system/software_defined_vehicle/samples/sdv_gateway、packages/services/Car
    SDV 媒体上的展示广告安全设置 sdv_media_har_cf-aosp_current-userdebug packages/services/display_safety、device/google/sdv_display_safety
    在 SDV IVI 上显示安全信息 sdv_ivi_cf_ds-aosp_current-userdebug packages/apps/Car/DriverUI、packages/services/display_safety/service

    如果您的结账流程使用 trunk_staging 清单,请将 -aosp_current-userdebug 替换为 -trunk_staging-userdebug。如需同时浏览原生平台代码,请将 cpp 添加到 other_languages。如需详细了解所有配置选项,请参阅配置参数。

  5. 如需应用更改,请依次选择 File > Sync Project。

部署 SDV 服务包

ASfP 包含一个 SDV 插件,可将包含服务软件包的 APEX 直接部署到正在运行的 SDV 设备。该插件默认处于停用状态。如需使用它,请在设置 > 插件中启用 SDV 插件。如需详细了解 APEX 封装,请参阅构建和部署服务软件包。

部署方式取决于 APEX 是否已在设备上:

  • 如果 APEX 已安装,您可以直接从 ASfP 部署更改。
  • 如果 APEX 是新的,您必须先重新构建并重新启动系统映像,或者使用包含用于对 APEX 进行签名的密钥的系统映像。之后,您便可以从 ASfP 进行部署。

如需部署服务软件包 APEX,请按以下步骤操作:

  1. 使用 Cuttlefish 插件启动 SDV 设备。如需了解详情,请参阅在 Cuttlefish 上运行 SDV 设备。
  2. 打开服务包的 apex/Android.bp 文件,然后点击 apex { 块旁边边线中的运行图标。
  3. 在打开的菜单中,选择 Run 'Deploy APEX_NAME'。您也可以在不部署 APEX 的情况下构建它,或者从同一菜单中更改运行配置。

在 Cuttlefish 上运行 SDV 设备

ASfP 包含一个 Cuttlefish 插件,用于创建和运行本地 Cuttlefish 设备。该插件需要 Cuttlefish 主机编排器。如果宿主编排器不可用,ASfP 会显示有关如何设置它的说明。

如需创建 SDV 设备,请按以下步骤操作:

  1. 依次选择 Tools > 设备管理器,点击 +,然后选择 Create Cuttlefish Device。
  2. 如需创建多虚拟机设置,请选择从规范配置,然后为您的设置创建或导入配置,例如 SDV Core with SDV IVI 或 SDV Media with SDV IVI for Display Safety。如需创建单个虚拟机,请改为选择从本地 Android 源代码树签出。

如需在单个屏幕上查看所有虚拟机显示画面并访问其他设备选项,请使用 Cuttlefish 工具窗口。如需打开它,请在侧边栏中选择 … 图标,然后选择 Cuttlefish;或者在帮助 > 查找操作中搜索 Cuttlefish。您还可以在 Running Devices 中查看各个显示屏。由于 SDV Core 在没有显示屏的情况下运行,因此请使用 Logcat 和终端来检查它。

调试和测试

如需详细了解如何在 ASfP 中进行调试和测试,请参阅调试平台代码和测试平台代码。如需详细了解如何设置 CodeLLDB 以调试 Rust 服务软件包,请参阅 Rust 调试。

将调试程序连接到服务软件包时,请连接到托管该软件包的进程。进程名称采用 <bundle_name>:<instance_name> 格式,例如 OrchestratorSampleRustServiceBundle:sample-main-no-conditions。以下命令会列出匹配的进程及其进程 ID:

adb shell ps -A | grep <bundle_name>

如需详细了解 SDV 调试工作流(例如连接到多个设备和查看日志),请参阅调试 SDV。

修改 VSIDL 文件

ASfP 包含 VSIDL 语言服务器 (vsidl-lsp)。如需详细了解如何为语言服务器设置目录,请参阅自动目录更新和 LSP 集成。如果您的目录包含 CATALOG_UPDATE 文件,编辑器会为 .vsidl 文件提供以下功能:

  • 实时验证:编辑器会在“问题”窗口中突出显示 VSIDL 关键字,并显示语法错误、未解析的类型和 VSIDLC 验证错误。如需详细了解验证规则及其错误代码,请参阅 VSIDL 语言规范。
  • 自动补全和文档:您可以按 Ctrl+空格键获取关键字、消息、服务、主题和渠道建议,也可以按 Ctrl+Q 查看文档注释。
  • 导航和格式设置:您可以按 Ctrl+B 前往 .vsidl 或 .proto 定义,按 Alt+Shift+F7 查找引用,按 Ctrl+F12 查看文件结构,以及按 Ctrl+Alt+L 设置文件格式。

为 AI 助理添加了 SDV 上下文

ASfP 包含 Android Studio 中的 Gemini。如需详细了解 ASfP 功能,请参阅探索 Android Studio for Platform。为帮助 Gemini 或其他 AI 编码助理遵循 SDV 惯例,请将 AGENTS.md 文件添加到 SDV 目录的根目录中。如需详细了解代理文件,请参阅使用 AGENTS.md 文件自定义 Gemini。

以下示例是一个起点,您可以根据自己的商品目录进行调整:

# AAOS SDV service catalog rules

- Implement SDV service bundles in Rust under `services/<BundleName>/src/`.
- Keep `.proto` files limited to Protobuf `message`, `enum`, and `service` definitions. Define service bundles, APEX packaging, VM placement, and SOME/IP mappings in `.vsidl` files.
- Regenerate middleware with `vsidlc` after you change `.vsidl` or `.proto` files, and leave generated files unmodified.
- Use `PascalCase` for service bundle names and lowercase `kebab-case` for topic and channel names.
- Run `vsidlc --explain <CODE>` to look up a VSIDLC error code.