HMI 概览

Android Automotive 是随 Android 开源项目 (AOSP) 一起提供的车载信息娱乐平台解决方案。本主题含括的文章将介绍 Android Automotive 系统界面提供的关键概念和组件,以及为原始设备制造商 (OEM)、第三方开发者和最终用户构建有效的人机接口 (HMI) 系统所需的核心应用。

  • AOSP 主机集成指南:借助 App Host,第三方汽车应用能够代表其渲染原始设备制造商 (OEM) 样式的界面组件。
  • 汽车设置结构:“汽车设置”提供了以车辆为中心的视觉界面、基本的防分心优化以及面向 OEM 的其他自定义入口点。
  • 车载设备界面库集成指南 车载设备界面库提供了一个界面开发框架,可使汽车中的所有应用实现一致性和自定义。
  • 自定义状态栏系统图标 状态栏是 Android 系统界面的一个组件,用于持续向用户显示重要信息。了解如何自定义状态栏系统图标。
  • 浮动通知 了解如何自定义浮动通知。
  • 拨号器此 Android 系统应用可用于为蓝牙通话、联系人浏览和通话管理提供经过防分心优化 (DO) 的体验。
  • 媒体只需少量设置和一项服务,开发者便可对现有媒体应用进行扩展。虽然应用必须遵循 Automotive Media 模板,但开发者可以自定义模板颜色、字体、图标等内容来打造品牌体验。
  • 通知了解如何更改通知的外观和配置。

术语

HMI 和相关文章中使用了以下术语:

术语 定义
核心应用 对于系统功能至关重要的一组关键应用,包括设置、电台、HVAC、媒体、拨号器和键盘。
兼容性定义文档 (CDD) 枚举设备必须满足哪些要求才能与最新的 Android 版本兼容。
兼容性测试套件 (CTS) 免费的商业级测试套件,可前往兼容性测试套件下载部分下载。
自定义 修改 AOSP 实现以满足 OEM 要求。 通常情况下,这涉及使用资源叠加层来应用外观更改,同时还应确保遵守 CDD、CTS 和所有相关的用户体验指南。
主应用 对 Android 的所有方面(包括功能、可升级性、第三方开发者生态系统和最终用户)至关重要的一组关键应用。主应用包括通知、设置、媒体和通信中心/拨号器。对应的 AOSP 实现应达到生产质量标准。
资源叠加层 如需调整界面的呈现,请使用此机制在编译时(最常见的情况)或运行时(运行时资源叠加层 [RRO])替换颜色、更改尺寸、启用绘图并应用布局资源。
系统界面 属于系统的应用外界面(例如导航栏、状态栏、锁定屏幕和音量对话框)。
主题 颜色和样式的集合,用于确定沿用相应主题的组件及应用所呈现出的外观和风格。
用户体验 (UX) 属于界面设计及其易用性的范畴。

自定义

系统界面和其他核心系统应用的 AOSP 实现为开始进行 HMI 开发打下了坚实的基础。“自定义”是指通过修改 AOSP 实现(主要通过使用资源叠加层)来符合 OEM 的品牌塑造、业务和法律要求。

虽然整个系统的设计和构建非常灵活,但各组件的自定义程度应各不相同:

  • 系统界面:OEM 可以自定义或替换 AOSP 实现,但要遵循 CDD 和 CTS 以及任何其他适用的用户体验准则。

  • 非主系统应用(也称为“参考应用”)OEM 可以自定义或替换 AOSP 实现。

  • 主应用:每个应用都有一套详细的自定义准则。强烈建议 OEM 使用 AOSP 实现,然后遵循相应准则的规定对其进行自定义。

密度配置

如需确保在实体显示屏配置下正确呈现界面元素,则必须将密度属性设置为与物理密度最匹配的数值范围(屏幕指标),例如 build 文件中的此条目:

PRODUCT_PROPERTY_OVERRIDES := \
        ro.sf.lcd_density=160

用户体验限制引擎

CarUxRestrictionsManager 为应用提供钩子,以监听与行驶状态相关的更改,从而适当地修改用户体验。OEM 可以叠加配置文件 packages/services/Car/service/res/xml/car_ux_restrictions_map.xml 以影响系统的行为。

系统主题

规定系统级默认项(例如颜色和文本样式)的主题是 DeviceDefault。DeviceDefault我们建议 OEM 通过修改 DeviceDefault 主题来开始整体自定义过程。默认情况下,系统界面和 AOSP 中的所有系统应用都沿用此主题。此外,我们建议 OEM 开发的系统应用也沿用 DeviceDefault。由第三方开发的应用不应沿用 DeviceDefault,而应使用 androidx.car 库中提供的 Theme.Car。Theme.Car相应文件位置如下:

  • 核心/frameworks/base/core/res/res/values/themes_device_defaults.xml
  • 颜色/frameworks/base/core/res/res/values/colors_car.xml
  • 样式/frameworks/base/core/res/res/values/styles_car.xml
  • 汽车叠加层
    /packages/services/Car/car_product/overlay/.../values/themes_device_defaults.xml

OEM 应该在其供应商目录中为 car_product 目录提供一个并行叠加层结构,以进一步扩展 car_product 叠加层。

主题游乐场应用

此应用通过在一个位置集中显示所有主题属性,简化了自定义 DeviceDefault 主题的过程。此外,通过比较某些样式在此应用中与在其他系统应用中的呈现效果,开发者可快速调试主题问题。此应用位于:

  /packages/services/Car/tests/ThemePlayground

系统界面

