桌面车机 (DHU) 可让您的开发机器模拟 Android Auto 车机,以便您运行和测试 Android Auto 应用。DHU 可在 Windows、macOS 和 Linux 系统上运行。
安装 DHU 后,您可以通过运行 DHU 中所述的某一个受支持的连接机制将移动设备连接到 DHU 来测试 Android Auto 应用。
如需报告与 DHU 相关的错误或提交与 DHU 相关的功能请求,请使用此问题跟踪器。
安装 DHU
如需在开发机器上安装 DHU,请按以下步骤操作:
- 在搭载 Android 9(API 级别 28)的移动设备上启用开发者模式 或更高版本,如配置设备端开发者 选项。
- 编译应用并在设备上安装应用。
- 在设备上安装 Android Auto。如果已安装 Android Auto,请确保您使用的是最新版本。
- 在 Android Studio 中,打开 SDK 管理器并进入 SDK Tools 标签页,然后下载 Android Auto Desktop Head Unit Emulator 软件包。
DHU 安装在 SDK_LOCATION/extras/google/auto/
目录中。
在 Linux 或 macOS 系统上,从该目录下运行以下命令,以确保 DHU 二进制文件可执行:
chmod +x ./desktop-head-unit
适用于 Linux 的额外步骤
如果您是在 Linux 系统上运行版本 2.x,还需要安装一些其他库。DHU 二进制文件依赖于 GLIBC
版本 2.32 或更高版本。您可以通过运行以下命令来检查系统的 GLIBC
版本:
ldd --version
如果版本低于 2.32,请将 GLIBC
更新到 2.32 或更高版本,这可能需要您将 OS 升级到与 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/
目录运行desktop-head-unit.exe
命令(在 Windows 上)或./desktop-head-unit
命令(在 macOS 或 Linux 上)来启动 DHU:cd 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 |
在无头模式(无界面)下运行。 |
-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,它是键码部分中列出的某个名称。 |
触摸和触控板
启用触摸或触控板后,显示窗口(针对触摸)或触控板窗口(针对触控板)中的点击操作会注册为触摸事件。
对于触摸,请通过右键点击第一根手指的位置,然后针对第二根手指点击并按住右按钮来模拟多点触控。双指的中心点保持固定,移动鼠标可让您围绕中心旋转双指和/或双指张合。
对于触控板,点击并按住左按钮可在屏幕上的不同界面元素之间滚动。点击右按钮可选择获得焦点的元素。
命令 | 键 | 说明 |
---|---|---|
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 |
Return 键 | 按旋控器。 |
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 |
Navigate to home.(导航到家。) |
navwork.wav |
Navigate to work.(导航到单位。) |
navsoh.wav |
Navigate to Sydney Opera House.(导航到悉尼歌剧院。) |
navgoogle.wav |
Navigate to 1600 Amphitheatre Parkway, California, USA.(导航到美国加利福尼亚露天剧场大道 1600 号。) |
exitnav.wav |
Exit navigation.(退出导航。) |
howlong.wav |
How long until I get there?(要多久才能到达那里?) |
showtraffic.wav |
Show traffic.(显示路况。) |
showalternateroute.wav |
Show alternate routes.(显示备选路线。) |
pause.wav |
Pause music.(暂停播放音乐。) |
nextturn.wav |
When is my next turn?(到达下一个转弯是什么时候?) |
如需在 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 (dB),并用在修复程序(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
仪表板屏幕
某些车辆配备有能够显示丰富视觉信息(例如地图功能块)的仪表板显示屏。从 2.1 版的 DHU(目前使用 Android Studio Beta 版更新渠道提供)开始,您可以在开发机器上模拟此类显示屏。
这可以通过包含仪表板 [display]
部分的配置文件来实现。[display]
部分支持的视频配置选项与文件的 [general]
部分中配置的主屏幕相同。
![](https://developer.android.google.cn/static/images/training/cars/dhu_main.png?authuser=0000&hl=da)
![](https://developer.android.google.cn/static/images/training/cars/dhu_cluster.png?authuser=0000&hl=da)
...
# 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 提供了一组默认的键码,用于模拟车辆中常用的一组快捷按钮。例如,可以在 DHU 提示符中触发 home
键码,如下所示:
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 |
布尔值 | 允许使用触控板进行界面导航。 |
touchpadtapasselect |
false |
布尔值 | 如果为 true,点按触控板是选择事件。 |
touchpaduiabsolute |
false |
布尔值 | 当 touchpadnavigation 为 true 时,可设置应将触摸视为绝对触摸还是手势。 |
视频配置
Android Auto 支持三种视频分辨率:
- 480p(800x480,默认)
- 720p (1280x720)
- 1080p (1920x1080)
为了支持其他宽高比,车机可以根据需要指定信箱模式(邮筒模式)下的外边距。例如,如果您想使用 1000x600 的屏幕,应将分辨率设置为 720p (1280x720),将 marginwidth
设置为 280,将 marginheight
设置为 120。这样做的效果是在左右边缘添加 140px 的外边距,在顶部和底部添加 60px 的外边距。
下方是一个模拟了典型的 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 |
布尔值 | 启用仪表板。向界面中添加一个窗口,以显示导航和手机状态。 |
navcluster |
false |
布尔值 | 启用仪表板。向界面中添加一个窗口,以显示导航状态。 |
phonecluster |
false |
布尔值 | 启用仪表板。向界面中添加一个窗口,以显示手机状态。 |
playbackstatus |
false |
布尔值 | 启用播放状态。向界面中添加一个窗口,以显示播放状态消息。 |
driverposition |
left |
字符串 | 可以是 left 、center 和 right 其中之一。 |
windowleft |
|
整数 | 设置主窗口的左侧位置。 |
windowtop |
|
整数 | 设置主窗口的顶部位置。 |
fueltypes |
unleaded |
字符串 | 以下一项或更多项(以英文逗号分隔):
|
evconnectors |
|
字符串 | 以下零个或更多个(以英文逗号分隔):
fueltypes 包含 electric 时才应设置。
|
问题排查
有时,DHU 会在首次连接时显示空白屏幕。若要解决该问题,您可以执行以下操作:
- 关闭 DHU。
- 按照运行 DHU 中的第 5 步停止和重启车机服务器。
- 重新启动 DHU。
- 授予手机屏幕上请求的任何其他权限。DHU 可能会再次关闭。
- 如有必要,请重启 DHU。