대시캠 통합

대시캠 앱은 AAOS와 통합되도록 설계되어 운전자에게 향상된 안전과 보안을 위한 동영상 녹화 기능을 제공합니다. 이 가이드에서는 성공적인 구현을 위한 기술 요구사항, 통합 단계, 권장사항을 간략히 설명합니다.

기본 요건

계속하기 전에 다음 기본 요건을 충족하는지 확인하세요.

SDK:

  • SDK 31 이상이 필요합니다.

하드웨어:

  • AAOS에서 사용할 수 있는 EVS 또는 Camera2 카메라
  • 동영상을 녹화하려면 충분한 내부 저장용량 또는 탈착식 외부 저장소 지원이
    있어야 합니다.

소프트웨어 요구사항:

  • 번들 해제된 지원 자세한 내용은 번들 해제된 앱을 참고하세요.
  • 권한. 대시캠에는 시스템 권한이 필요합니다.

소스 코드 가져오기

Dashcam은 AAOS 번들로 묶이지 않은 앱의 일부입니다. 번들로 묶이지 않은 코드를 체크아웃하려면 코드 체크아웃을 참고하세요.

Android 코드 검색으로 소스 코드를 탐색합니다.

소스 코드는 다음 세 모듈에 제공됩니다.

  • Dashcam 서비스. 스트리밍, 녹음, 트리거 로직
  • Dashcam Manager Dashcam 서비스에 연결하고 클라이언트에 안정적인 API를 노출합니다.
  • Dashcam 앱. Dashcam Manager API를 사용하는 Dashcam 애플리케이션 참조

아키텍처 다이어그램

대시캠 빌드

Soong 또는 Gradle을 사용하여 Dashcam을 빌드합니다.

Soong

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을 사용하여 Dashcam을 빌드하는 방법에 관한 자세한 안내는 README 파일에 나와 있습니다.

권한

대시캠 서비스와 대시캠 앱에는 여러 시스템 권한이 필요합니다.

이러한 권한을 부여하는 가장 간단한 방법은 Blueprint 또는 Make를 사용하여 사전 빌드된 설정에 권한을 포함하는 것입니다.

청사진에서:

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

prebuilt_etc {
    name: "allowed_privapp_com.android.car.dashcam",
    sub_dir: "default-permissions",
    src: "allowed_privapp_com.android.car.dashcam.xml",
    filename_from_src: true,
}

Make:

dashcam.mk
PRODUCT_PACKAGES += \
    DashcamApp
PRODUCT_COPY_FILES :=\
vendor/[path-to-vendor-prebuilts]/apps/Dashcam/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>

매니페스트의 권한을 권한 파일에 추가합니다.

대시캠을 사용하기 전에 AAOS 카메라에 표시된 대로 대시캠 서비스에 Camera2 권한을 사전 부여합니다.

권한 파일과 동일한 방식으로 사전 부여된 권한 파일을 블루프린트 또는 Make 파일에 추가합니다.

pre-grant-permissions-com.android.car.dashcam.xml에서:

<exceptions>
    <exception package="com.android.car.dashcam.service">
        <permission name="android.permission.CAMERA" fixed="false" />
        <permission name="android.permission.SYSTEM_CAMERA" fixed="false" />
        <permission name="android.permission.CAMERA_HEADLESS_SYSTEM_USER" fixed="false" />
    </exception>
</exceptions>

Android.bp에서:

...
required["pre-grant-permissions-com.android.car.dashcaml"]
...

prebuilt_etc {
    name: "pre-grant-permissions-com.android.car.dashcaml",
    sub_dir: "default-permissions",
    src: "pre-grant-permissions-com.android.car.dashcam.xml",
    filename_from_src: true,
}

자세한 내용은 사전 빌드를 시스템 이미지에 통합허용 목록 추가를 참고하세요.

사이드로드

권한 파일은 사이드로드할 수도 있습니다. 사전 빌드된 Dashcam이 구성되지 않은 경우 이 메서드를 사용합니다.

이전에 사전 빌드 섹션에서 만든 권한 파일을 사용하여 다음을 실행합니다.

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

