22、车载测试与调试:从模拟器到实车的全链路实战

车载系统开发,有一半时间其实都在跟测试打交道。这话一点不夸张。

我刚开始做 IVI 项目时,总觉得写代码才是核心,测试嘛,跑一遍就完事了。结果呢?第一次集成测试,启动时间超了 3 秒,直接被客户打回来。从那以后,我彻底明白了——测试不是收尾工作,而是质量的生命线。

今天咱们就聊聊车载测试与调试。我会把模拟器、实车、性能、自动化这几个维度串起来讲。你想想看,一个车载系统从代码到量产,中间要过多少道关卡?

核心观点:车载测试不是「测一下能不能用」,而是「测一下在各种极端条件下还能不能用」。多屏交互、传感器噪声、启动时间、内存泄漏——每一个都是坑。

车载测试与调试 模拟器测试 多屏模拟(双屏/三屏) 传感器模拟(GPS/陀螺仪) 网络模拟(弱网/断网) 实车测试环境 CAN总线/以太网接入 电源管理/休眠唤醒 实车日志采集工具链 性能测试 启动时间 / 内存 / CPU 自动化测试框架 CarTest / CTS / VTS

一、模拟器测试:多屏与传感器模拟

模拟器测试,说白了就是「在电脑上假装自己是一台车机」。很多人觉得模拟器不准,但我的经验是——模拟器能帮你筛掉 80% 的显性 bug,剩下的 20% 才需要上实车。

1.1 多屏模拟

车载系统跟手机最大的区别是什么?多屏。仪表盘、中控、副驾屏、后排屏……每个屏幕的分辨率、刷新率、交互方式都不一样。

在 Android Studio 里,你可以这样配置多屏模拟器:

// 在 AVD 配置中,使用以下参数启动双屏
-emulator -avd MyCarAVD -screen-multi-display 1280x720/1920x1080

// 或者通过 adb 动态添加虚拟显示器
adb shell wm display create --display-type=virtual --size 1280x720

我的小技巧:我习惯在模拟器里同时开三个屏幕——中控、仪表、副驾。然后用 adb 分别截图对比,看布局有没有错位。有一次发现副驾屏的字体在 720p 下被截断了,幸亏在模拟器里提前发现,不然实车测试时又要被骂。

1.2 传感器模拟

车载系统依赖大量传感器:GPS、陀螺仪、加速度计、光线传感器……模拟器里怎么搞?

Android 模拟器自带传感器面板,但说实话,功能有限。我推荐用 sensorsimulator 工具,或者直接写脚本注入数据:

// 模拟 GPS 位置(北京天安门)
adb emu geo fix 116.397128 39.916527

// 模拟车辆速度(60 km/h)
adb shell dumpsys sensorservice --set-sensor 3 60.0

// 模拟光线变化(进入隧道)
adb shell dumpsys sensorservice --set-sensor 5 10.0

注意:模拟器的传感器数据是「理想值」,没有噪声。我曾经踩过一个坑——模拟器里导航一切正常,上了实车 GPS 信号飘得厉害,结果发现是天线位置不对。所以模拟器只能测逻辑,不能测硬件耦合。

二、实车测试环境搭建

实车测试,才是真正见真章的时候。我见过太多团队,模拟器跑得飞起,一上车就崩。为什么?因为实车环境太复杂了——电源波动、电磁干扰、温度变化……

2.1 硬件准备

  • CAN 总线分析仪:用于模拟车辆信号(车速、车门、灯光等)
  • 可编程电源:模拟车辆点火、ACC 通断、休眠唤醒
  • 以太网交换机:连接车机、诊断仪、上位机
  • USB 转串口模块:抓取底层日志

2.2 软件工具链

我个人习惯用这套组合拳:

工具 用途 备注
adb + logcat 抓取 Android 日志 配合 grep 过滤关键字
CANoe / PCAN-View 模拟 CAN 信号 商业工具,但值得投资
systrace / perfetto 性能追踪 分析启动时间必备
Wireshark 抓取以太网包 排查 SOME/IP 通信问题

避坑指南:我曾经在实车测试时,logcat 疯狂输出但找不到关键信息。后来发现是日志级别设错了。记住:实车测试一定要开 verbose 级别,并且把日志重定向到 U 盘,不然车机重启后日志就丢了。

