集成行车记录仪

行车记录仪应用旨在与 AAOS 集成,为驾驶员提供视频录制功能,以增强安全性和保障性。本指南概述了技术要求、集成步骤和最佳实践,以确保成功实施。

前提条件

在继续操作之前,请确保满足以下先决条件

SDK

  • 需要 SDK 31 或更高版本。

硬件

  • 可用于 AAOS 的 EVS 或 Camera2 相机。
  • 必须有足够的内部存储空间或支持可移动外部存储设备
    用于视频录制。

软件要求

  • 解绑支持。要了解详情,请参阅解绑应用
  • 权限。行车记录仪需要系统权限。

获取源代码

在 Android 代码搜索中查找源代码,网址为:

https://cs.android.com/android/platform/superproject/+/ub-automotive-master-20250219:packages/apps/Car/Dashcam/

源代码在以下三个模块中提供

  • 行车记录仪服务。流式传输、录制和触发逻辑。
  • 行车记录仪管理器。连接到行车记录仪服务并向客户端公开稳定的 API
  • 行车记录仪应用。使用行车记录仪管理器 API 的参考行车记录仪应用

Architecture diagram

构建行车记录仪

使用 Soong 或 Gradle 构建行车记录仪。

Soong

从 Soong 构建之前,请务必清理 .cxx 目录。

在 Soong 上

mma DashcamService DashcamManager-lib DashcamApp

APK 位于 out/target/product/[lunch-target]/system/priv-app/

Gradle

在 Gradle 上

./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble

APK 位于 out/aaos-apps-gradle-build/

有关使用 Gradle 构建行车记录仪的详细说明,请参见 README 文件。

权限

行车记录仪服务和行车记录仪应用需要多项系统权限。

授予这些权限最直接的方法是使用 Blueprint 或 Make 将它们包含在预构建设置中。

在 Blueprint 中

Android.bp
android_app_import {
    name: "DashcamApp-prebuilt",
    apk: "DashcamApp.apk",
    privileged: true,
    certificate: "platform",
    required: ["allowed_privapp_com.android.car.dashcam"],
}

在 Make 中

dashcam.mk
PRODUCT_PACKAGES += \
    DashcamApp
PRODUCT_COPY_FILES :=\
vendor/[path-to-vendor-prebuilts]/apps/CarCatApp/allowed_privapp_com.android.car.dashcam:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/com.android.car.dashcam.xml \

创建一个名为 allowed_privapp_com.android.car.dashcam.xml 的权限文件

<permissions>
  <privapp-permissions package="com.android.car.dashcam.service">
      <permission name="" />
  </privapp-permissions>
  <privapp-permissions package="com.android.car.dashcam.app">
      <permission name="" />
  </privapp-permissions>
</permissions>

将清单中的权限添加到权限文件。

要了解详情,请参阅预构建到系统映像中。

侧载

权限文件也可以侧载。当未配置预构建的行车记录仪时,请使用此方法。

使用先前在预构建部分中创建的权限文件,运行

adb root
adb remount
adb push allowed_privapp_com.android.car.dashcam.xml /etc/permissions/allowed_privapp_com.android.car.dashcam.xml
adb shell chmod 644 /etc/permissions/allowed_privapp_com.android.car.dashcam.xml

配置叠加层

行车记录仪服务具有可叠加的配置。

服务配置

dashcam-service/res/values/config.xml

此文件包含服务的配置

  • allow_internal_storage 允许录制到内部存储空间
  • save_location 用于保存录制内容的目录名称。默认为行车记录仪
  • max_storage_mb 允许行车记录仪使用的最大存储空间
  • max_age_days 在修剪文件之前保留文件的最长时间
  • boot_startup_enabled 设备启动时启动行车记录仪服务
  • notifications_on 开始录制时显示通知
  • native_recorder 使用 NDK API,默认为 Java API
  • native_renderer 使用 NDK API,默认为 Java API
  • default_app_component 默认行车记录仪应用,此应用具有全局录制访问权限和全局触发访问权限
  • recording_module IRecordingModule 实现的 ComponentName
  • streaming_module IRecordingModule 实现的 ComponentName
  • trigger_module IRecordingModule 实现的 ComponentName

配置触发器

要触发配置,请运行

dashcam-service/src/assets/config.xml

此文件包含录制触发器的配置。触发器配置由两部分组成

  • 预滚 ID。摄像头的 ID,可以是 EVS 或 Camera2,具体取决于支持哪种。

  • prerollLengthMs 每次事件存储的预滚长度。

<Preroll>
  <Camera
      ID="0"
      prerollLengthMs="10000" />
</Preroll>