etc/default-permissions/와 유사한 방식으로 사전 부여 권한 파일을 추가합니다.

오버레이 구성

대시캠 서비스에 오버레이 가능한 구성이 있습니다.

서비스 구성

dashcam-service/res/values/config.xml

이 파일에는 서비스의 구성이 포함되어 있습니다.

  • config_file /assets의 트리거 구성 파일 이름
  • allow_internal_storage 녹음 파일이 내부 저장소에 저장되도록 허용
  • boot_startup_enabled 기기 부팅 시 대시캠 서비스 시작
  • notifications_on 녹음 시작 시 알림 표시
  • default_app_component 전 세계 녹화 액세스 권한과 전 세계 트리거 액세스 권한이 있는 기본 대시카메라 앱
  • recording_module IRecordingModule 구현의 ComponentName
  • streaming_module IStreamingModule 구현의 ComponentName
  • trigger_module ITriggerModule 구현의 ComponentName

트리거 구성

녹화 트리거를 구성하려면 다음의 사본을 만드세요.

dashcam-service/src/assets/config.xml

애셋 디렉터리에 추가합니다. 서비스 구성 파일의 config_file 요소에서 이 파일을 가리킵니다.

트리거 구성은 저장소, 카메라, 트리거 부분으로 구성됩니다.

저장용량

저장소 구성에는 다음 요소가 포함됩니다.

  • maxStorageUsagePercent 녹화 파일을 프루닝하기 전에 대시캠에서 사용할 수 있는 최대 스토리지 비율입니다.

  • maxStorageUsageMegabytes 녹화 파일을 자르기 전에 대시카메라에서 사용하는 최대 스토리지 용량(MB)입니다.

  • maxAgeHoursBeforePrune 녹화 파일이 프루닝되기 전 최대 시간입니다. 저장용량 한도가 충족되면 녹화 파일이 더 일찍 잘릴 수 있습니다.

카메라

카메라 구성에는 다음 요소가 포함됩니다.

  • 카메라 ID 카메라 접두사가 있는 카메라 ID입니다.

  • prerollLengthMs 각 이벤트와 함께 저장할 프리롤의 길이입니다.

  • width 카메라에서 반환된 버퍼의 선택적 너비입니다.

  • height 카메라에서 반환하는 버퍼의 선택적 높이입니다.

<CameraConfig>
  <Camera
      ID="EVS:1"
      prerollLengthMs="10000"
      width="1920"
      height="1080" />
  <Camera
      ID="Camera2:1"
      prerollLengthMs="10000" />
</CameraConfig>

이 예에서는 1080p로 10초의 프리롤이 있는 카메라 ID EVS:1과 10초의 프리롤과 기본 너비 및 높이가 있는 카메라 ID Camera2:1을 보여줍니다.

트리거

트리거 구성은 다음으로 정의된 트리거 목록으로 구성됩니다.

  • name 고유한 트리거 이름입니다.

  • cameras 카메라의 ID입니다.

  • 센서 그룹이 접두사로 추가된 센서의 sensorPropertyID ID입니다. 접두사 옵션은 VHAL 또는 SENSOR_MANAGER입니다.

  • description UI에 표시되는 트리거에 대한 설명입니다.

  • recordingLengthMs 이벤트 후 기록할 시간(밀리초)입니다.

  • sensorValueType 센서에서 생성된 데이터 유형입니다. 옵션은 INT, INT_ARRAY, FLOAT, FLOAT_ARRAY, BOOLEAN, STRING입니다.

  • thresholdType thresholdValue에 대해 센서 값을 평가하는 방법입니다. 옵션은 AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAK, PEAK_HOLD입니다.

  • thresholdValue 센서 값과 비교된 값입니다.

  • thresholdExtra 일부 기준점 유형(예: AVERAGE의 범위)에 필요한 추가 값입니다.

  • triggerCooldown 이 유형의 다른 이벤트를 실행하기 전에 대기하는 시간(밀리초)입니다.

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

이 예에서는 TriggerModule가 정수 값을 생성하는 VHAL 센서를 모니터링하는 트리거를 보여줍니다. TriggerModule는 기준 값과 등식을 비교합니다. 등식 조건이 충족되면 트리거가 EVS 카메라 1과 2에 녹화합니다.

