Ứ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:
- Camera 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
Dashcam là một phần của các ứng dụng không theo gói AAOS. Để xem mã đã tách riêng, hãy xem phần Xem mã.
Duyệt qua mã nguồn bằng tính năng Tìm kiếm mã Android.
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
Xây dựng Dashcam
Sử dụng Soong hoặc Gradle để tạo Dashcam.
Soong
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"],
}
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,
}
Trong 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 \
Tạo tệp quyền có tên 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>
Thêm quyền từ Tệp kê khai vào tệp quyền.
Trước khi sử dụng Dashcam, hãy cấp trước quyền Camera2 cho Dịch vụ Dashcam như trong AAOS Camera.
Thêm tệp quyền được cấp trước vào tệp Blueprint hoặc Make theo cách tương tự như tệp quyền.
Trong 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>
Trong 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,
}
Để tìm hiểu thêm, hãy xem phần Tích hợp bản dựng trước vào hình ảnh hệ thống và Thêm danh sách cho phép.
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
Thêm tệp quyền trước khi cấp phép theo cách tương tự như etc/default-permissions/
.
Đị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ụ:
config_file
Tên của tệp cấu hình điều kiện kích hoạt trong/assets
allow_internal_storage
Cho phép lưu bản ghi vào bộ nhớ trongboot_startup_enabled
Dịch vụ Dashcam khởi động khi thiết bị khởi độngnotifications_on
Hiện thông báo khi bắt đầu ghidefault_app_component
Ứng dụng camera hành trình mặc định, có quyền truy cập vào bản ghi toàn cầu và quyền kích hoạt toàn cầurecording_module
ComponentName của quá trình triển khaiIRecordingModule
streaming_module
ComponentName của quá trình triển khaiIStreamingModule
trigger_module
ComponentName của quá trình triển khaiITriggerModule
Cấu hình điều kiện kích hoạt
Để định cấu hình trình kích hoạt bản ghi, hãy tạo bản sao của:
dashcam-service/src/assets/config.xml
rồi thêm tệp này vào thư mục tài sản. Chỉ đến tệp này trong phần tử config_file
trong tệp cấu hình dịch vụ.
Cấu hình trình kích hoạt bao gồm bộ nhớ, camera và các phần trình kích hoạt:
Dung lượng lưu trữ
Cấu hình bộ nhớ có các phần tử sau:
maxStorageUsagePercent
Tỷ lệ phần trăm tối đa bộ nhớ còn trống mà camera hành trình sử dụng trước khi cắt bớt bản ghi.maxStorageUsageMegabytes
Dung lượng bộ nhớ tối đa (tính bằng megabyte) mà camera hành trình sử dụng trước khi cắt bớt bản ghi.maxAgeHoursBeforePrune
Số giờ tối đa trước khi một bản ghi bị cắt bớt. Bản ghi có thể bị cắt bớt sớm hơn nếu đạt đến giới hạn bộ nhớ.
Camera
Cấu hình máy ảnh có các phần tử sau:
Mã máy ảnh. Mã nhận dạng của máy ảnh có tiền tố máy ảnh.
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.width
Chiều rộng không bắt buộc của vùng đệm do máy ảnh trả về.height
Chiều cao không bắt buộc của vùng đệm do máy ảnh trả về.
<CameraConfig>
<Camera
ID="EVS:1"
prerollLengthMs="10000"
width="1920"
height="1080" />
<Camera
ID="Camera2:1"
prerollLengthMs="10000" />
</CameraConfig>
Ví dụ này cho thấy mã máy ảnh EVS:1 có quảng cáo trước 10 giây ở độ phân giải 1080p và mã máy ảnh Camera2:1 có quảng cáo trước 10 giây cùng chiều rộng và chiều cao mặc định.
Kích hoạt
Cấu hình điều kiện kích hoạt bao gồm danh sách các điều kiện kích hoạt được xác định theo các thông tin sau:
name
Tên trình kích hoạt duy nhất.cameras
Mã nhận dạng của máy ảnh.Mã
sensorPropertyID
của cảm biến có tiền tố là nhóm cảm biến. Các tuỳ chọn tiền tố làVHAL
hoặcSENSOR_MANAGER
.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.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_ARRAY
vàBOOLEAN, STRING
.thresholdType
Cách đánh giá giá trị cảm biến so vớithresholdValue
. Các tuỳ chọn làAVERAGE
,BOOLEAN
,EQUALS
,LEAP
,LEAP_AVERAGE
,LEAP_OVER
,PEAK
vàPEAK_HOLD
.thresholdValue
Giá trị so sánh với giá trị cảm biến.thresholdExtra
Cần có giá trị bổ sung cho một số loại ngưỡng, chẳng hạn như phạm vi choAVERAGE
.triggerCooldown
Thời gian chờ tính bằng mili giây trước khi kích hoạt một sự kiện khác thuộc loại này.
<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>
Ví dụ này cho thấy một điều kiện kích hoạt trong đó TriggerModule
theo dõi cảm biến VHAL tạo ra các giá trị số nguyên.
TriggerModule
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 EVS 1 và 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"/>
Ví dụ này cho thấy một điều kiện kích hoạt trong đó TriggerModule
theo dõi cảm biến VHAL tạo ra các giá trị float.
TriggerModule
so sánh giá trị trung bình của cảm biến trên một dải mẫu 10
với giá trị ngưỡng 20.0
.
Phạm vi mẫu được đặt trong thresholdExtra
. Bạn chỉ có thể kích hoạt một sự kiện mới sau mỗi 2000
mili giây như đã đặt trong triggerCooldown
.
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
,IRecorderModule
vàITriggerModule
, đồng thời được hiển thị choDashcamManager
thông quaDashcamServiceAPI
.
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. Các phương thức triển khai mặc định được cung cấp 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 là:
IRecorderModule
đếnrecording_module
IStreamModule
đếnstreaming_module
ITriggerModule
đếntrigger_module
Trong thời gian chạy, dịch vụ Dashcam 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 và 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.
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 bài viết 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 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.