桌面车载主机 (DHU) 允许您的开发机器模拟 Android Auto 车载主机,以便您运行和测试 Android Auto 应用。DHU 可在 Windows、macOS 和 Linux 系统上运行。
安装 DHU 后,您可以使用 运行 DHU 中描述的其中一种受支持的连接机制,将移动设备连接到 DHU 来测试您的 Android Auto 应用。
要报告与 DHU 相关的错误或请求功能,请使用问题跟踪器。
安装 DHU
请按照以下步骤在您的开发机器上安装 DHU
- 在运行 Android 9 (API 级别 28) 或更高版本的移动设备上启用开发者模式,如 配置设备上的开发者选项 中所述。
- 在设备上编译并安装您的应用。
- 在设备上安装 Android Auto。如果已安装 Android Auto,请确保您使用的是最新版本。
- 在 Android Studio 中,打开 SDK 管理器 并导航到SDK 工具标签页,然后下载 Android Auto 桌面车载主机模拟器软件包。
DHU 安装在 SDK_LOCATION/extras/google/auto/
目录中。
在 Linux 或 macOS 系统上,在该目录中运行以下命令以确保 DHU 二进制文件可执行
chmod +x ./desktop-head-unit
Linux 的其他步骤
如果您在 Linux 系统上运行 DHU 2.x 版本,您需要安装一些额外的库。DHU 二进制文件依赖于 GLIBC
2.32 或更高版本。您可以通过运行此命令检查系统的 GLIBC
版本
ldd --version
如果版本低于 2.32,请将 GLIBC
更新到 2.32 或更高版本,这可能需要您将操作系统升级到与 GLIBC
2.32 或更高版本兼容的版本。
您还必须安装 libc++1
和 libc++abi1
库。安装过程因您的 Linux 发行版而异。例如,在基于 Debian 的 Linux 发行版上,您可以使用此命令安装库
sudo apt-get install libc++1 libc++abi1
安装 DHU 预发布版本
要访问 DHU 的预发布版本,您可以使用 Android Studio 预览版,或者将您现有 Android Studio 安装的更新渠道更改为 beta 渠道。
运行 DHU
安装 DHU 后,您可以通过 USB 将移动设备和工作站连接起来,从而测试您的 Android Auto 应用。通过使用 附件模式(推荐用于 DHU 2.x)或 ADB 隧道连接 将移动设备连接到开发机器来运行 DHU。
使用附件模式连接
Android Auto 支持使用 Android 开放附件协议 (AOA) 连接到 DHU 2.x 版本,命令如下
./desktop-head-unit --usb
默认情况下,DHU 会扫描可用 USB 设备列表,并尝试连接到第一个兼容设备。要指定特定设备,请在 --usb
命令中包含设备 ID,如下所示
./desktop-head-unit --usb=[DEVICE_ID]
使用 ADB 隧道连接
此方法需要通过 Android 调试桥 (adb
) 设置与 Android Auto 车载主机服务器的连接。请按照以下步骤设置隧道并运行 DHU
- 启用 Android Auto 开发者模式,如果尚未启用。
如果车载主机服务器尚未运行,请打开溢出菜单并选择启动车载主机服务器,如图 1 所示。
在设备上,通知区域会显示一个前台服务,指示服务器正在运行,如图 2 所示。
图 1. 包含开发者选项的上下文菜单。
图 2. 车载主机服务器正在运行的通知。
在 Android Auto 应用中,轻触设置顶部附近的以前连接的汽车,并确保将新汽车添加到 Android Auto 已启用。
使用 USB 将移动设备连接到开发机器。
确保移动设备屏幕已解锁,以便它可以启动 DHU。
在开发机器上,运行以下
adb
命令,将套接字连接从开发机器的 5277 端口转发到 Android 设备上的相同端口号。此配置允许 DHU 通过 TCP 套接字连接到在移动设备上运行的车载主机服务器。adb forward tcp:5277 tcp:5277
从
SDK_LOCATION/extras/google/auto/
目录中,通过在 Windows 上运行命令desktop-head-unit.exe
,或在 macOS 或 Linux 上运行./desktop-head-unit
来启动 DHUcd SDK_LOCATION/extras/google/auto
desktop-head-unit.exe # Windows
./desktop-head-unit # macOS or Linux
- 如果这是您首次将移动设备连接到 DHU,请检查移动设备的屏幕,以接受服务条款并根据需要调整权限设置。
DHU 启动后,您可以使用 DHU 控制台命令来运行和测试您的应用。
命令行选项
默认情况下,车载主机服务器通过端口 5277 连接。要覆盖主机或端口,请使用 --adb=<[localhost:]port>
标志,如以下示例所示
./desktop-head-unit --adb=5999
默认情况下,DHU 模拟带有触摸屏用户界面的 Android Auto 兼容车载主机。通过鼠标点击 DHU 来模拟用户触摸。要模拟使用旋转控制器作为输入方式的车载主机,您可以使用 -i rotary
标志,如以下示例所示
./desktop-head-unit -i controller
当 DHU 处于旋转控制器模式时,您可以使用键盘快捷键来模拟控制器操作。有关更多详细信息,请参阅旋转控制器部分。在旋转控制器模式下,DHU 会忽略鼠标点击。您必须通过模拟的旋转控制器操作来操作 Android Auto。
下表列出了 DHU 的其他命令行选项
选项 | 说明 |
---|---|
-c , --config=FILE |
使用指定的配置文件 .ini 。有关更多详细信息,请参阅配置 DHU 部分。 |
-i , --input=INPUT |
使用指定的输入模式,可以是:touch 、rotary 或 hybrid 。 |
-a , --adb=HOSTPORT |
使用 ADB 传输。可选 host:port 或 port 。默认为端口 5277。 |
-a , --usb=DEVICE_ID |
使用 USB AOA 传输。可选 DEVICE_ID 。 |
-v , --version |
显示版本信息。 |
-l , --licenses |
显示开源许可。 |
-h , --headless |
在无头模式下运行,没有 UI。 |
-t , --always_show_window_on_top |
将 DHU 窗口显示在其他窗口之上(默认关闭) |
-? , --help |
显示帮助列表。 |
DHU 用户指南
本节描述了 DHU 支持的功能以及如何使用它们。
命令在您启动 DHU 的终端窗口中输入。多个命令可以通过用 ;
分隔在同一行运行。
系统
命令 | 键 | 说明 |
---|---|---|
help [command] |
显示完整的命令集。如果指定了命令名称,则显示该命令的帮助。 | |
quit exit |
Alt+Q | 退出车载主机。 |
sleep [seconds] |
休眠一秒。如果指定了延迟,则休眠那么多 seconds 。这可用于通过 ./desktop-head-unit < script.txt 在(例如)CI 环境中编写车载主机的脚本。 |
|
screenshot filename.png
|
将屏幕截图保存到 filename.png。 |
|
licenses |
显示 DHU 中使用的库的许可。 | |
keycode keycode
|
发送 keycode,它是 键码 部分中列出的名称之一。 |
触摸和触摸板
当触摸或触摸板启用时,点击显示窗口(对于触摸)或触摸板窗口(对于触摸板)会被注册为触摸事件。
对于触摸,通过右键点击第一个手指位置,然后按住右键点击第二个手指来模拟多点触控。两个手指的中心点保持固定;移动鼠标可以围绕中心旋转、捏合或两者兼有。
对于触摸板,按住左键可滚动屏幕上的不同 UI 元素。点击右键可选择具有焦点的元素。
命令 | 键 | 说明 |
---|---|---|
tap x y
|
在指定坐标处模拟触摸事件。 |
旋转控制器
DHU 支持旋转控制器。当它启用时,支持以下操作
- 点击方向键的向上、向下、向左和向右
- 顺时针和逆时针旋转
- 执行旋转轻弹(一次五步)
- 在控制器上点击向下和返回
命令和键绑定列在下表中。
鼠标上的滚轮发送 dpad rotate
命令,鼠标中键点击(通常是滚轮)发送 dpad click
命令。
请注意,大多数汽车都配备触摸屏。有些汽车只有旋转控制器,有些则兼具触摸和控制器。汽车还可以支持触摸板,用于地图平移和文本输入。在模拟不同的车载主机时,请注意这些不同的配置。
命令 | 键 | 说明 |
---|---|---|
dpad {up|down|left|right} |
方向键 | 移动旋转控制器。 |
dpad {ur|dl|ul|dr} |
移动旋转控制器。 | |
dpad soft {left|right} |
Shift+方向键 | 按下某些旋转控制器上的侧边按钮。 |
dpad click |
回车 | 按下旋转控制器。 |
dpad back |
退格 | 按下某些旋转控制器下方的返回按钮。 |
dpad rotate left |
1 | 逆时针(向左)旋转旋转控制器。 |
dpad rotate right |
2 | 顺时针(向右)旋转旋转控制器。 |
dpad flick left |
Shift+1 | 快速逆时针旋转旋转控制器。 |
dpad flick right |
Shift+2 | 快速顺时针旋转旋转控制器。 |
dpad 0-9*#+ |
数字键盘 |
麦克风
DHU 支持使用麦克风进行语音输入或播放预录制的语音轨道。为方便起见,DHU 随附了以下常用语音命令的音频文件。这些音频文件位于 SDK_LOCATION/extras/google/auto/voice/
目录中。
文件名 | 文本 |
---|---|
navhome.wav |
导航到家。 |
navwork.wav |
导航到工作。 |
navsoh.wav |
导航到悉尼歌剧院。 |
navgoogle.wav |
导航到美国加利福尼亚州圆形剧场公园大道 1600 号。 |
exitnav.wav |
退出导航。 |
howlong.wav |
还有多久到达? |
showtraffic.wav |
显示路况。 |
showalternateroute.wav |
显示备用路线。 |
pause.wav |
暂停音乐。 |
nextturn.wav |
我的下一个转弯是什么时候? |
要在 DHU 提示符中运行单个 .wav
文件,请使用以下命令
mic play /path/to/filename.wav
下表列出了其他与麦克风相关的命令
命令 | 键 | 说明 |
---|---|---|
mic begin |
M | 激活麦克风,模拟点击方向盘按钮,并等待来自计算机麦克风的输入。 |
mic play filename.wav
|
激活麦克风并播放指定的 WAV 文件录音。注意:您听不到 WAV 文件的播放,但会听到来自 Android Auto 的响应。 | |
mic repeat |
重复上次与 mic play 一起使用的录音。 |
|
mic reject {on|off} |
激活或禁用麦克风请求的拒绝。当启用时,所有麦克风请求都将被拒绝。 |
传感器
DHU 支持使用以下命令模拟车辆传感器数据的变化。要模拟传感器数据并将其发送到 Android Auto,必须在启动 DHU 时使用相应的配置 .ini
文件启用相应的传感器。
命令 | 说明 |
---|---|
fuel [percentage] |
将燃油液位设置为指定的百分比,或者(未传入值时)停用燃油液位。 |
range [km] |
将续航里程设置为指定的公里数,或者(未传入值时)停用续航里程数据。 |
lowfuel [{on|off}] |
设置低燃油警告传感器,或者(未传入值时)停用该传感器。 |
accel [x] [y] [z] |
将加速度计设置为指定的 x、y 和 z 值 (m/s^2),或者(未传入参数时)取消设置加速度计数据。如果需要跳过可选参数,请传入 NAN。 |
compass bearing [pitch] [roll] |
将指南针设置为指定的方位、俯仰和滚动值(度)。如果需要跳过可选参数,请传入 NAN。 |
gyro [x] [y] [z] |
将陀螺仪设置为指定的 x、y 和 z 旋转速度 (rad/s),或者(未传入参数时)取消设置陀螺仪数据。如果需要跳过可选参数,请传入 NAN。 |
location lat long [accuracy] [altitude] [speed] [bearing] |
将位置设置为指定的纬度和经度值,以及可选的精度(米)、海拔(米)、速度(米/秒)和方位(度)。如果需要跳过可选参数,请传入 NAN。 |
odometer km [current_trip_km] |
将里程表设置为指定的公里数以及可选的当前行程公里值。 |
speed [speed] |
将车辆速度设置为指定值(米/秒),或者(未传入值时)停用传感器。 |
tollcard {insert|remove} |
插入或移除通行卡。 |
gps_satellite number_in_use [[azimuth] [elevation] [prn] [snr] [used_in_fix]] |
将 GPS 卫星传感器设置为指定的正在使用的数量值,以及可选的方位角(0 到 360 度范围内的角度)、仰角(0 到 90 度范围内的角度)、prn(伪随机噪声)、snr(分贝)和用于定位(true 或 false )的列表。 |
parking_brake engaged |
将驻车制动传感器设置为 true 或 false 。 |
gear gear_value |
将档位传感器设置为指定值(例如,0 表示空档,100 表示前进,101 表示驻车,102 表示倒车)。 |
日间和夜间模式
DHU 支持使用以下命令和键绑定模拟日间和夜间模式之间的切换
命令 | 键 | 说明 |
---|---|---|
day |
Shift+N | 激活日间模式 — 高亮度、全彩。 |
night |
Ctrl+N | 激活夜间模式 — 低亮度、高对比度。 |
daynight nightday |
N | 切换日间或夜间模式。 |
焦点管理
DHU 支持使用以下命令模拟 Android Auto 是否在车载主机上具有焦点
命令 | 说明 |
---|---|
focus video {on|off|toggle} |
激活或禁用车载主机上的视频焦点。关闭视频焦点模拟车载主机进入原生模式。 |
focus audio {on|off|toggle} |
激活或禁用车载主机上的音频焦点。关闭音频焦点模拟车载主机播放自己的音频源。 |
focus nav {on|off|toggle} |
激活或禁用车载主机上的导航焦点。关闭导航焦点模拟车载主机运行自己的导航系统。 |
限制和驾驶状态
DHU 支持模拟车辆行驶时的某些限制,例如禁用键盘和不允许电话配置,使用以下命令
命令 | 键 | 说明 |
---|---|---|
restrict none |
U | 禁用所有限制。 |
restrict all |
Shift+U | 启用所有限制,例如模拟驾驶。 |
仪表盘
DHU 支持模拟仪表盘。该仪表盘通常位于方向盘后方,在导航期间显示下一个转弯的基本信息 — 例如下一个道路名称或转弯箭头 — 距离或时间。它还显示有关正在进行的电话呼叫的信息。
这可以通过配置文件 [general]
部分中的 instrumentcluster
条目启用,或者通过 navcluster
或 phonecluster
条目分别控制每个功能。
[general]
...
instrumentcluster = true
仪表盘显示
某些车辆配备的仪表盘显示屏能够显示丰富的视觉信息,例如地图图块。从 DHU 2.1 版(目前可通过 Android Studio Beta 更新渠道获取)开始,您可以在开发机器上模拟此类显示屏。
这可以通过包含仪表盘 [display]
部分的配置文件来实现。[display]
部分支持与文件中 [general]
部分配置的主显示屏相同的视频配置选项。


