Tích hợp Dashcam

Ứng dụng Dashcam được thiết kế để tích hợp với AAOS, cung cấp cho người lái xe các tính năng quay video để tăng cường an toàn và bảo mật. Hướng dẫn này trình bày các yêu cầu kỹ thuật, bước tích hợp và các phương pháp hay nhất để đảm bảo triển khai thành công.

Điều kiện tiên quyết

Trước khi tiếp tục, hãy đảm bảo bạn đã đáp ứng các điều kiện tiên quyết sau:

SDK:

  • Yêu cầu SDK 31 trở lên.

Phần cứng:

  • Máy ảnh EVS hoặc Camera2 có sẵn cho AAOS.
  • Thiết bị phải có đủ bộ nhớ trong hoặc hỗ trợ bộ nhớ ngoài có thể tháo rời
    để quay video.

Yêu cầu về phần mềm:

  • Hỗ trợ không theo gói. Để tìm hiểu thêm, hãy xem phần Ứng dụng không theo gói.
  • Quyền. Dashcam cần có quyền truy cập hệ thống.

Tải mã nguồn

Tìm mã nguồn trong Android Code Search tại:

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

Mã nguồn được cung cấp trong 3 mô-đun sau:

  • Dịch vụ camera hành trình. Logic phát trực tuyến, ghi và kích hoạt.
  • Trình quản lý camera hành trình. Kết nối với Dịch vụ camera hành trình và hiển thị một API ổn định cho ứng dụng
  • Ứng dụng Dashcam. Tham khảo ứng dụng Dashcam bằng cách sử dụng API Trình quản lý Dashcam

Sơ đồ cấu trúc

Xây dựng Dashcam

Sử dụng Soong hoặc Gradle để tạo Dashcam.

Soong

Trước khi tạo bản dựng từ Soong, hãy nhớ dọn sạch các thư mục .cxx.

Trên Soong:

mma DashcamService DashcamManager-lib DashcamApp

Các tệp APK nằm trong out/target/product/[lunch-target]/system/priv-app/

Gradle

Trên Gradle:

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

Các tệp APK nằm trong out/aaos-apps-gradle-build/

Hướng dẫn chi tiết về cách tạo Dashcam bằng Gradle được cung cấp trong tệp README.

Quyền

Dịch vụ Dashcam và Ứng dụng Dashcam cần có một số quyền của hệ thống.

Cách đơn giản nhất để cấp các quyền này là đưa các quyền đó vào một chế độ thiết lập tạo sẵn bằng cách sử dụng Blueprint hoặc Make.

Trong Blueprint:

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

Trong 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 \

Tạo tệp quyền có tên allowed_privapp_com.android.car.dashcam.xml:

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

Thêm quyền từ Tệp kê khai vào tệp quyền.

Để tìm hiểu thêm, hãy xem phần Tạo sẵn vào hình ảnh hệ thống.

Cài đặt không qua cửa hàng ứng dụng

Bạn cũng có thể cài đặt tệp quyền không qua cửa hàng. Sử dụng phương thức này khi bạn chưa định cấu hình Dashcam tạo sẵn.

Sử dụng tệp quyền đã tạo trong phần tạo sẵn trước đó, hãy chạy:

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

Định cấu hình lớp phủ

Dịch vụ camera hành trình có các cấu hình có thể phủ lên nhau.

Cấu hình dịch vụ

dashcam-service/res/values/config.xml

Tệp này chứa cấu hình cho dịch vụ:

  • allow_internal_storage Cho phép ghi âm vào bộ nhớ trong
  • save_location Tên thư mục để lưu bản ghi. Mặc định là camera hành trình
  • max_storage_mb Dung lượng lưu trữ cho phép camera hành trình sử dụng
  • max_age_days Khoảng thời gian giữ lại một tệp trước khi cắt bớt
  • boot_startup_enabled Dịch vụ Dashcam khởi động khi thiết bị khởi động
  • notifications_on Hiện thông báo khi bắt đầu ghi
  • native_recorder Sử dụng API NDK, mặc định là API Java
  • native_renderer Sử dụng API NDK, mặc định là API Java
  • default_app_component Ứng dụng camera hành trình mặc định, ứng dụng này có quyền truy cập vào bản ghi toàn cầu và quyền truy cập vào trình kích hoạt toàn cầu
  • recording_module ComponentName của quá trình triển khai IRecordingModule
  • streaming_module ComponentName của quá trình triển khai IRecordingModule
  • trigger_module ComponentName của quá trình triển khai IRecordingModule

Định cấu hình điều kiện kích hoạt

Để kích hoạt cấu hình, hãy chạy:

dashcam-service/src/assets/config.xml

Tệp này chứa cấu hình để ghi lại các trình kích hoạt. Cấu hình trình kích hoạt bao gồm hai phần:

  • Mã quảng cáo trước video. Mã nhận dạng của máy ảnh EVS hoặc Camera2 tuỳ thuộc vào nội dung được hỗ trợ.

  • prerollLengthMs Thời lượng của quảng cáo trước khi phát được lưu trữ cùng với mỗi sự kiện.

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

