桌面主机单元 (DHU) 允许您的开发机器模拟 Android Auto 主机单元,以便您可以运行和测试 Android Auto 应用。DHU 可以在 Windows、macOS 和 Linux 系统上运行。
安装 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 设备列表并尝试连接到第一个兼容的设备。要定位特定设备,请将设备 ID 作为--usb
命令的一部分包含在内,如下所示
./desktop-head-unit --usb=[DEVICE_ID]
使用 ADB 隧道连接
此方法需要通过Android 调试桥 (adb
)建立到 Android Auto 车载单元服务器的连接。请按照以下步骤设置隧道并运行 DHU
- 如果尚未启用,请启用 Android Auto 开发者模式。
如果车载单元服务器尚未运行,请打开溢出菜单并选择启动车载单元服务器,如图 1 所示。
在设备上,通知区域会出现一个前台服务,指示服务器正在运行,如图 2 所示。
在 Android Auto 应用中,点击设置顶部的之前连接的车辆,并确保已启用将新车辆添加到 Android Auto。
使用 USB 将移动设备连接到开发机器。
确保移动设备已解锁屏幕,以便它可以启动 DHU。
在开发机器上,运行以下
adb
命令,将开发机器的端口 5277 上的套接字连接转发到 Android 设备上的同一端口号。此配置允许 DHU 通过 TCP 套接字连接到在移动设备上运行的车载单元服务器。adb forward tcp:5277 tcp:5277
通过在 Windows 上运行命令
desktop-head-unit.exe
,或在 macOS 或 Linux 上运行./desktop-head-unit
,从SDK_LOCATION/extras/google/auto/
目录启动 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 。这可用于在例如 CI 环境中使用./desktop-head-unit < script.txt 对车载单元进行脚本编写。 |
|
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] |
将位置设置为指定的纬度和经度值,以及可选的精度(m)、海拔高度(m)、速度(m/s)和方位角(度)。如果需要,传入 NAN 以跳过可选参数。 |
odometer km [current_trip_km] |
将里程表设置为指定的公里数,以及可选的当前行程公里数。 |
speed [speed] |
将车速设置为指定值(m/s),或者(不传入值)停用该传感器。 |
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
集群显示
某些车辆的集群显示能够显示丰富的视觉信息,例如地图瓦片。从 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 提供一组默认按键码,模拟车辆中通常可用的快捷按钮集。例如,可以在 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 |
布尔值 | 启用触控板用于 UI 导航。 |
touchpadtapasselect |
false |
布尔值 | 为 true 时,触控板上的轻触为选择事件。 |
touchpaduiabsolute |
false |
布尔值 | 当 touchpadnavigation 为 true 时,设置触摸是否应视为绝对触摸或手势。 |
视频配置
Android Auto 支持三种视频分辨率
- 480p(800x480,默认值)
- 720p(1280x720)
- 1080p(1920x1080)
为了支持其他纵横比,车机可以指定一个边距来进行黑边(柱状黑边)。例如,如果您想要一个 1000x600 的屏幕,请将分辨率设置为 720p(1280x720)以及 280 的 marginwidth
和 120 的 marginheight
。这会有效地在左右边缘添加 140 px 的边距,在上下边缘添加 60 px 的边距。
以下示例配置模拟了一个典型的 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。