<EventTrigger
            name="SPEED"
            cameras="Camera2:0, Camera2:1,  Camera2:2,  Camera2:3"
            sensorPropertyID="VHAL:291504648"
            description="Over speed"
            recordingLengthMs="10000"
            sensorValueType="FLOAT"
            thresholdType="AVERAGE"
            thresholdValue="20.0"
            thresholdExtra="10"
            triggerCooldown="2000"/>

이 예에서는 TriggerModule가 부동 소수점 값을 생성하는 VHAL 센서를 모니터링하는 트리거를 보여줍니다. TriggerModule10개 범위의 샘플에 대한 센서 평균을 20.0의 임곗값과 비교합니다. 샘플 범위는 thresholdExtra에 설정됩니다. 새 이벤트는 triggerCooldown에 설정된 2000밀리초마다만 트리거될 수 있습니다.

모듈

Dashcam 서비스는 다음 세 가지 모듈로 구성됩니다.

  • Stream에는 카메라의 스트림을 처리하는 로직이 포함되어 있습니다.

  • Recording에는 녹화 파일을 처리하는 로직이 포함되어 있습니다.

  • 트리거에는 센서 데이터에서 녹화를 트리거하는 로직이 포함되어 있습니다. 모듈 API는 상응하는 인터페이스인 IStreamModule, IRecorderModule, ITriggerModule에 정의되고 DashcamServiceAPI를 통해 DashcamManager에 노출됩니다.

오버레이 모듈

Dashcam 서비스는 dashcam-service/res/values/config.xml를 사용하여 모듈 구현을 찾을 위치를 결정합니다. 각 모듈에 기본 구현이 제공됩니다. 그러나 각 모듈은 상응하는 구성 값에서 구성요소를 설정하여 오버레이할 수 있습니다.

다음의 OEM 구현 구성요소 이름을 설정합니다.

  • IRecorderModule~recording_module
  • IStreamModule~streaming_module
  • ITriggerModule~trigger_module

런타임 시 Dashcam 서비스는 각 모듈의 config.xml에 설정된 구성요소 이름을 인스턴스화합니다.

앱 개발자 가이드

Dashcam은 프로덕션에 즉시 사용 가능한 맞춤설정이 가능한 대시캠 솔루션입니다. Dashcam은 Dashcam Manager API를 사용하여 Dashcam service와 통신합니다. Dashcam Manager API는 IDashcamManager에서 확인할 수 있습니다. 필요한 권한이 있는 모든 앱은 Dashcam Manager를 사용할 수 있습니다.

OverlayUI

런타임 리소스 오버레이로 앱을 맞춤설정할 수 있습니다. 자세한 내용은 런타임 리소스 오버레이를 참고하세요. 오버레이 가능한 요소 목록을 보려면 overlayable.xml을 참고하세요.

트리거 연장

DashcamManager#addTrigger()를 호출하여 현재 세션의 트리거를 연장할 수 있습니다. 추가된 트리거는 현재 세션 동안만 유지됩니다.

자동 시작

녹화 자동 시작은 지원되지 않습니다. 그러나 수동 트리거는 DashcamManager.startRecording() 호출을 통해 onBoot 시작할 수 있습니다.

권장사항

  • 저장용량. 외부 이동식 저장소를 사용하는 것이 좋습니다.

  • 사용자 환경 AAOS 디자인 가이드라인을 준수하여 직관적이고 사용자 친화적으로 대시캠 앱의 UI를 디자인합니다.

  • 성능 최적화 앱 성능을 최적화하여 리소스 사용을 최소화하고 AAOS에서 원활하게 작동하도록 합니다.

문제 해결

  • 카메라 연결 문제 EVS 또는 Camera2가 AAOS IVI에서 지원되고 사용 가능해야 합니다.

  • 저장소 오류. 사용 가능한 저장용량을 확인하고 녹화 파일을 관리합니다. 내부 저장소를 사용하면 저장소가 조기에 마모될 수 있으므로 외부 저장소를 사용하는 것이 좋습니다.