Приложение Dashcam разработано для интеграции с AAOS, предоставляя водителям возможности видеозаписи для повышения безопасности. В этом руководстве описаны технические требования, этапы интеграции и рекомендации для успешного внедрения.
Предпосылки
Прежде чем продолжить, убедитесь, что выполнены следующие предварительные условия:
SDK:
- Требуется SDK 31 или выше.
Аппаратное обеспечение:
- Камеры EVS или Camera2 доступны для AAOS.
- Достаточное внутреннее хранилище или поддержка съемного внешнего хранилища
должны быть доступны для видеозаписи.
Требования к программному обеспечению:
- Поддержка отдельных приложений. Подробнее см. в разделе «Разделённые приложения» .
- Разрешения. Для работы видеорегистратора требуются системные разрешения.
Получить исходный код
Видеорегистратор входит в состав отдельных приложений AAOS. Чтобы ознакомиться с отдельным кодом, см. раздел «Проверить код» .
Просмотрите исходный код с помощью Android Code Search .
Исходный код предоставлен в следующих трех модулях:
- Сервис видеорегистраторов. Логика потоковой передачи, записи и запуска.
- Менеджер видеорегистраторов. Подключается к сервису видеорегистраторов и предоставляет клиентам стабильный API.
- Приложение Dashcam. Приложение Dashcam, использующее API Dashcam Manager.