三、性能测试:启动时间、内存、CPU

性能测试是车载系统的「硬指标」。客户不会关心你用了什么架构,他只关心——点火后几秒能看导航?

3.1 启动时间测试

启动时间分两种:冷启动(完全断电)和热启动(休眠唤醒)。

bootchart 可以精确分析每个阶段的耗时:

# 在车机上启用 bootchart
adb shell 'echo 120 > /data/bootchart/start'

# 重启后拉取数据
adb pull /data/bootchart/ bootchart_logs/

# 生成图表
pybootchartgui -f svg bootchart_logs/bootchart.tgz

我一般关注这几个阶段:

  • Bootloader 到 Kernel:通常 2-3 秒,跟硬件相关
  • Zygote 启动:1-2 秒,优化空间不大
  • SystemUI 加载:1-3 秒,这里最容易优化
  • Launcher 首帧:0.5-1 秒,用户体验的关键

3.2 内存与 CPU 监控

车载系统最怕什么?内存泄漏。跑着跑着卡死了,这可不是手机能重启就完事的。

# 实时监控内存
adb shell dumpsys meminfo com.android.car

# 抓取 CPU 使用率
adb shell top -n 1 -d 1 | grep "myapp"

# 使用 perfetto 录制 10 秒
adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto -t 10s sched freq idle

我的经验:内存泄漏往往在「长时间运行」后才暴露。我习惯让车机跑一个 72 小时的稳定性测试,每 30 分钟记录一次内存。如果内存曲线持续上升,那肯定有泄漏。别问我怎么知道的——我查过一个泄漏,原因是某个 Fragment 在销毁时没有释放 Sensor 监听器。

四、自动化测试框架:CarTest、CTS、VTS

手动测试终究不是长久之计。自动化测试框架,才是保证质量的根本。

4.1 CarTest

CarTest 是 Google 为 Android Automotive 提供的专用测试框架。它模拟车载特有的场景,比如:

  • 车辆状态变化(停车、行驶、倒车)
  • 多屏交互(主驾操作副驾屏)
  • 音频焦点管理(导航打断音乐)
// 一个简单的 CarTest 用例
@Test
public void testNavigationDuringDriving() {
    // 模拟车辆进入行驶状态
    CarTestManager.setVehicleSpeed(60);
    
    // 启动导航
    onView(withId(R.id.nav_button)).perform(click());
    
    // 验证导航界面显示
    onView(withId(R.id.nav_map)).check(matches(isDisplayed()));
    
    // 模拟车辆停止
    CarTestManager.setVehicleSpeed(0);
}

4.2 CTS(Compatibility Test Suite)

CTS 是 Android 兼容性测试套件。你的车机如果想通过 Google 认证,CTS 必须全绿。

跑 CTS 其实很枯燥,但有几个关键点要注意:

  • CTS 对硬件有要求:比如屏幕密度、内存大小,不满足直接 fail
  • CTS 版本要匹配:Android 12 的 CTS 不能用在 Android 13 上
  • 部分测试需要特定硬件:比如相机、蓝牙,模拟器里跑不了

4.3 VTS(Vendor Test Suite)

VTS 是给硬件厂商准备的。它测试的是 HAL 层、内核、驱动等底层组件。

说实话,VTS 的坑比 CTS 多。我遇到过最离谱的一次——VTS 测试因为某个 GPIO 引脚的电平时序不对而失败,查了三天才发现是硬件设计问题。

重要提醒:CTS 和 VTS 不是「跑一次就完事」的。每次系统升级、驱动更新、甚至只是改了某个配置文件,都要重新跑一遍。我建议把 CTS/VTS 集成到 CI/CD 流水线里,每天自动跑一次。

写在最后

车载测试,说到底就是「把问题消灭在量产之前」。模拟器帮你快速迭代,实车帮你验证真实场景,性能测试帮你守住底线,自动化框架帮你守住长期质量。

嗯,这四个维度缺一不可。你想想看,如果只做模拟器测试,上了实车才发现问题,那代价可就大了去了。

一句话总结:测试不是成本,是投资。你在测试上省下的时间,最终都会在客户投诉和召回上加倍还回来。


公众号:蓝海资料掘金营,微信deep3321