系统界面包括 /frameworks/base 下的所有界面,主要位于 /frameworks/base/packages/CarSystemUI 中。它包括导航栏、状态栏、锁定屏幕、音量对话框、消息框、用户选择器和权限对话框。OEM 可以通过资源叠加层和主题广泛自定义系统界面组件,前提是每个组件都符合 CDD、CTS 及其他适用用户体验准则的要求。

系统应用

Android Automotive 包含一组核心系统应用,这些应用对整个系统的功能至关重要。其中,通信中心、媒体、通知和设置被视为主应用。

  • 通信中心
  • HVAC
  • IME(键盘)
  • 启动器(主屏幕)
  • 本地媒体播放器
  • 媒体
  • Messenger
  • 通知
  • 电台
  • 设置

主屏幕

主屏幕(称为“车用启动器”)是 HMI 体验的着陆页。AOSP 实现仅用作参考,OEM 应视需要将其替换为自己的实现,这通常会根据需要合并导航、媒体播放、通信和其他系统状态。车用启动器应用通常会显示系统中可用的应用。如需了解如何处理最近事件、软件包更改和“无头”(无启动器 activity)应用等事件,请参阅参考实现。

通知

通知是 Android 操作系统不可或缺的组件,Android Automotive 中也包含相同的构造(包括浮动通知、通知列表/中心、通知 API、排名和内嵌操作)。如需了解详情,请参阅手持设备通知概览。 为了优化汽车用例,我们进行了以下修改(与手持设备通知堆栈相比):

  • 减少了向用户显示的总体通知内容:从通知列表/中心移除了来自系统应用的部分通知,包括正在进行的媒体播放、正在进行的导航和“不重要的”(重要性为“LOW”及以下级别)前台服务相关通知,因为我们了解到这些通知要么是多余的(例如显示媒体状态的集群),要么用处不大。

  • 移除了复杂的上下文控件(例如长按和基于滑动长度的控件)。

  • 遵循用户体验限制引擎的配置。

    • 系统可能会根据行驶状态隐藏消息通知内容预览。
    • 所有字符串均有最大长度限制。
  • Android 9 中添加了专用于汽车的新通知类别,仅适用于以 android.uid.system 运行的捆绑系统应用。

  • CATEGORY_CAR_EMERGENCY:排在通知列表的最顶部。绕过勿扰 (DND) 控件。

  • CATEGORY_CAR_WARNING:排在紧急通知之下,但在其他所有通知(跳过 DND)之上。
  • CATEGORY_CAR_INFORMATION:根据“重要性”和新近度与其余通知一起进行排序。

通知堆栈的端到端实现(从通知 API 到界面)被视为主应用。为了保证 API 互操作性在所有 HU 中保持一致并最大限度地提高可升级性,强烈建议 OEM 先采用 AOSP 实现,然后稍微对其进行自定义。

自定义

适用标准 DeviceDefault 主题和资源叠加层。以下位置提供了数量非常有限的行为自定义旋钮:

packages/apps/Car/Notification/res/values/config.xml

设置

“设置”应用(汽车设置)属于“主”应用,其公开的旋钮可供用户用于配置 Android OS 和汽车的其他设置。“设置”应用在操作系统中提供 200 多项功能,这些功能与每个主要 Android 版本紧密耦合。为了实现可升级性并避免出现碎片化问题,强烈建议 OEM 采用 AOSP 实现,然后对其进行自定义(而不是为实现创建分支)。

自定义

“设置”应用将自定义纳入考虑范畴,并提供了多个自定义渠道。

  • 主题。实现配置如何呈现每个 Preference 对象类型的视觉自定义,包括:

    • Preference.DeviceDefault.CheckBoxPreference

    • Preference.DeviceDefault.DialogPreference.EditTextPreference

  • 层次结构自定义。用于实现以下目的:

    • 启动进入任意根 Fragment 中,在名为 Settings/res/values/config.xml 的文件中叠加 config_settings_hierarchy_root_fragment 的值

    • 自定义顺序、分组、文字和图标、叠加层 Settings/res/xml/*.xml 等项

  • 静态注入。在设置叠加层项目时,OEM 可以添加专有屏幕,方法是定义其他 Fragment 类和 Controller 类,然后将这些类添加到层次结构中。

  • 动态注入。如果一个单独的应用 (apk) 托管了一个必须从主“设置”应用关联的“设置”屏幕,就可以动态注入这个单独的应用。如需了解详情,请参阅动态偏好设置

媒体

媒体是一个主应用,可代表实现 MediaSessionMediaBrowser API 的媒体应用提供前端用户体验。媒体应用可以是第三方应用(例如 Spotify 和 Pandora)以及其他媒体来源,例如蓝牙 (BT) 流式传输和本地媒体。

Android Auto(投屏)提供数百款媒体应用,所有这些应用都会按为汽车提供音频播放中的说明实现这些媒体 API。 媒体 API 随每个主要 Android 版本及 Androidx 库的发布而不断改进。为了保证所有媒体应用和未来 Android 版本的 API 互操作性,强烈建议 OEM 采用 AOSP 实现,然后对其进行自定义。

自定义

通过 DeviceDefault 主题实现的标准主题设置也适用于媒体。此外,您还可以使用资源叠加层进一步自定义外观和风格,但前提是自定义要遵循用户体验准则。

USB 媒体和媒体来源

强烈建议您尽可能通过 MediaSessionMediaBrowser API 的实现将这些媒体来源连接到媒体(这适用于所有第三方媒体应用)。请参阅 AOSP 中的 LocalMediaPlayer 应用。该应用会显示本地媒体文件,并在“媒体”中显示为来源。