Android Automotive 提供专为车辆开发的新 System UI。System UI 的大多数组件都与框架服务紧密耦合。System UI 是指屏幕上显示的任何不属于应用的元素。Automotive System UI(在 CarSystemUI 元素软件包中)是 Android System UI(在 System UI 软件包中)的扩展,后者已针对车辆进行了专门自定义。
什么是 System UI?
特定于 Automotive System UI 的组件包括:
组件 | 说明 |
---|---|
锁屏 UI | 用户通过此屏幕向特定用户帐号进行身份验证。 |
导航栏 | 可以定位在屏幕左侧、底部或右侧的系统栏,可以包含用于导航到不同应用、切换通知面板以及提供车辆控制(例如 HVAC)的 facet 按钮。这与 Android System UI 实现不同,后者提供“返回”、“主页”和应用堆叠按钮。 |
状态栏 | 沿屏幕定位并用作导航栏的系统栏。状态栏还提供以下功能支持:
|
System UI | 指屏幕上显示的任何不属于应用的元素。 |
用户切换器 UI | 用户可以通过此屏幕选择其他用户。 |
音量 UI | 当驾驶员使用物理音量按钮更改设备上的音量时显示的对话框。 |
System UI 的工作原理是什么?
System UI 是 Android 应用,在设备开机时运行。该应用通过 SystemServer 通过反射启动。下面列出了 System UI 的用户可见方面最相关的入口点。使用这些组件可以为汽车特定功能自定义 Android System UI。
config_statusBarComponent
config_systemUIFactoryComponent
CarSystemUI 是 System UI 软件包的扩展,这意味着 CarSystemUI 软件包可以使用和替换 System UI 软件包中的类和资源。
自定义 System UI
叠加层
虽然您可以修改 Android 源代码来自定义 System UI,但这样做会使应用未来的 Android 更新变得更加困难和复杂。相反,Android 支持使用叠加层目录,这使您无需修改源代码即可替换资源文件。在 Android 构建系统中,叠加层系统以受控方式替换文件。所有修改后的文件都清晰地标识出来,而无需遍历整个 AOSP 源代码树。
叠加层文件必须放在 PRODUCT_PACKAGE_OVERLAYS
目录中,并且必须具有与原始 AOSP 根结构完全相同的子文件夹。对于 Android 10 或更高版本,PRODUCT_PACKAGE_OVERLAYS
设置为
PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay
Automotive System UI 使用来自 System UI和 CarSystemUI 软件包的资源,这意味着可以使用叠加层替换来自每个位置的资源,以影响 Automotive System UI 的外观。
要替换文件,请在您指定的 /overlay
目录中复制要替换文件的目录结构,然后将替换文件包含在该目录中。例如,要替换
frameworks/base/packages/CarSystemUI/res/layout/super_status_bar.xml
添加位于以下位置的替换 super_status_bar.xml
文件:
packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/
要替换 frameworks/base/packages/SystemUI/res/values/config.xml
(在 System UI 中,而不是 CarSystemUI 中),请将替换 config.xml
文件添加到
packages/services/Car/car_product/overlay/frameworks/base/packages/SystemUI/res/layout/
或
packages/services/Car/car_product/overlay/frameworks/base/packages/CarSystemUI/res/layout/
下面提供了两个主要自定义入口点的说明。
导航栏
Automotive System UI 可以在屏幕的左侧、底部和右侧具有三个导航栏。可以使用以下配置切换每个系统栏的可见性:
config_enableLeftSystemBar
config_enableBottomSystemBar
config_enableRightSystemBar
每个栏都有已配置和未配置状态,可以通过叠加相应的布局文件来自定义这些状态:
car_left_system_bar.xml
car_left_system_bar_unprovisioned.xml
car_system_bar.xml
(底部导航栏的布局)car_system_bar_unprovisioned.xml
car_right_system_bar.xml
car_right_system_bar_unprovisioned.xml
这些布局必须在顶层包含 com.android.systemui.car.systembar.CarSystemBarView
,其中可以包含任何其他必要的视图。可以使用 com.android.systemui.car.systembar.CarSystemBarButton
在导航栏内包含按钮。
如果设备已为给定用户正确配置,则这些视图会在 CarSystemBar#createSystemBar
中扩充。
状态栏
可以将状态栏视为具有附加功能的导航栏。与导航栏不同,状态栏没有用于禁用它的标志。您可以使用以下项修改状态栏:
car_top_navigation_bar.xml
car_top_navigation_bar_unprovisioned.xml
这些布局必须在顶层包含 com.android.systemui.statusbar.car.CarNavigationBarView
。状态栏包含状态图标。要更改图标的大小,请使用缩放比例均匀缩放图标,而不是指定特定大小。例如,在叠加层文件 /overlay/frameworks/base/packages/CarSystemUI/res/values/dimens.xml
中,添加以下尺寸以将图标大小加倍:
<resources> <!-- The amount by which to scale up the status bar icons.--> <item name="status_bar_icon_scale_factor" format="float" type="dimen">2</item> </resources>
状态栏位于一个特殊的窗口层中,该层还包括通知面板、用户切换器、浮动通知 (HUN) 和 Keyguard。这些不同的布局都包含在 super_status_bar.xml
中。
System UI 源代码更改
叠加层可能无法提供充分自定义 System UI 行为所需的灵活性。
警告。 对 Android 源代码所做的更改在 Android 的更高版本中难以更新。我们强烈建议您扩展 Automotive System UI 代码,而不是直接修改代码。这样,底层 Automotive System UI 源代码可以升级,且合并冲突极少,因为所有自定义都是通过已知的 API 表面实现的。
System UI 的大多数方面都可以通过以下两个入口点进行自定义:
config_statusBarComponent
config_systemUIFactoryComponent
例如,如果您创建一个名为 com.android.systemui.statusbar.car.custom.CustomCarStatusBar
的类,该类扩展了 CarStatusBar
,请更新 config_statusBarComponent
以指向此新组件。扩展此类可以自定义与系统栏和通知逻辑相关的大多数元素。
同样,您可以创建 CustomCarSystemUIFactory
并将其放在 config_systemUIFactoryComponent
中。使用此类可以更新 VolumeUI 和锁屏的功能。
自定义用户切换和解锁
以下材料描述了如何自定义用户切换体验。
术语 | 说明 |
---|---|
Keyguard | 全屏对话框,用于防止意外地与前台应用互动。在设置了多个用户时,保护每个用户的隐私。 |
正在加载对话框 | 在用户之间切换时显示的加载屏幕。 |
锁屏,弹跳器 | 需要人员输入 PIN 码、图案或密码的屏幕。 |
用户 | Android 用户。 |
用户选择器 | 设备启动时显示的用户选择器屏幕。 |
用户切换器 | 从“快速设置”切换屏幕时显示的用户切换器。 |
自定义用户切换
Keyguard 和弹跳器
在 Android Automotive OS 中,仅当用户点击锁屏上的“取消”按钮时,才会显示带有用户选择器的 Keyguard 屏幕。Keyguard 屏幕如下所示。
图 1. Keyguard 屏幕
当用户选择了一种隐私类型来解锁设备时,会显示带有弹跳器的锁屏,如下所示。
图 2. 锁屏。
当锁定设置为手动触发电源开启或关闭时,请使用以下说明:
adb shell input keyevent 26
用户选择器
当汽车系统 UI 状态栏和地图的集成设备重新启动时,会显示用户选择器屏幕。要了解详情,请参阅 FullscreenUserSwitcher
。
图 3. 用户选择器屏幕
可以在 car_fullscreen_user_switcher.xml
中自定义此屏幕的布局。
正在加载屏幕
无论入口点如何,只要切换用户,就会显示加载屏幕。例如,通过用户选择器或“设置”屏幕。“正在加载”屏幕是框架 System UI 的组成部分,并映射到名为 CarUserSwitchingDialog
的公共类。有关示例,请参见上图 3。
主题可以使用 Theme_DeviceDefault_Light_Dialog_Alert_UserSwitchingDialog
自定义。
要设置 Android 用户,初始设置向导流程允许驾驶员为其自身设置用户名。如果驾驶员随后将 Android 用户与 Google 帐号关联,则用户名将从该帐号中选择。但是,如果驾驶员指定了一个名称(例如 DriverB),然后稍后将该用户名与其名称为 Maddy 的 Google 帐号关联,则最初分配的名称 (DriverB) 不会更改,因为该名称是显式设置的。驾驶员只能在“设置”菜单中更改名称。
可以在 car_user_switching_dialog.xml.
中自定义布局。
OEM 可以使用名为 NoActionBar.Fullscreen
的主题来隐藏状态栏和导航栏。(这是原始 System UI,已针对汽车参考 UI 进行了更新。)有关详情,请参阅自定义。
虽然 OEM 可以提供用户界面入口点来切换用户,但结果有时可能不尽如人意。如果发生这种情况:
- OEM 创建并显示自定义加载屏幕(或对话框)。
- 对于 UX 而言,当用户选择切换方式时,OEM 会启动自定义加载屏幕,该屏幕可以在用户切换完成后隐藏。
- OEM 必须根据自己的偏好设置 优先级窗口。例如,优先级较高的窗口类型。优先级不能超过 Keyguard 的优先级。
- OEM 在核心框架
config.xml
中设置config_customUserSwitchUi=true
,如config_customuserswitchui
中所述。因此,框架不会显示CarUserSwitchingDialog
。
自定义锁屏
锁屏是 System UI 的组成部分,OEM 可以对其进行自定义。要自定义流程,请从 frameworks/base/packages/CarSystemUI/
开始。
自定义首次用户设置
设置向导执行首次用户设置。这也可以自定义。您可以使用 UserManager API 创建用户。在某些情况下,这可以在后台实施,从而简化设置向导流程。