第13章 车载测试与调试:模拟器使用、真机调试、日志分析、性能测试工具
做车载开发,最头疼的是什么?
不是写代码,是调试。
你想想看,车机不像手机,不能随便刷机。出问题了,你没法跟用户说「重启一下就好」。所以,测试和调试能力,直接决定了你的开发效率。这一章,我把这几年在车载项目里摸爬滚打的经验,全盘托出。
13.1 模拟器:你的第一道防线
我刚开始做车载开发时,总觉得模拟器没用。直到有一次,我在真机上反复测试一个导航卡顿问题,每次都要上车、点火、等系统启动……一天下来,光上下车就折腾了十几趟。后来我学乖了,先在模拟器上跑通,再上真机。
Android Automotive 模拟器,说白了就是一个虚拟的车机。它模拟了车载特有的硬件环境,比如:
- 车载屏幕(不同尺寸、分辨率)
- GPS 信号模拟
- 车辆网络(CAN 总线模拟)
- 音频通道(媒体、导航、通话分离)
13.1.1 创建车载模拟器
在 Android Studio 里,操作很简单:
1. 打开 AVD Manager
2. 点击「Create Virtual Device」
3. 选择「Automotive」分类
4. 选一个合适的设备定义(比如 Automotive Wide 或 Automotive Portrait)
5. 选择系统镜像(推荐 API 30 以上)
6. 配置完成后启动
嗯,这里要注意:系统镜像一定要选带有「Google APIs」的版本。否则很多车载特有的 API 会报错。我踩过这个坑,浪费了半天时间。
13.1.2 模拟器的高级玩法
模拟器不只是跑个界面。你可以用它模拟各种车载场景:
| 场景 | 模拟方法 | 用途 |
|---|---|---|
| GPS 信号 | 通过 telnet 发送经纬度 | 测试导航、位置服务 |
| 车辆速度 | 模拟 CAN 总线信号 | 测试车速相关的 UI 变化 |
| 屏幕旋转 | 模拟器工具栏旋转按钮 | 测试横竖屏适配 |
| 多屏联动 | 启动多个模拟器实例 | 测试仪表盘与中控交互 |
避坑指南:我曾经在模拟器上测试蓝牙连接,一切正常。结果上了真机,蓝牙死活连不上。后来发现,模拟器的蓝牙实现是虚拟的,跟真实硬件差异很大。所以,蓝牙、WiFi、NFC 这类硬件相关的功能,一定要在真机上验证。
13.2 真机调试:直面真实战场
模拟器跑得再好,最终还是要上真机。真机调试,才是真正考验你功底的时候。
13.2.1 连接真机
车机真机调试,跟手机调试不太一样。车机通常没有 USB 调试开关,需要进入工程模式才能开启。
步骤:
1. 进入设置 → 系统 → 关于本机
2. 连续点击「版本号」7次,开启开发者模式
3. 返回设置 → 系统 → 开发者选项
4. 开启「USB 调试」
5. 用 USB 线连接电脑
6. 运行 adb devices 确认连接
我遇到过一种情况:adb devices 能识别,但 logcat 就是没输出。后来发现是车机的 USB 端口供电不足。换了一根带屏蔽的数据线,问题就解决了。所以,线材很重要。
13.2.2 无线调试
车机在车上,电脑在办公室,怎么调试?
无线调试就派上用场了。
# 确保车机和电脑在同一网络
adb connect 192.168.1.100:5555
# 如果连接不上,先通过 USB 设置端口
adb tcpip 5555
adb connect 192.168.1.100:5555
13.3 日志分析:从海量信息中找线索
日志分析,是每个车载开发者的基本功。车机的日志量,比手机大得多。因为除了 Android 系统日志,还有车载特有的 CAN 总线日志、音频路由日志、电源管理日志等等。
13.3.1 logcat 的进阶用法
很多人只会用 adb logcat,然后被海量信息淹没。其实,logcat 有很多过滤技巧:
# 按标签过滤
adb logcat -s CarService
# 按优先级过滤(只显示错误和警告)
adb logcat *:E *:W
# 同时过滤多个标签
adb logcat -s CarService:V CarAudioService:D
# 保存到文件
adb logcat -d > crash_log.txt
# 实时输出并保存
adb logcat | tee logcat_output.txt
我个人习惯,在开发阶段就加上自定义标签:
Log.d("MyApp_Navigation", "导航启动,目标地址:" + destination);
Log.e("MyApp_Navigation", "导航失败,错误码:" + errorCode);
这样,出问题时能快速定位到自己的代码。
13.3.2 车载特有的日志
车机系统里,有几个关键的日志源:
- CarService 日志:车辆状态、空调、门窗等
- AudioService 日志:音频焦点、音量调节、声道切换
- Vehicle HAL 日志:CAN 总线数据、传感器数据
- SystemUI 日志:状态栏、通知栏、快捷设置
abandonAudioFocus()。
13.4 性能测试工具:让数据说话
性能问题,不能靠「感觉」。你得用数据说话。
13.4.1 常用性能指标
| 指标 | 说明 | 车载场景下的阈值 |
|---|---|---|
| 启动时间 | 从点击图标到首帧显示 | < 2秒(导航类 < 1秒) |
| 帧率(FPS) | 界面流畅度 | > 30fps(地图 > 45fps) |
| 内存占用 | 应用使用的 RAM | < 200MB(低配车机 < 100MB) |
| CPU 使用率 | 应用占用的 CPU 时间 | < 20%(后台 < 5%) |
| 冷启动时间 | 进程被杀后重新启动 | < 3秒 |
13.4.2 使用 Profiler 工具
Android Studio 自带的 Profiler,是我最常用的工具。它能实时监控 CPU、内存、网络、能耗。
操作步骤:
1. 连接真机或启动模拟器
2. 点击底部「Profiler」标签
3. 选择要监控的进程
4. 点击「Record」开始记录
5. 操作应用,模拟用户行为
6. 点击「Stop」结束记录
7. 分析生成的报告
你想想看,如果发现内存一直在涨,那八成是内存泄漏。用 Profiler 的「Memory」视图,可以抓取 Heap Dump,然后分析哪些对象没有被回收。
13.4.3 车载专用性能测试
车载场景下,有些性能测试是特有的:
- 多任务切换测试:导航 + 音乐 + 电话同时运行,看系统是否卡顿
- 长时间运行测试:连续运行 8 小时,看内存是否泄漏
- 低电量模式测试:模拟车辆电瓶电量低,看应用是否降级
- 温度测试:车机在高温下(比如夏天暴晒),看是否降频或崩溃
避坑指南:我曾经有一个导航应用,在实验室测试一切正常。结果用户反馈,开车 2 小时后导航卡死。我查了日志,发现是地图缓存没有及时清理,导致内存溢出。后来加了一个定时清理缓存的机制,问题就解决了。所以,长时间运行测试一定要做。
13.5 本章知识体系
下面这张图,总结了本章的核心内容:
说白了,测试和调试就是一套组合拳。模拟器帮你快速验证逻辑,真机帮你发现硬件问题,日志帮你定位 bug,性能工具帮你优化体验。四者缺一不可。
我记得刚入行时,有个前辈跟我说:「写代码只占 30% 的时间,剩下 70% 都在调试。」当时我不信,现在信了。所以,把这一章的内容吃透,你的开发效率至少能翻一倍。