Android Automotive 是随 Android 开源项目 (AOSP) 一起提供的车载信息娱乐平台解决方案。本主题含括的文章将介绍 Android Automotive 系统界面提供的关键概念和组件,以及为原始设备制造商 (OEM)、第三方开发者和最终用户构建有效的人机接口 (HMI) 系统所需的核心应用。
- AOSP 主机集成指南:借助 App Host,第三方汽车应用能够代表其渲染原始设备制造商 (OEM) 样式的界面组件。
- 汽车设置结构:“汽车设置”提供了以车辆为中心的视觉界面、基本的防分心优化以及面向 OEM 的其他自定义入口点。
- 车载设备界面库集成指南: 车载设备界面库提供了一个界面开发框架,可使汽车中的所有应用实现一致性和自定义。
- 自定义状态栏系统图标: 状态栏是 Android 系统界面的一个组件,用于持续向用户显示重要信息。了解如何自定义状态栏系统图标。
- 浮动通知: 了解如何自定义浮动通知。
- Dialer:此 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
叠加层。
Theme Playground 应用
此应用通过在一个位置集中显示所有主题属性,简化了自定义 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
) 托管了一个必须从主“设置”应用关联的“设置”屏幕,就可以动态注入这个单独的应用。如需了解详情,请参阅动态偏好设置。
媒体
媒体是一个主应用,可代表实现 MediaSession
和 MediaBrowser
API 的媒体应用提供前端用户体验。媒体应用可以是第三方应用(例如 Spotify 和 Pandora)以及其他媒体来源,例如蓝牙 (BT) 流式传输和本地媒体。
Android Auto(投屏)提供数百款媒体应用,所有这些应用都会按为汽车提供音频播放中的说明实现这些媒体 API。 媒体 API 随每个主要 Android 版本及 Androidx 库的发布而不断改进。为了保证所有媒体应用和未来 Android 版本的 API 互操作性,强烈建议 OEM 采用 AOSP 实现,然后对其进行自定义。
自定义
通过 DeviceDefault 主题实现的标准主题设置也适用于媒体。此外,您还可以使用资源叠加层进一步自定义外观和风格,但前提是自定义要遵循用户体验准则。
USB 媒体和媒体来源
强烈建议您尽可能通过 MediaSession
和 MediaBrowser
API 的实现将这些媒体来源连接到媒体(这适用于所有第三方媒体应用)。请参阅 AOSP 中的 LocalMediaPlayer 应用。该应用会显示本地媒体文件,并在“媒体”中显示为来源。