تم تصميم تطبيق Dashcam للاندماج مع AAOS، ما يوفّر للسائقين إمكانات تسجيل الفيديو لتعزيز السلامة والأمان. يحدّد هذا الدليل المتطلبات الفنية وخطوات الدمج وأفضل الممارسات لضمان عملية استخدام ناجحة.
المتطلبات الأساسية
قبل المتابعة، تأكَّد من استيفاء الشروط المسبقة التالية:
حزمة تطوير البرامج (SDK):
- يجب توفُّر حزمة تطوير البرامج (SDK) الإصدار 31 أو إصدار أحدث.
الأجهزة:
- يجب أن تكون كاميرات EVS أو Camera2 متاحة لنظام التشغيل AAOS.
- يجب توفُّر مساحة تخزين داخلية كافية أو دعم لوحدة تخزين خارجية قابلة للإزالة
لتسجيلات الفيديو.
متطلبات البرامج:
- الدعم غير المجمّع لمزيد من المعلومات، يُرجى الاطّلاع على مقالة التطبيقات غير المجمّعة.
- الأذونات يتطلّب تطبيق Dashcam أذونات النظام.
الحصول على رمز المصدر
يُعدّ تطبيق Dashcam جزءًا من التطبيقات غير المجمّعة في AAOS. للاطّلاع على الرمز غير المجمّع، يُرجى الاطّلاع على مقالة الاطّلاع على الرمز.
يمكنك تصفُّح رمز المصدر باستخدام Android Code Search.
يتم توفير رمز المصدر في الوحدات الثلاث التالية:
- خدمة Dashcam منطق البث والتسجيل والتشغيل
- مدير Dashcam يتصل بخدمة Dashcam ويعرض واجهة برمجة تطبيقات ثابتة للعملاء
- تطبيق Dashcam تطبيق Dashcam مرجعي يستخدم واجهة برمجة تطبيقات "مدير Dashcam"
إنشاء تطبيق 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/
يتم تقديم تعليمات مفصّلة لإنشاء تطبيق Dashcam باستخدام Gradle في ملف README.
الأذونات
تتطلّب خدمة Dashcam وتطبيق Dashcam العديد من أذونات النظام.
أسهل طريقة لمنح هذه الأذونات هي تضمينها في إعداد مُنشأ مسبقًا باستخدام Blueprint أو Make.
في 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,
}
في 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>
أضِف الأذونات من ملف Manifest إلى ملف الأذونات.
قبل استخدام Dashcam، امنح خدمة Dashcam أذونات Camera2 مسبقًا كما هو موضّح في كاميرا AAOS.
أضِف ملف الأذونات الممنوحة مسبقًا إلى ملف 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,
}
لمزيد من المعلومات، يُرجى الاطّلاع على مقالتَي دمج إعداد مُنشأ مسبقًا في صورة نظام وإضافة قائمة السماح.
التحميل الجانبي (Sideload)
يمكن أيضًا تحميل ملف الأذونات بشكل جانبي. استخدِم هذه الطريقة عندما لا يكون تطبيق 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 على إعدادات قابلة للطبقة.
إعداد الخدمة
dashcam-service/res/values/config.xml
يحتوي هذا الملف على إعدادات الخدمة:
config_fileاسم ملف إعدادات المشغِّل في/assetsallow_internal_storageالسماح بحفظ التسجيلات في وحدة التخزين الداخليةboot_startup_enabledبدء خدمة Dashcam عند تشغيل الجهازnotifications_onعرض الإشعارات عند بدء التسجيلdefault_app_componentتطبيق Dashcam التلقائي الذي يتيح الوصول إلى التسجيلات والمشغّلات على مستوى العالمrecording_moduleاسم مكوّن تنفيذIRecordingModulestreaming_moduleاسم مكوّن تنفيذIStreamingModuletrigger_moduleاسم مكوّن تنفيذITriggerModule
إعدادات المشغِّل
لضبط مشغّلات التسجيل، أنشئ نسخة من:
dashcam-service/src/assets/config.xml
وأضِفها إلى مجلّد الموارد. أشِر إلى هذا الملف في العنصر config_file في ملف إعدادات الخدمة.
تتألف إعدادات المشغِّل من أجزاء التخزين والكاميرا والمشغِّل:
مساحة التخزين
تحتوي إعدادات مساحة التخزين على العناصر التالية:
maxStorageUsagePercentالحد الأقصى للنسبة المئوية من مساحة التخزين المتاحة التي يستخدمها تطبيق Dashcam قبل إزالة التسجيلاتmaxStorageUsageMegabytesالحد الأقصى لمساحة التخزين بالميغابايت التي يستخدمها تطبيق Dashcam قبل إزالة التسجيلات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 ثوانٍ وعرض وارتفاع تلقائيَين.
Trigger
تتألف إعدادات المشغِّل من قائمة بالمشغّلات المحدّدة من خلال ما يلي:
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قيمة إضافية مطلوبة لبعض أنواع الحدود القصوى، مثل النطاق لـAVERAGEtriggerCooldownفترة التهدئة بالملّي ثانية قبل تشغيل حدث آخر من هذا النوع
<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 من ثلاث وحدات:
تحتوي البث على منطق معالجة البث من الكاميرات.
تحتوي التسجيل على منطق معالجة التسجيلات.
تحتوي المشغِّل على منطق تشغيل التسجيل من بيانات جهاز الاستشعار. يتم تحديد واجهات برمجة تطبيقات الوحدة في واجهاتها المقابلة،
IStreamModuleوIRecorderModuleوITriggerModule، وعرضها علىDashcamManagerمن خلالDashcamServiceAPI.
وحدات الطبقة
تستخدم خدمة Dashcam ملف dashcam-service/res/values/config.xml لتحديد مكان العثور على عمليات تنفيذ الوحدة. يتم توفير عمليات تنفيذ تلقائية لكل وحدة. ومع ذلك، يمكن أن يتم تطبيق طبقة على كل وحدة من خلال ضبط مكوّنها في قيمة الإعداد المقابلة.
اضبط اسم مكوّن تنفيذ الشركة المصنّعة الأصلية لما يلي:
IRecorderModuleعلىrecording_moduleIStreamModuleعلىstreaming_moduleITriggerModuleعلىtrigger_module
في وقت التشغيل، تنشئ خدمة Dashcam اسم المكوّن الذي تم ضبطه في config.xml لكل وحدة.
دليل مطوّري التطبيقات
يُعدّ تطبيق Dashcam حلاً جاهزًا للاستخدام وقابلاً للتخصيص لتسجيل الفيديو في السيارة. يستخدم تطبيق Dashcam
واجهات برمجة تطبيقات "مدير Dashcam" للتواصل مع Dashcam service. يمكن العثور على واجهة برمجة تطبيقات "مدير Dashcam" في IDashcamManager. يمكن لأي تطبيق لديه الأذونات المطلوبة استخدام "مدير Dashcam".
OverlayUI
يمكن تخصيص التطبيق باستخدام الطبقات في وقت التشغيل. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة الطبقات في وقت التشغيل. للاطّلاع على قائمة العناصر القابلة للطبقة، يُرجى الاطّلاع على overlayable.xml.
تمديد المشغّلات
يمكن تمديد المشغّلات للجلسة الحالية من خلال استدعاء DashcamManager#addTrigger(). تستمر المشغّلات المضافة للجلسة الحالية فقط.
بدء تلقائي
لا تتوفّر ميزة بدء التسجيل تلقائيًا. ومع ذلك، يمكن بدء مشغِّل يدوي onBoot من خلال استدعاء DashcamManager.startRecording()
أفضل الممارسات
مساحة التخزين يُنصح بشدة باستخدام وحدة تخزين خارجية قابلة للإزالة.
تجربة المستخدم صمِّم واجهة مستخدِم تطبيق Dashcam لتكون سهلة الاستخدام وبديهية، مع الالتزام بإرشادات تصميم AAOS.
تحسين الأداء حسِّن أداء التطبيق لتقليل استخدام الموارد وضمان التشغيل السلس في AAOS.
تحديد المشاكل وحلّها
مشاكل في اتصال الكاميرا يجب أن تكون كاميرات EVS أو Camera2 متوافقة ومتاحة في نظام AAOS IVI.
أخطاء في مساحة التخزين تحقَّق من مساحة التخزين المتاحة وأدِر التسجيلات. يُنصح بشدة باستخدام وحدة تخزين خارجية لأنّ استخدام وحدة التخزين الداخلية يمكن أن يؤدي إلى تآكل مساحة التخزين قبل الأوان.