...
# The display name following the colon can be whatever you like.
[display:cluster]
# Setting the displaytype as cluster is what lets the DHU know how to handle it.
displaytype = cluster
resolution = 800x480
dpi = 160
...
此配置可以直接添加到现有的 .ini
文件中,或者您可以将其放入单独的文件中并在启动 DHU 时传递多个配置文件以重复使用。当使用多个配置文件时,给定值的后续定义将覆盖先前的定义。
# Launch your landscape configuration with your cluster display configuration
./desktop-head-unit -c landscape.ini -c cluster.ini
# Launch the portait configuration with the same cluster display configuration
./desktop-head-unit -c portrait.ini -c cluster.ini
媒体播放状态
DHU 支持额外的信息显示,以显示媒体播放状态,例如正在播放的曲目。
这可以通过 [general]
部分中的 playbackstatus
条目启用。
[general]
...
playbackstatus = true
键码
DHU 提供了一组默认键码,可模拟车辆中常用的快捷按钮集。例如,home
键码可以在 DHU 提示符中通过以下方式触发
keycode home
下表列出了其他可用的键码
键码 | 说明 |
---|---|
home |
转到主屏幕。 |
back |
返回。 |
call |
拨打或结束通话。 |
search |
触发搜索。 |
media_play_pause media_play media_pause |
播放或暂停媒体。 |
media_next media_previous |
转到下一个或上一个媒体曲目。 |
media |
转到默认媒体应用。 |
navigation |
转到默认导航应用。 |
tel |
转到默认电话应用。 |
配置 DHU
DHU 支持通过配置文件 .ini
更改触摸和旋转控制器之间的输入模式,并设置车载主机从手机请求的帧率、分辨率和 DPI。
配置文件的默认位置是 ~/.android/headunit.ini
。要更改系统上的车载主机配置,您可以修改此文件。
您还可以使用 -c
标志指定要加载的配置文件
./desktop-head-unit -c /path/to/config.ini
以下代码段显示了示例配置
[general]
touch = true
touchpad = false
controller = false
instrumentcluster = false
resolution = 800x480
dpi = 160
framerate = 30
fueltypes = unleaded,electric,hydrogen
evconnectors = supercharger
演示您可以测试的不同车载主机设置的示例配置文件位于 SDK_LOCATION/extras/google/auto/config/
文件夹下。对于更高级的用例,请参阅以下受支持的设置。
输入配置
下表列出了输入配置选项
名称 | 默认 | 类型 | 说明 |
---|---|---|---|
inputmode |
default |
字符串 | 定义输入模式。选项 touch 、rotary 和 hybrid 激活和禁用触摸屏和旋转支持,并相应地设置默认键码。default 遵从 touch 和 controller 选项。 |
controller |
false |
布尔值 | 启用旋转控制器输入。除非 inputmode 为 default ,否则将被忽略。 |
touch |
true |
布尔值 | 激活触摸屏。除非 inputmode 为 default ,否则将被忽略。 |
touchpad |
false |
布尔值 | 启用触摸板。 |
touchpadnavigation |
false |
布尔值 | 启用触摸板用于 UI 导航。 |
touchpadtapasselect |
false |
布尔值 | 当为 true 时,触摸板上的点击是选择事件。 |
touchpaduiabsolute |
false |
布尔值 | 当 touchpadnavigation 为 true 时,设置触摸是应被视为绝对触摸还是手势。 |
视频配置
Android Auto 支持三种视频分辨率
- 480p (800x480,默认)
- 720p (1280x720)
- 1080p (1920x1080)
为了支持其他纵横比,车载主机可以根据需要指定一个边距用于信箱(柱状)。例如,如果您想要一个 1000x600 的屏幕,请将分辨率设置为 720p (1280x720),并将 marginwidth
设置为 280,marginheight
设置为 120。这将导致在左右边缘各增加 140 像素的边距,在顶部和底部各增加 60 像素的边距。
以下示例配置模拟了典型的 6 英寸屏幕 (750x450)
[general]
...
resolution = 800x480
marginwidth = 50
marginheight = 30
以下示例配置模拟了超宽屏幕
[general]
...
resolution = 1280x720
marginwidth = 0
marginheight = 220
下表列出了其他视频配置选项
名称 | 默认 | 类型 | 说明 |
---|---|---|---|
resolution |
800x480 |
字符串 | 其中之一:800x480 、1280x720 、1920x1080 。 |
dpi |
160 |
整数 | |
normalizedpi |
false |
布尔值 | 当为 true 时,缩小 DHU 窗口大小以适应更大的 DPI 值。当为 false 时,更大的 DPI 值会导致更大的窗口,这虽然不像真实显示器,但有助于检查视觉内容。 |
realdpi |
160 |
整数 | 用于视频配置。 |
framerate |
30 |
整数 | 用于视频配置。 |
marginheight |
0 |
整数 | 用于视频配置。 |
marginwidth |
0 |
整数 | 用于视频配置。 |
margins |
0,0,0,0 |
字符串 | 用于视频配置。如果存在,则覆盖 marginwidth 和 marginheight 。格式为顶部、底部、左侧、右侧。 |
contentinsets |
0,0,0,0 |
字符串 | 用于视频配置。格式为顶部、底部、左侧、右侧。 |
stablecontentinsets |
0,0,0,0 |
字符串 | 用于视频配置。默认为 contentinsets 的值。格式为顶部、底部、左侧、右侧。 |
cropmargins |
false |
布尔值 | 如果指定了 margins 、marginheight 或 marginwidth ,则此设置的 true 值将从显示的视频中移除这些边距。这更接近最终用户所看到的内容。 |
pixelaspectratio |
1.0 |
浮点数 | 用于视频配置。 |
传感器配置
要模拟传感器数据并将其发送到 Android Auto,必须使用以下选项启用相应的传感器。如果传感器未启用,则使用 DHU 命令发送给该传感器的任何数据都将被忽略。此配置必须放在 [sensors]
部分中,而不是用于大多数其他配置的 [general]
部分中。
[general]
touch = true
...
[sensors]
location = true
fuel = true
...
名称 | 默认 | 类型 | 说明 |
---|---|---|---|
accelerometer |
false |
布尔值 | 启用加速度计传感器数据。 |
compass |
false |
布尔值 | 启用指南针传感器数据。 |
driving_status |
false |
布尔值 | 启用驾驶状态传感器数据。 |
fuel |
false |
布尔值 | 启用燃油传感器数据。 |
gyroscope |
false |
布尔值 | 启用陀螺仪传感器数据。 |
location |
false |
布尔值 | 启用车辆位置传感器数据。 |
night_mode |
false |
布尔值 | 启用夜间模式传感器数据。 |
odometer |
false |
布尔值 | 启用里程表传感器数据。 |
speed |
false |
布尔值 | 启用速度传感器数据。 |
toll_card |
false |
布尔值 | 启用通行卡传感器数据。 |
gps_satellite |
false |
布尔值 | 启用 GPS 卫星传感器数据。 |
parking_brake |
false |
布尔值 | 启用驻车制动传感器数据。 |
gear |
false |
布尔值 | 启用档位传感器数据。 |
其他配置选项
下表列出了其他配置选项
名称 | 默认 | 类型 | 说明 |
---|---|---|---|
instrumentcluster |
false |
布尔值 | 启用仪表盘。向 UI 添加一个窗口以显示导航和电话状态。 |
navcluster |
false |
布尔值 | 启用仪表盘。向 UI 添加一个窗口以显示导航状态。 |
phonecluster |
false |
布尔值 | 启用仪表盘。向 UI 添加一个窗口以显示电话状态。 |
playbackstatus |
false |
布尔值 | 启用播放状态。向 UI 添加一个窗口以显示播放状态消息。 |
driverposition |
left |
字符串 | 其中之一:left 、center 或 right 。 |
windowleft |
|
整数 | 设置主窗口的左侧位置。 |
windowtop |
|
整数 | 设置主窗口的顶部位置。 |
fueltypes |
unleaded |
字符串 | 以下一项或多项,以逗号分隔
|
evconnectors |
|
字符串 | 以下零项或多项,以逗号分隔
fueltypes 包含 electric 时设置。 |
问题排查
有时 DHU 首次连接时显示空白屏幕。您可以通过以下操作解决此问题
- 关闭 DHU。
- 按照 运行 DHU 中描述的步骤 5 停止并重新启动车载主机服务器。
- 再次启动 DHU。
- 授予手机屏幕上请求的任何额外权限。DHU 可能会再次关闭。
- 如有必要,请重新启动 DHU。