第8章:Android Auto测试与调试:桌面头单元模拟器、日志分析、常见问题排查
说实话,做Android Auto开发最头疼的不是写代码,而是调试。你想想看,每次都要跑到车上测试,连上真车机,点火、挂挡...这一套下来半小时就没了。我早期做这个项目时,一天能跑三趟停车场,后来学乖了——桌面头单元模拟器才是真香。
这一章,我就把压箱底的调试经验掏出来。从模拟器搭建到日志分析,再到那些让你抓狂的常见问题,咱们一个一个过。
8.1 桌面头单元模拟器(DHU)
桌面头单元模拟器,简称DHU。说白了,就是让你的电脑假装成一台车机。Google官方提供的这个工具,我每天都在用。
8.1.1 环境准备
你需要准备这些东西:
- Android Studio(版本4.0以上,我建议用最新稳定版)
- Android SDK(API 30以上)
- Desktop Head Unit(从Google官方仓库下载)
- 一台Android手机(Android 11以上,用于运行你的App)
8.1.2 启动DHU
启动命令其实很简单,但有几个坑要注意。先看基本命令:
# 启动DHU,指定分辨率为1280x720
./desktop-head-unit --window-size=1280,720
# 如果你需要模拟不同屏幕尺寸
./desktop-head-unit --window-size=1920,1080 --density=240
# 开启调试日志
./desktop-head-unit --window-size=1280,720 --log-level=verbose
嗯,这里要注意。我第一次用的时候,直接双击运行,结果界面黑屏。后来才发现,必须从命令行启动,而且当前目录要切换到DHU所在的文件夹。
8.1.3 连接手机与DHU
手机连接DHU有两种方式:USB和无线。我个人更推荐无线方式,省得被线绊到。
- 手机开启开发者选项,打开USB调试
- 运行ADB命令:
adb tcpip 5555 - 拔掉USB线,运行:
adb connect 手机IP:5555 - 在手机上打开Android Auto应用,点击右上角菜单,选择"连接桌面头单元"
8.2 日志分析:从海量信息中捞针
Android Auto的日志量非常大。一启动,logcat就开始疯狂输出。刚开始我差点被淹死,后来总结了一套过滤方法。
8.2.1 关键日志标签
| 日志标签 | 说明 | 优先级 |
|---|---|---|
| CarApp | 你的应用主日志 | 高 |
| CarProjection | 投影相关日志 | 高 |
| CarInputService | 触摸/旋钮输入事件 | 中 |
| CarAudioService | 音频焦点和路由 | 中 |
| CarMediaService | 媒体播放相关 | 高 |
| CarNavigationService | 导航相关 | 高 |
8.2.2 高效过滤命令
我常用的几个过滤命令,直接复制粘贴就能用:
# 只看你的应用日志
adb logcat -s CarApp
# 看所有车载相关日志,排除杂音
adb logcat -s CarApp CarProjection CarMediaService
# 带时间戳的详细日志
adb logcat -v time -s CarApp
# 保存到文件,方便回头分析
adb logcat -v time -s CarApp > dhu_log_2024_01_15.txt
避坑指南: 我曾经遇到一个bug,App在车机上偶尔闪退。用adb logcat -b crash抓崩溃日志,发现是某个第三方库在低内存时抛了OutOfMemoryError。后来加了内存缓存限制,问题解决。
8.2.3 日志分析三步法
拿到日志后,别急着从头看到尾。我总结了三步法:
- 先看时间戳:找到问题发生的时间点,缩小范围
- 找异常堆栈:搜索"Exception"、"Error"、"FATAL"
- 看上下文:异常前后各看20行,理解触发条件
举个例子,有一次用户反馈导航时语音播报卡顿。我按三步法分析日志,发现每次卡顿前都有CarAudioService: Audio focus lost的日志。原来是另一个App抢了音频焦点。
8.3 常见问题排查
做Android Auto开发,有些问题你迟早会遇到。我把它们分成三类,逐个击破。
8.3.1 连接问题
现象: 手机连上DHU后,车机屏幕黑屏或显示"正在连接"
排查步骤:
- 检查USB调试是否开启(我经常忘记重新授权)
- 确认Android Auto应用版本是否最新(Google每季度更新一次)
- 查看日志中是否有
CarProjection: Connection refused - 重启DHU和手机(别笑,这招解决了我30%的问题)
8.3.2 界面显示问题
现象: App在手机上正常,在车机上布局错乱或元素消失
原因分析:
说白了,车机的屏幕比例和手机不一样。车机通常是16:9或更宽,而且有安全区域(避免被方向盘遮挡)。
// 正确的做法:使用CarAppTheme
// 不要直接使用手机端的布局
// 错误示例
setContentView(R.layout.activity_main); // 这是手机端的
// 正确示例
// 在CarAppService中创建Session时,使用CarAppTheme
@Override
public Screen onCreateScreen(Intent intent) {
return new MyScreen(context);
}
// 在Screen中,使用CarUiController
@Override
public void onBind(View view) {
// 使用CarUiController提供的布局
CarUiController uiController = getCarUiController();
uiController.getListView(); // 自动适配车机
}
getCarUiController().getInsets()获取安全区域边界,然后调整布局。
8.3.3 性能问题
现象: 界面卡顿、触摸响应慢、动画掉帧
排查工具:
- 使用Android Studio的Profiler工具,查看CPU和GPU使用率
- 在DHU启动时加
--profile参数,生成性能分析文件 - 检查是否有频繁的垃圾回收(GC)
我记得有一次,App在车机上滑动列表时卡成PPT。用Profiler一看,每秒钟GC了十几次。原因是列表中的图片加载没做缓存,每次滑动都重新解码。加上Glide缓存后,流畅度直接起飞。
8.4 知识体系总览
这一章的内容比较多,我画了张图帮你理清思路:
这张图把本章的核心内容串起来了。你从DHU模拟器开始,遇到问题就去分析日志,日志看不懂就对照常见问题列表。三个模块互相配合,基本能覆盖90%的调试场景。
最后说一句: 调试Android Auto,耐心比技术更重要。我刚开始时,一个连接问题能折腾一整天。后来慢慢积累了一套自己的排查流程,效率才上来。你也会的,多练就好。