实施 System UI

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 实现不同,后者提供“返回”、“主页”和应用堆叠按钮。
状态栏 沿屏幕定位并用作导航栏的系统栏。状态栏还提供以下功能支持:
  • 连接图标。包括蓝牙、Wi-Fi 和热点/移动网络连接。
  • 下拉通知面板。例如,从屏幕顶部向下滑动。
  • 浮动通知 (HUN)。
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 屏幕如下所示。

Keyguard screen

图 1. Keyguard 屏幕

当用户选择了一种隐私类型来解锁设备时,会显示带有弹跳器的锁屏,如下所示。

Lockscreen

图 2. 锁屏。

当锁定设置为手动触发电源开启或关闭时,请使用以下说明:

adb shell input keyevent 26

用户选择器

当汽车系统 UI 状态栏和地图的集成设备重新启动时,会显示用户选择器屏幕。要了解详情,请参阅 FullscreenUserSwitcher

Loading screen

图 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 可以提供用户界面入口点来切换用户,但结果有时可能不尽如人意。如果发生这种情况:

  1. OEM 创建并显示自定义加载屏幕(或对话框)。
    • 对于 UX 而言,当用户选择切换方式时,OEM 会启动自定义加载屏幕,该屏幕可以在用户切换完成后隐藏。
    • OEM 必须根据自己的偏好设置 优先级窗口。例如,优先级较高的窗口类型。优先级不能超过 Keyguard 的优先级。
  2. OEM 在核心框架 config.xml 中设置 config_customUserSwitchUi=true,如 config_customuserswitchui 中所述。因此,框架会显示 CarUserSwitchingDialog

自定义锁屏

锁屏是 System UI 的组成部分,OEM 可以对其进行自定义。要自定义流程,请从 frameworks/base/packages/CarSystemUI/ 开始。

自定义首次用户设置

设置向导执行首次用户设置。这也可以自定义。您可以使用 UserManager API 创建用户。在某些情况下,这可以在后台实施,从而简化设置向导流程。