展示广告安全功能使用入门

本页面概述了如何在软件定义型车辆 (SDV) 平台上访问、构建和运行显示安全组件,包括高可用性渲染器 (HAR)DriverUI安全监控器

代码访问

本部分介绍了如何获取 HARDriverUI 显示安全组件的代码库访问权限。

高可用性渲染器

高可用性渲染器 (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 分支中,您可以使用 CommandLineAndroidStudio 构建非 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.

SDV 媒体虚拟机中的 HAR

图 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)。

SDV-IVI 虚拟机中的 DriverUI

图 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