Ví dụ này cho thấy mã máy ảnh 0 với quảng cáo trước video dài 10 giây.

  • name Tên trình kích hoạt duy nhất

  • camera Mã nhận dạng của máy ảnh EVS hoặc Camera2 tuỳ thuộc vào tính năng được hỗ trợ

  • sensorPropertyID Mã nhận dạng của cảm biến

  • description Nội dung mô tả về điều kiện kích hoạt xuất hiện trong giao diện người dùng

  • recordingLengthMs Thời lượng sau sự kiện cần ghi lại, tính bằng mili giây.

  • sensorType Loại cảm biến. Các tuỳ chọn là VHAL hoặc SENSOR_MANAGER

  • sensorValueType Loại dữ liệu do cảm biến tạo ra. Các tuỳ chọn là INT, INT_ARRAY, FLOAT, FLOAT_ARRAYBOOLEAN, STRING

  • thresholdType Cách đánh giá giá trị cảm biến. Các tuỳ chọn là AVERAGE, BOOLEAN, EQUALS, LEAP, LEAP_AVERAGE, LEAP_OVER, PEAKPEAK_HOLD

  • thresholdValue Giá trị để so sánh giá trị cảm biến với loại ngưỡng

  • thresholdExtra Cần có giá trị bổ sung cho một số loại ngưỡng, chẳng hạn như phạm vi cho AVERAGE

  • triggerCooldown Thời gian chờ trước khi kích hoạt một sự kiện khác thuộc loại này trong mili giây.

<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>

Ví dụ này cho thấy một cảm biến VHAL tạo ra các giá trị số nguyên, trong đó chúng ta so sánh giá trị bằng với giá trị ngưỡng. Khi điều kiện bằng nhau được đáp ứng, một điều kiện kích hoạt sẽ ghi lại trên camera 1 và 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"/>

Ví dụ này cho thấy một cảm biến VHAL tạo ra các giá trị float, trong đó chúng ta đánh giá giá trị trung bình trên một phạm vi mẫu so với giá trị ngưỡng. Phạm vi mẫu được đặt trong thresholdExtra

Mô-đun

Dịch vụ Dashcam bao gồm 3 mô-đun:

  • Luồng chứa logic để xử lý luồng từ máy ảnh.

  • Bản ghi chứa logic để xử lý bản ghi.

  • Trigger (Kích hoạt) chứa logic để kích hoạt bản ghi từ dữ liệu cảm biến. Các API mô-đun được xác định trong các giao diện tương ứng, IStreamModule, IRecorderModuleITriggerModule, đồng thời được hiển thị cho DashcamManager thông qua DashcamServiceAPI

Mô-đun lớp phủ

Dịch vụ Dashcam sử dụng dashcam-service/res/values/config.xml để xác định vị trí tìm thấy các hoạt động triển khai mô-đun. Chúng tôi cung cấp phương thức triển khai mặc định cho mỗi mô-đun. Tuy nhiên, bạn có thể phủ lên từng mô-đun bằng cách đặt thành phần của mô-đun đó trong giá trị cấu hình tương ứng.

  • Đặt tên thành phần triển khai OEM của IRecorderModule thành recording_module

  • Đặt tên thành phần triển khai OEM của IStreamModule thành mô-đun truyền trực tuyến.

  • Đặt tên thành phần triển khai OEM của ITriggerModule thành trigger_module

    Trong thời gian chạy, dịch vụ Dashcam sẽ tạo bản sao tên thành phần được đặt trong config.xml cho mỗi mô-đun.

Hướng dẫn dành cho nhà phát triển ứng dụng

Dashcam là một giải pháp camera hành trình có thể tuỳ chỉnh, sẵn sàng để sản xuất. Dashcam sử dụng các API Trình quản lý camera hành trình để giao tiếp với Dashcam service. Bạn có thể tìm thấy API Trình quản lý camera hành trình tại IDashcamManager. Mọi ứng dụng có các quyền cần thiết đều có thể sử dụng Trình quản lý camera hành trình.

Quyền

Hỗ trợ Camera2 và EVS.

Tạo sẵn

Cách dễ nhất để cấp các quyền này là đưa các quyền đó vào chế độ thiết lập tạo sẵn bằng cách sử dụng Blueprint hoặc Make.

OverlayUI

Bạn có thể tuỳ chỉnh ứng dụng bằng Lớp phủ tài nguyên thời gian chạy. Để tìm hiểu thêm, hãy xem phần Lớp phủ tài nguyên thời gian chạy. Để xem danh sách các phần tử có thể phủ, hãy xem overlayable.xml.

Mở rộng trình kích hoạt

Bạn có thể mở rộng điều kiện kích hoạt cho phiên hiện tại bằng lệnh gọi đến DashcamManager.addTrigger(). Các trình kích hoạt đã thêm chỉ tồn tại trong phiên hiện tại.

Tự động bắt đầu

Không hỗ trợ tính năng tự động bắt đầu ghi. Tuy nhiên, bạn có thể bắt đầu một trình kích hoạt thủ công onBoot bằng lệnh gọi đến DashcamManager.startRecording()

Các phương pháp hay nhất

  • Bộ nhớ. Bạn nên sử dụng bộ nhớ ngoài có thể tháo rời.

  • Trải nghiệm người dùng. Thiết kế giao diện người dùng của ứng dụng Dashcam sao cho trực quan và thân thiện với người dùng, tuân thủ các nguyên tắc thiết kế của AAOS.

  • Tối ưu hoá hiệu suất. Tối ưu hoá hiệu suất của ứng dụng để giảm thiểu mức sử dụng tài nguyên và đảm bảo hoạt động trơn tru trong AAOS.

Khắc phục sự cố

  • Vấn đề về khả năng kết nối của máy ảnh. Phải hỗ trợ EVS hoặc Camera2 và có trong AAOS IVI.

  • Lỗi bộ nhớ. Xác minh dung lượng lưu trữ còn trống và quản lý bản ghi. Bạn nên sử dụng bộ nhớ ngoài vì việc sử dụng bộ nhớ trong có thể làm hỏng bộ nhớ sớm.