本页面概述了如何在软件定义型车辆 (SDV) 平台上访问、构建和运行显示安全组件,包括高可用性渲染器 (HAR)、DriverUI 和安全监控器。
代码访问
本部分介绍了如何获取 HAR 和 DriverUI 显示安全组件的代码库访问权限。
高可用性渲染器
高可用性渲染器 (HAR) 的代码库可在 packages/services/display_safety/ 的主代码库检出中找到。
HAR 的代码库结构如下:
- 框架:包含平台、渲染、动画和音频的核心框架接口。
- 参考:包含框架接口的平台特定实现,以及 HAR 参考应用和安全工具链(Design Compiler、安全监控器)的代码。
- 服务:用于在组件之间发送和接收车辆数据的 Android 特有服务,以及 APEX 数据包的定义。
- 预构建:为预构建的二进制文件(例如 Impeller 图形库)提供封装容器。
Harry 参考应用代码位于 packages/services/display_safety/reference/harry_app。
如需详细了解 HAR 的目录结构,请参阅显示安全代码结构
安全监控器
安全监控器的代码库可在 packages/services/display_safety/reference/safety-monitor 的主代码库签出中找到。
安全监控器代码的结构如下所示:
main.rs:提取指示性工件,初始化车辆数据服务器和指示性监控循环。将指示性信号的可见性信息与指示性信号检查结果进行比较,并使用 SDV 日志提供结果。Vehicle_data_server.rs:订阅车辆数据的服务器,用于更新主循环的指示灯可见性。Telltale_monitoring.rs:以循环方式运行,使用 screencap crate 获取屏幕缓冲区的副本,并检查指定区域是否存在指示信号。然后,将检查结果发送到主循环。
DriverUI
DriverUI 作为非捆绑代码库的一部分提供,您可以从 ub-automotive-master 分支访问该代码库。
mkdir ub-automotive-master && cd ub-automotive-master
repo init -u https://android.googlesource.com/platform/manifest -b ub-automotive-master
repo sync -cq
如需详细了解未捆绑应用和 Google 来源,请参阅集成未捆绑应用。
构建并运行
本部分详细介绍了如何编译和执行 SDV Media 中的 HAR 和 SDV 车载信息娱乐系统 (IVI) 中的 DriverUI 的目标,以实现完整的 SDV 集群解决方案。

图 1. 显示安全双虚拟机结构。
构建 HAR 和 SDV 媒体目标
- 基本媒体目标值:
sdv_media_cf- 说明:SDV 媒体堆栈的专用目标,可实现各种媒体框架的隔离测试。
- 目录位置:
device/google/sdv/
- 集成 HAR 的目标:
sdv_media_har_cf- 说明:此目标将媒体堆栈与 HAR 集成,在 Cuttlefish 上执行 SDV 媒体。
- 目录位置:
device/google/sdv_dsplay_safety/ - 构建执行:
# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-trunk_staging-userdebug
m -j
构建 DriverUI
在 ub-automotive-master 分支中,您可以使用 CommandLine 或 AndroidStudio 构建非 bundle 应用。
在 Android Studio 中,导入 Gradle 文件:
packages/apps/Car/libs/aaos-apps-gradle-project/build.gradle
这是主要 Gradle 项目,包含所有未捆绑的应用,包括 DriverUI。使用 Gradle 构建项目:
# To build only DriverUI module of aaos-apps-gradle-project use
./gradlew :driver-ui:assemble
成功构建后,DriverUI APK 将位于 out/aaos-apps-gradle-build/driver-ui/outputs/apk/default/debug/
driver-ui-default-debug.apk
DriverUI 代码位于 packages/apps/Car/DriverUI
注意:DriverUI 是主 Gradle 项目的子模块,因此所有 Gradle 任务都使用 aaos-apps-gradle-project 运行。
使用 DriverUI 构建 SDV IVI 目标
- 基本目标:
sdv_ivi_cf- 说明:此目标是 x86-64 架构上 IVI 的基础 SDV 目标。
- 目录位置:
device/google/sdv/
DriverUI 集成目标:
sdv_ivi_cf_ds- 说明:此目标扩展了基本 IVI 配置,以纳入显示屏安全组件。此目标对于验证显示安全服务和仪表板内的互动至关重要。
- 目录位置:
device/google/sdv_dsplay_safety/ 添加 DriverUI 二进制文件:将
DriverUI.apk复制到packages/apps/Car/DriverUIPrebuilt,同时复制蓝图Android.bp文件。# Create a blueprint file, contents of this file are shown in the next step touch /path/to/aosp_repo_root/packages/apps/Car/DriverUIPrebuilt/Android.bp # Copy DriverUI.apk built cp /path/to/ub-automotive-master/out/aaos-apps-gradle-build/driver-ui/outputs/apk/default/debug/driver-ui-default-debug.apk /path/to/aosp_repo_root/packages/apps/Car/DriverUIPrebuilt/DriverUI.apk
应将 Android.bp 设置为使用模块名称 DriverUIPrebuilt 并替换 DriverUIStubApp:
android_app_import {
name: "DriverUIPrebuilt",
overrides: ["DriverUIStubApp"],
apk: "DriverUI.apk",
privileged: true,
product_specific: true,
certificate: "platform",
required: ["allowed_privapp_com.android.car.driverui"],
optional_uses_libs: [
"androidx.window.extensions",
"androidx.window.sidecar",
],
enforce_uses_libs: false,
dex_preopt: {
enabled: false,
},
}
构建执行:
# In the root of the Android source source build/envsetup.sh lunch sdv_ivi_cf_ds-trunk_staging-userdebug m -j
目标部署
成功完成这两个目标的构建流程后,Cuttlefish 实用程序会帮助启动目标,如本部分中所述。
SDV 媒体和 HAR 部署
HAR 目标是使用预定义的 sdv-media-config.json 配置创建的,该配置在 device/google/sdv_media_cf.mk 中指定。
注意:SDV Media 和 SDV IVI 均在 Unlocked 启动模式下启动,以用于显示安全集群。如需了解详情,请参阅 SDV 启动模式。
# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-trunk_staging-userdebug
cvd create --extra_bootconfig_args="androidboot.sdv.boot_mode=unlocked androidboot.sdv.instance_name=instance1 androidboot.virt.address=3"
创建完成后,终端将显示日志,以便在浏览器中通过 localhost 端口访问目标:Point your browser to https://localhost:8443 to interact with the
device.

