桌面主机单元 (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 秒。这可用于使用 ./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] |
将位置设置为指定的纬度和经度值,以及可选的精度(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 |
布尔值 | 如果为真,则触控板上的轻触为选择事件。 |
touchpaduiabsolute |
false |
布尔值 | 当 touchpadnavigation 为 true 时,设置触摸是否应视为绝对触摸或手势。 |
视频配置
Android Auto 支持三种视频分辨率
- 480p(800x480,默认值)
- 720p(1280x720)
- 1080p(1920x1080)
为了支持其他纵横比,车载单元可以指定一个边距以进行黑边(或灰边)处理。例如,如果您想要一个 1000x600 的屏幕,请将分辨率设置为 720p(1280x720),并将 marginwidth
设置为 280,marginheight
设置为 120。这将导致在左右边缘添加 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
...
名称 | 默认值 | 类型 | 描述 |
---|---|---|---|
加速度计 |
false |
布尔值 | 启用加速度计传感器数据。 |
指南针 |
false |
布尔值 | 启用指南针传感器数据。 |
驾驶状态 |
false |
布尔值 | 启用驾驶状态传感器数据。 |
燃油 |
false |
布尔值 | 启用燃油传感器数据。 |
陀螺仪 |
false |
布尔值 | 启用陀螺仪传感器数据。 |
位置 |
false |
布尔值 | 启用车辆位置传感器数据。 |
夜间模式 |
false |
布尔值 | 启用夜间模式传感器数据。 |
里程表 |
false |
布尔值 | 启用里程表传感器数据。 |
速度 |
false |
布尔值 | 启用速度传感器数据。 |
收费卡 |
false |
布尔值 | 启用收费卡传感器数据。 |
GPS卫星 |
false |
布尔值 | 启用GPS卫星传感器数据。 |
驻车制动 |
false |
布尔值 | 启用驻车制动传感器数据。 |
档位 |
false |
布尔值 | 启用档位传感器数据。 |
其他配置选项
下表列出了其他配置选项
名称 | 默认值 | 类型 | 描述 |
---|---|---|---|
仪表盘 |
false |
布尔值 | 启用仪表盘。在UI中添加一个窗口以显示导航和电话状态。 |
导航仪表盘 |
false |
布尔值 | 启用仪表盘。在UI中添加一个窗口以显示导航状态。 |
电话仪表盘 |
false |
布尔值 | 启用仪表盘。在UI中添加一个窗口以显示电话状态。 |
回放状态 |
false |
布尔值 | 启用回放状态。在UI中添加一个窗口以显示回放状态消息。 |
驾驶员位置 |
左侧 |
字符串 | 以下之一:left 、center 或right 。 |
窗口左侧 |
|
整数 | 设置主窗口的左侧位置。 |
窗口顶部 |
|
整数 | 设置主窗口的顶部位置。 |
燃油类型 |
无铅汽油 |
字符串 | 以下一个或多个,以逗号分隔
|
电动汽车连接器 |
|
字符串 | 以下零个或多个,以逗号分隔
fueltypes 包含electric 时设置。 |
故障排除
有时DHU在首次连接时会显示空白屏幕。您可以通过执行以下操作来解决此问题
- 关闭DHU。
- 按照运行DHU中描述的步骤5停止并重新启动Head Unit Server。
- 重新启动DHU。
- 授予手机屏幕上请求的任何其他权限。DHU可能会再次关闭。
- 如有必要,重新启动DHU。