本页面简要介绍了如何在软件定义车辆 (SDV) 平台上访问、构建和运行显示安全组件,包括高可用性渲染程序 (HAR)、DriverUI 和安全监控器。
代码访问权限
本部分介绍了如何获取 HAR 和 DriverUI 显示安全组件的代码库。
高可用性渲染器
高可用性渲染程序 (HAR) 的代码库作为主代码库检出的一部分,位于 packages/services/display_safety/。
HAR 的代码库结构如下:
- 框架:包含平台、渲染、动画和音频的核心框架接口。
- 参考:包含框架接口的平台专用实现,以及 HAR 参考应用和安全工具链(设计编译器、安全监控器)的代码。
- 服务:用于在组件之间发送和接收车辆数据的 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 媒体中的 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_display_safety/ - 构建执行:
# In the root of the Android source
source build/envsetup.sh
lunch sdv_media_har_cf-aosp_current-userdebug
m -j
构建 DriverUI
在 ub-automotive-master 分支中,您可以使用 CommandLine 或 AndroidStudio 构建非捆绑式应用。
在 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_display_safety/ 添加 DriverUI 二进制文件:将
DriverUI.apk连同 BlueprintAndroid.bp文件一起复制到packages/apps/Car/DriverUIPrebuilt。# 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-aosp_current-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-aosp_current-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. 显示 Safety SDV Media VM 和 HAR。
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-aosp_current-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 虚拟机。
双虚拟机集群的部署
Cuttlefish 能够使用双虚拟机配置启动两个虚拟机 (VM),以实现显示叠加。

图 4. 显示安全显示合成概览。
您可以使用 packages/services/display_safety/service/ 提供的 ds_toolkit 启动双虚拟机配置。
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-aosp_current-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