Сборка видеорегистратора
Используйте Soong или Gradle для сборки Dashcam.
Сунг
О Сунге:
mma DashcamService DashcamManager-lib DashcamApp
APK-файлы находятся в out/target/product/[lunch-target]/system/priv-app/
Грейдл
На Gradle:
./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble
APK-файлы находятся в out/aaos-apps-gradle-build/
Подробные инструкции по сборке Dashcam с помощью Gradle приведены в файле README .
Разрешения
Для работы сервиса Dashcam и приложения Dashcam требуются некоторые системные разрешения.
Самый простой способ предоставить эти разрешения — включить их в готовую настройку с помощью 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,
}
В марке:
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>
Добавьте разрешения из Манифеста в файл разрешений.
Перед использованием видеорегистратора предоставьте Camera2 разрешения службе видеорегистратора, как показано в AAOS Camera .
Добавьте файл предварительно предоставленных разрешений в файл Blueprint или 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,
}
Дополнительную информацию см. в разделах Интеграция предварительной сборки в образ системы и Добавление белого списка .
Боковая загрузка
Файл разрешений также можно загрузить из стороннего источника. Используйте этот метод, если предустановленная видеорегистратор не настроена.
Используя файл разрешений, созданный ранее в разделе prebuilds, выполните:
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 имеет накладываемые конфигурации.
Конфигурация сервиса
dashcam-service/res/values/config.xml
Этот файл содержит конфигурации для сервиса:
-
config_fileИмя файла конфигурации триггера в/assets -
allow_internal_storageРазрешить сохранение записей во внутреннем хранилище -
boot_startup_enabledЗапуск службы видеорегистратора при загрузке устройства -
notifications_onПоказывать уведомления при начале записи -
default_app_componentПриложение для видеорегистраторов по умолчанию, имеющее глобальный доступ к записям и глобальный доступ к триггерам. - Компонент
recording_moduleИмя реализацииIRecordingModule -
streaming_moduleКомпонент Имя реализацииIStreamingModule -
trigger_moduleКомпонент Имя реализацииITriggerModule
Конфигурация триггера
Чтобы настроить триггеры записи, создайте копию:
dashcam-service/src/assets/config.xml
и добавьте его в каталог ресурсов. Укажите этот файл в элементе config_file файла конфигурации сервиса.
Конфигурация триггера состоит из частей хранилища, камеры и триггера:
Хранилище
Конфигурация хранилища состоит из следующих элементов:
maxStorageUsagePercentМаксимальный процент доступной памяти, которую видеорегистратор использует перед обрезкой записей.maxStorageUsageMegabytesМаксимальный объем памяти в мегабайтах, который видеорегистратор использует перед обрезкой записей.maxAgeHoursBeforePruneмаксимальное количество часов до удаления записи. Запись может быть удалена раньше, если достигнуты ограничения по объёму хранилища.
Камера
Конфигурация камеры состоит из следующих элементов:
Идентификатор камеры. Идентификатор камеры с префиксом камеры.
prerollLengthMsДлина преролла, сохраняемая с каждым событием.widthНеобязательная ширина буфера, возвращаемого камерой.heightНеобязательная высота буфера, возвращаемого камерой.
<CameraConfig>
<Camera
ID="EVS:1"
prerollLengthMs="10000"
width="1920"
height="1080" />
<Camera
ID="Camera2:1"
prerollLengthMs="10000" />
</CameraConfig>
В этом примере показан идентификатор камеры EVS:1 с 10-секундной предварительной подмоткой при разрешении 1080p и идентификатор камеры Camera2:1 с 10-секундной предварительной подмоткой и шириной и высотой по умолчанию.
Курок
Конфигурация триггера состоит из списка триггеров, определяемых следующим образом:
nameУникальное имя триггера.идентификаторы
cameras.sensorPropertyID— идентификатор датчика с префиксом, соответствующим группе датчиков. Возможные префиксы:VHALилиSENSOR_MANAGER.descriptionОписание триггера, отображаемое в пользовательском интерфейсе.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, выдающего значения с плавающей точкой. TriggerModule сравнивает среднее значение датчика в диапазоне из 10 выборок с пороговым значением 20.0 . Диапазон выборок задаётся в thresholdExtra . Новое событие может быть инициировано только каждые 2000 миллисекунд, как задано в triggerCooldown .
Модули
Сервис Dashcam состоит из трех модулей:
Stream содержит логику обработки потоков с камер.
Запись содержит логику обработки записей.
Trigger содержит логику запуска записи на основе данных датчика. API модуля определены в соответствующих интерфейсах
IStreamModule,IRecorderModuleиITriggerModuleи доступныDashcamManagerчерезDashcamServiceAPI.
Модули наложения
Сервис Dashcam использует dashcam-service/res/values/config.xml для определения местонахождения реализаций модулей. Для каждого модуля предусмотрены реализации по умолчанию. Однако каждый модуль можно перекрыть, указав его компонент в соответствующем значении конфигурации.
Задайте имя компонента реализации OEM:
-
IRecorderModuleвrecording_module -
IStreamModuleдляstreaming_module -
ITriggerModuleвtrigger_module
Во время выполнения служба Dashcam создает экземпляр имени компонента, заданного в config.xml для каждого модуля.
Руководство разработчика приложений
Dashcam — это готовое к использованию и настраиваемое решение для видеорегистраторов. Dashcam использует API Dashcam Manager для взаимодействия с Dashcam service . API Dashcam Manager можно найти на сайте IDashcamManager . Любое приложение с необходимыми разрешениями может использовать Dashcam Manager.
Оверлейный интерфейс
Приложение можно настраивать с помощью наложений ресурсов времени выполнения. Подробнее см. в разделе «Наложения ресурсов времени выполнения» . Список накладываемых элементов см. в файле overlayable.xml .
Расширить триггеры
Триггеры можно расширить для текущего сеанса с помощью вызова DashcamManager#addTrigger() . Добавленные триггеры сохраняются только для текущего сеанса.
Автозапуск
Автоматический запуск записи не поддерживается. Однако можно запустить запись вручную onBoot вызвав DashcamManager.startRecording()
Лучшие практики
Хранилище. Настоятельно рекомендуется использовать внешний съёмный накопитель.
Пользовательский интерфейс. Разработайте интуитивно понятный и удобный пользовательский интерфейс приложения Dashcam в соответствии с рекомендациями AAOS.
Оптимизация производительности. Оптимизируйте производительность приложения, чтобы минимизировать потребление ресурсов и обеспечить бесперебойную работу в AAOS.
Поиск неисправностей
Проблемы с подключением камеры. EVS или Camera2 должны поддерживаться и быть доступны в AAOS IVI.
Ошибки хранилища. Проверьте доступное место на диске и управляйте записями. Настоятельно рекомендуется использовать внешнее хранилище, поскольку использование внутреннего хранилища может привести к преждевременному износу.