此示例显示了摄像头 ID 0,预滚为 10 秒。

  • name 唯一的触发器名称

  • camera 摄像头的 ID,可以是 EVS 或 Camera2,具体取决于支持哪种

  • sensorPropertyID 传感器的 ID

  • description UI 中显示的触发器说明

  • recordingLengthMs 事件发生后要录制的时长(以毫秒为单位)。

  • sensorType 传感器类型。选项包括 VHALSENSOR_MANAGER

  • sensorValueType 传感器生成的数据类型。选项包括 INTINT_ARRAYFLOATFLOAT_ARRAY 以及 BOOLEAN, STRING

  • thresholdType 如何评估传感器值。选项包括 AVERAGEBOOLEANEQUALSLEAPLEAP_AVERAGELEAP_OVERPEAKPEAK_HOLD

  • thresholdValue 要使用阈值类型与传感器值进行比较的值

  • thresholdExtra 某些阈值类型所需的额外值,例如 AVERAGE 的范围

  • triggerCooldown 此类型事件再次触发之前的冷却时间(以毫秒为单位)。

<EventTriggers>
  <EventTrigger
      name="AEB"
      camera="1 2"
      sensorPropertyID="289411073"
      description="Automatic Emergency Braking"
      recordingLengthMs="20000"
      sensorType="VHAL"
      sensorValueType="INT"
      thresholdType="EQUALS"
      thresholdValue="2"
      triggerCooldown="5000"/>
</EventTriggers>

此示例显示了一个 VHAL 传感器,它生成整数值,我们将相等性与阈值进行比较。当满足相等性条件时,触发器会在摄像头 1 和 2 上录制。

<EventTrigger
            name="SPEED"
            camera="1 2 3 4"
            sensorPropertyID="291504648"
            description="Over speed"
            recordingLengthMs="10000"
            sensorType="VHAL"
            sensorValueType="FLOAT"
            thresholdType="AVERAGE"
            thresholdValue="20.0"
            thresholdExtra="1000"
            triggerCooldown="2000"/>

此示例显示了一个 VHAL 传感器,它生成浮点值,我们根据样本范围评估平均值与阈值的比较结果。样本范围在 thresholdExtra 中设置

模块

行车记录仪服务由三个模块组成

  • 包含处理来自摄像头的流的逻辑。

  • 录制包含处理录制的逻辑。

  • 触发器包含从传感器数据触发录制的逻辑。模块 API 在其对应的接口 IStreamModuleIRecorderModuleITriggerModule 中定义,并通过 DashcamServiceAPI 公开给 DashcamManager

叠加模块

行车记录仪服务使用 dashcam-service/res/values/config.xml 来确定在何处查找模块实现。我们为每个模块提供默认实现。但是,可以通过在相应的配置值中设置组件来叠加每个模块。

  • 将 OEM 实现组件名称 IRecorderModule 设置为 recording_module

  • 将 OEM 实现组件名称 IStreamModule 设置为流式传输模块。

  • 将 OEM 实现组件名称 ITriggerModule 设置为 trigger_module

    在运行时,行车记录仪服务会实例化 config.xml 中为每个模块设置的组件名称。

应用开发者指南

行车记录仪是一种已投入生产可自定义的行车记录仪解决方案。行车记录仪使用 Dashcam Manager API 与 Dashcam service 通信。Dashcam Manager API 可以在 IDashcamManager 中找到。任何具有所需权限的应用都可以使用 Dashcam Manager。

权限

支持 Camera2 和 EVS。

预构建

授予这些权限最简单的方法是使用 Blueprint 或 Make 将它们包含在预构建设置中。

OverlayUI

可以使用运行时资源叠加自定义应用。要了解详情,请参阅运行时资源叠加。要查看可叠加元素的列表,请参阅overlayable.xml

扩展触发器

可以使用对 DashcamManager.addTrigger() 的调用为当前会话扩展触发器。添加的触发器仅在当前会话中持续存在。

自动启动

不支持自动启动录制。但是,可以使用对 DashcamManager.startRecording() 的调用在 onBoot 时启动手动触发器

最佳实践

  • 存储。强烈建议使用外部可移动存储设备。

  • 用户体验。将行车记录仪应用的 UI 设计为直观且用户友好,并遵循 AAOS 设计指南。

  • 性能优化。优化应用的性能,以最大限度地减少资源使用,并确保在 AAOS 中平稳运行。

问题排查

  • 摄像头连接问题。AAOS IVI 中必须支持和提供 EVS 或 Camera2。

  • 存储错误。验证可用存储空间并管理录制内容。强烈建议使用外部存储设备,因为使用内部存储设备可能会过早导致存储设备磨损。