第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)
我的小习惯: 我会准备两台手机。一台专门跑Android Auto的调试版本,另一台日常用。这样不会把调试配置搞乱。

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和无线。我个人更推荐无线方式,省得被线绊到。

  1. 手机开启开发者选项,打开USB调试
  2. 运行ADB命令:adb tcpip 5555
  3. 拔掉USB线,运行:adb connect 手机IP:5555
  4. 在手机上打开Android Auto应用,点击右上角菜单,选择"连接桌面头单元"
注意: 无线连接时,手机和电脑必须在同一个Wi-Fi网络下。我曾经在公司的访客网络下折腾了半小时,死活连不上,后来才发现是两个不同的子网。

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 日志分析三步法

拿到日志后,别急着从头看到尾。我总结了三步法:

  1. 先看时间戳:找到问题发生的时间点,缩小范围
  2. 找异常堆栈:搜索"Exception"、"Error"、"FATAL"
  3. 看上下文:异常前后各看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 知识体系总览

这一章的内容比较多,我画了张图帮你理清思路:

Android Auto测试与调试知识体系 桌面头单元模拟器 • 环境准备 • 启动命令 • 分辨率设置 • USB/无线连接 • 多设备管理 核心:模拟真实车机 日志分析 • 关键日志标签 • 过滤命令 • 时间戳定位 • 异常堆栈分析 • 三步分析法 核心:从海量日志中 快速定位问题 常见问题排查 • 连接失败 • 界面错乱 • 性能卡顿 • 音频焦点冲突 • 内存泄漏 核心:实战经验总结 调试三板斧:模拟器 → 日志 → 经验

这张图把本章的核心内容串起来了。你从DHU模拟器开始,遇到问题就去分析日志,日志看不懂就对照常见问题列表。三个模块互相配合,基本能覆盖90%的调试场景。

最后说一句: 调试Android Auto,耐心比技术更重要。我刚开始时,一个连接问题能折腾一整天。后来慢慢积累了一套自己的排查流程,效率才上来。你也会的,多练就好。

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