图 2. 包含 HAR 的显示安全 SDV 媒体虚拟机。
SDV IVI 和 DriverUI 部署
SDV IVI DriverUI 目标使用 device/google/sdv_ivi_cf.mk 中定义的现有 sdv-ivi-config.json 进行初始化。您还可以为集群屏幕指定其他启动配置参数和合适的显示尺寸。
# In the root of the Android source
source build/envsetup.sh
lunch sdv_ivi_cf_ds-trunk_staging-userdebug
cvd create --extra_bootconfig_args="androidboot.sdv.boot_mode=unlocked androidboot.sdv.instance_name=instance2 androidboot.virt.address=4" --display1=width=1920,height=720
启动目标平台后,终端会显示日志,以便在 localhost 端口的浏览器中访问目标平台:Point your browser to https://localhost:8443 to
interact with the device.
SDV-IVI 和 DriverUI 目标的部署会初始化两个显示屏:一个用于 SDV-IVI 系统,另一个用于 DriverUI。DriverUI 作为特权集群应用运行,利用 ClusterHomeManager 类(也称为 Cluster2)。

图 3. 具有 DriverUI 的显示安全 SDV IVI VM。
双虚拟机集群的部署
Cuttlefish 能够使用双 VM 配置启动两个虚拟机 (VM),以实现显示叠加。

图 4. 显示安全性显示合成概览。
您可以使用 ds-toolkit(可在 packages/services/display_safety/service/ 中找到)启动双虚拟机配置。
m ds_toolkit
ds_toolkit launch
启动配置后,终端会显示在 localhost 端口上通过浏览器访问目标的日志:Point your browser to https://localhost:8443 to
interact with the device.
这会在一个完全可操作的集群中启动两个 Cuttlefish 目标,并叠加两个虚拟机显示屏。

图 5. 显示具有 SDV 媒体和 SDV IVI 虚拟机的安全完整集群。
建筑安全监控器
安全监控器默认是为 SDV 媒体目标构建的:
# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-trunk_staging-userdebug
m -j
在运行时,安全监控器会使用一组默认的编译器制品,这些制品已生成并打包到 APEX 中,用于参考集群显示。
运行 har-design-compiler 可能会生成新的制品。此工具在目标平台上运行,可根据设计生成制品。建议运行该工具,从目标拉取新制品,然后重新构建映像。
该工具默认在目标平台上构建和安装。
# Run the compiler on the target
adb shell har_design_compiler -c </path/to/artifacts> -o /data/local/tmp/
# Pull the artifacts to the local filesystem
adb pull data/local/tmp/artifacts services/harry-prebuilt/data/assets/
# Rebuild the image
m -j
安全监控器在目标设备启动时进行初始化。安全监控器将以循环方式持续运行,通过分析屏幕缓冲区和传入的车辆数据信号,验证屏幕上安全关键元素是否符合预期。
您可以随时查看安全监控日志:
adb logcat | grep har-safety-monitor