대시캠 앱은 AAOS와 통합되도록 설계되어 운전자에게 안전과 보안을 강화하는 동영상 녹화 기능을 제공합니다. 이 가이드에서는 성공적인 구현을 위해 필요한 기술 요구사항, 통합 단계, 권장사항을 설명합니다.
기본 요건
계속하기 전에 다음 사전 조건을 충족하는지 확인하세요.
SDK:
- SDK 31 이상이 필요합니다.
하드웨어:
- AAOS에서 사용할 수 있는 EVS 또는 Camera2 카메라
- 동영상 녹화에는 충분한 내부 저장공간이나 이동식 외부 저장소 지원이 있어야 합니다.
소프트웨어 요구사항:
- 번들 해제된 지원. 자세한 내용은 번들 해제된 앱을 참고하세요.
- 권한. 대시캠에는 시스템 권한이 필요합니다.
소스 코드 가져오기
블랙박스는 AAOS 번들로 묶이지 않은 앱의 일부입니다. 번들로 묶이지 않은 코드를 체크아웃하려면 코드 체크아웃을 참고하세요.
Android 코드 검색으로 소스 코드를 찾아봅니다.
소스 코드는 다음 세 모듈에서 제공됩니다.
- 대시캠 서비스. 스트리밍, 녹화, 트리거링 로직
- 블랙박스 관리자. 대시캠 서비스에 연결하고 클라이언트에 안정적인 API를 노출합니다.
- 블랙박스 앱. 블랙박스 관리자 API를 사용하여 블랙박스 애플리케이션을 참조합니다.
대시캠 빌드
Soong 또는 Gradle을 사용하여 블랙박스를 빌드합니다.
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로 블랙박스를 빌드하는 자세한 안내는 README 파일에 제공됩니다.
권한
대시캠 서비스와 대시캠 앱에는 여러 시스템 권한이 필요합니다.
이러한 권한을 부여하는 가장 간단한 방법은 청사진이나 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,
}
자세한 내용은 사전 빌드를 시스템 이미지에 통합 및 허용 목록 추가를 참고하세요.
사이드로드
권한 파일은 사이드로드할 수도 있습니다. 사전 빌드된 블랙박스가 구성되지 않은 경우 이 메서드를 사용합니다.
이전에 미리 빌드 섹션에서 만든 권한 파일을 사용하여 다음을 실행합니다.
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전역 녹화 액세스 및 전역 트리거 액세스 권한이 있는 기본 블랙박스 앱IRecordingModule구현의recording_moduleComponentNameIStreamingModule구현의streaming_moduleComponentNameITriggerModule구현의trigger_moduleComponentName
트리거 구성
녹화 트리거를 구성하려면 다음 항목의 사본을 만드세요.
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을 보여줍니다.
Trigger
트리거 구성은 다음으로 정의된 트리거 목록으로 구성됩니다.
name고유한 트리거 이름입니다.cameras카메라의 ID입니다.sensorPropertyID센서 그룹이 앞에 붙은 센서 ID입니다. 접두사 옵션은VHAL또는SENSOR_MANAGER입니다.descriptionUI에 표시되는 트리거에 대한 설명입니다.recordingLengthMs이벤트 후 기록할 기간(밀리초)입니다.sensorValueType센서에서 생성된 데이터 유형입니다. 옵션은INT,INT_ARRAY,FLOAT,FLOAT_ARRAY,BOOLEAN, STRING입니다.thresholdTypethresholdValue에 대해 센서 값을 평가하는 방법 옵션은AVERAGE,BOOLEAN,EQUALS,LEAP,LEAP_AVERAGE,LEAP_OVER,PEAK,PEAK_HOLD입니다.thresholdValue센서 값과 비교되는 값입니다.thresholdExtraAVERAGE의 범위와 같은 일부 기준점 유형에 필요한 추가 값입니다.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>
이 예에서는 정수 값을 생성하는 VHAL 센서를 모니터링하는 트리거를 보여줍니다.TriggerModule
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 센서를 모니터링하는 트리거를 보여줍니다.
TriggerModule는 10 샘플 범위의 센서 평균을 20.0의 기준값과 비교합니다.
샘플 범위는 thresholdExtra로 설정됩니다. 새 이벤트는 triggerCooldown에 설정된 대로 2000밀리초마다 한 번만 트리거할 수 있습니다.
모듈
블랙박스 서비스는 다음 세 가지 모듈로 구성됩니다.
Stream에는 카메라의 스트림을 처리하는 로직이 포함되어 있습니다.
Recording에는 녹화 처리를 위한 로직이 포함되어 있습니다.
트리거에는 센서 데이터에서 녹화를 트리거하는 로직이 포함되어 있습니다. 모듈 API는 해당 인터페이스
IStreamModule,IRecorderModule,ITriggerModule에 정의되어 있으며DashcamServiceAPI를 통해DashcamManager에 노출됩니다.
오버레이 모듈
블랙박스 서비스는 dashcam-service/res/values/config.xml을 사용하여 모듈 구현을 찾을 위치를 결정합니다. 각 모듈에 기본 구현이 제공됩니다. 하지만 각 모듈은 해당 구성 값에 구성요소를 설정하여 오버레이할 수 있습니다.
다음의 OEM 구현 구성요소 이름을 설정합니다.
IRecorderModule~recording_moduleIStreamModule~streaming_moduleITriggerModule~trigger_module
런타임에 블랙박스 서비스는 각 모듈의 config.xml에 설정된 구성요소 이름을 인스턴스화합니다.
앱 개발자 가이드
대시캠은 프로덕션에 즉시 사용 가능하고 맞춤설정 가능한 대시캠 솔루션입니다. 블랙박스는 블랙박스 관리자 API를 사용하여 Dashcam service와 통신합니다. 블랙박스 관리자 API는 IDashcamManager에서 확인할 수 있습니다. 필요한 권한이 있는 앱은 블랙박스 관리자를 사용할 수 있습니다.
OverlayUI
앱은 런타임 리소스 오버레이로 맞춤설정할 수 있습니다. 자세한 내용은 런타임 리소스 오버레이를 참고하세요. 오버레이 가능한 요소 목록을 보려면 overlayable.xml을 참고하세요.
트리거 확장
DashcamManager#addTrigger() 호출을 통해 현재 세션의 트리거를 확장할 수 있습니다. 추가된 트리거는 현재 세션에서만 유지됩니다.
자동 시작
자동 녹화 시작은 지원되지 않습니다. 하지만 수동 트리거는 DashcamManager.startRecording() 호출로 onBoot를 시작할 수 있습니다.
권장사항
저장용량. 외부 이동식 저장소를 사용하는 것이 좋습니다.
사용자 환경 AAOS 디자인 가이드라인을 준수하여 블랙박스 앱의 UI를 직관적이고 사용자 친화적으로 설계합니다.
성능 최적화 리소스 사용을 최소화하고 AAOS에서 원활한 작동을 보장하도록 앱의 성능을 최적화합니다.
문제 해결
카메라 연결 문제 EVS 또는 Camera2가 AAOS IVI에서 지원되고 제공되어야 합니다.
스토리지 오류. 사용 가능한 저장용량을 확인하고 녹화 콘텐츠를 관리합니다. 내부 저장소를 사용하면 저장소가 조기에 마모될 수 있으므로 외부 저장소를 사용하는 것이 좋습니다.