אפליקציית מצלמת הדשבורד מיועדת לשילוב עם AAOS, ומספקת לנהגים יכולות צילום וידאו לשיפור הבטיחות והאבטחה. במדריך הזה מפורטות הדרישות הטכניות, שלבי השילוב והשיטות המומלצות להטמעה מוצלחת.
דרישות מוקדמות
לפני שממשיכים, צריך לוודא שהתנאים המוקדמים הבאים מתקיימים:
SDK:
- נדרשת גרסת SDK מגרסה 31 ואילך.
חומרה:
- מצלמות EVS או Camera2 שזמינות ל-AAOS.
- צריך להיות מספיק מקום אחסון פנימי או תמיכה באחסון חיצוני נשלף
כדי לצלם סרטונים.
דרישות התוכנה:
- תמיכה ללא חבילת שירות מידע נוסף זמין במאמר אפליקציות לא בחבילה.
- הרשאות כדי להשתמש במצלמת הדשבורד, נדרשות הרשאות מערכת.
קבלת קוד המקור
מצלמת הרכב היא חלק מהאפליקציות של AAOS שלא נכללות בחבילה. במאמר איך בודקים את הקוד מוסבר איך בודקים את הקוד ללא החבילה.
עיינו בקוד המקור באמצעות Android Code Search.
קוד המקור זמין בשלושת המודולים הבאים:
- שירות מצלמת הדשבורד לוגיקה של סטרימינג, הקלטה והפעלה.
- מנהל מצלמת הדשבורד מתחבר לשירות Dashcam ומציג ללקוחות ממשק API יציב
- אפליקציית Dashcam: הפניה לאפליקציית Dashcam באמצעות Dashcam Manager API
פיתוח מצלמת הדשבורד
משתמשים ב-Soong או ב-Gradle כדי ליצור את Dashcam.
סונג
ב-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/
הוראות מפורטות ליצירת build של Dashcam באמצעות Gradle מפורטות בקובץ README.
הרשאות
נדרשות כמה הרשאות מערכת לשירות של מצלמת הרכב ולאפליקציה של מצלמת הרכב.
הדרך הפשוטה ביותר להעניק את ההרשאות האלה היא לכלול אותן בהגדרה מוכנה מראש באמצעות 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>
מוסיפים את ההרשאות מהמניפסט לקובץ ההרשאות.
לפני שמשתמשים במצלמת הדשבורד, צריך להעניק מראש הרשאות ל-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,
}
מידע נוסף זמין במאמרים שילוב build מראש בתמונת מערכת והוספת רשימת היתרים.
התקנה ממקור לא ידוע
אפשר גם להעביר את קובץ ההרשאות דרך ה-sideload. משתמשים בשיטה הזו כשמצלמת הרכב המובנית לא מוגדרת.
באמצעות קובץ ההרשאות שנוצר בקטע הקודם בנושא חבילות מוכנות מראש, מריצים את הפקודה:
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השם של קובץ התצורה של הטריגר ב-/assetsallow_internal_storageמתן הרשאה לשמירת הקלטות באחסון הפנימיboot_startup_enabledהפעלת שירות מצלמת הדשבורד בזמן האתחול של המכשירnotifications_onהצגת התראות כשההקלטה מתחילהdefault_app_componentאפליקציית ברירת המחדל למצלמת הרכב, שיש לה גישה להקלטות ברחבי העולם וגישה להפעלה ברחבי העולםrecording_moduleComponentName של הטמעתIRecordingModulestreaming_moduleComponentName של הטמעתIStreamingModuletrigger_moduleComponentName של הטמעת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 שמייצר ערכים מסוג float.
הפונקציה TriggerModule משווה את הממוצע של החיישן על פני טווח של 10 דגימות לערך הסף של 20.0.
טווח הדגימה מוגדר ב-thresholdExtra. אפשר להפעיל אירוע חדש רק כל 2000 אלפיות שנייה, כפי שהוגדר ב-triggerCooldown.
מודולים
שירות מצלמת הרכב מורכב משלושה מודולים:
Stream מכיל את הלוגיקה לטיפול בסטרימינג ממצלמות.
הקלטה מכילה את הלוגיקה לטיפול בהקלטות.
טריגר מכיל את הלוגיקה להפעלת הקלטה מנתוני חיישנים. ממשקי ה-API של המודולים מוגדרים בממשקים המתאימים שלהם,
IStreamModule, IRecorderModuleו-ITriggerModule, וחשופים ל-DashcamManagerדרךDashcamServiceAPI.
מודולים של שכבת-על
שירות Dashcam משתמש ב-dashcam-service/res/values/config.xml כדי לקבוע איפה נמצאות הטמעות המודול. לכל מודול יש הטמעות ברירת מחדל. עם זאת, אפשר להציג שכבה של כל מודול על ידי הגדרת הרכיב שלו בערך התצורה התואם.
הגדרת שם הרכיב של הטמעת ה-OEM של:
IRecorderModuleעדrecording_moduleIStreamModuleעדstreaming_moduleITriggerModuleעדtrigger_module
בזמן הריצה, שירות Dashcam יוצר מופע של שם הרכיב שמוגדר ב-config.xml לכל מודול.
מדריך למפתחי אפליקציות
Dashcam הוא פתרון מצלמת דשבורד וגם בהתאמה אישית, שעומד בדרישות של סביבות ייצור. Dashcam משתמש בממשקי ה-API של Dashcam Manager כדי לתקשר עם Dashcam service. אפשר למצוא את Dashcam Manager API בכתובת IDashcamManager. כל אפליקציה עם ההרשאות הנדרשות יכולה להשתמש ב-Dashcam Manager.
OverlayUI
אפשר להתאים אישית את האפליקציה באמצעות שכבות-על של משאבי זמן ריצה. למידע נוסף, ראו שכבות-על של משאבים בסביבת זמן ריצה. לרשימת הרכיבים שאפשר להציג מעליהם שכבת-על, אפשר לעיין בקובץ overlayable.xml.
הרחבת הטריגרים
אפשר להאריך את הטריגרים לסשן הנוכחי באמצעות קריאה ל-DashcamManager#addTrigger(). טריגרים שנוספו נשארים בתוקף רק בסשן הנוכחי.
הפעלה אוטומטית
אין תמיכה בהפעלה אוטומטית של ההקלטה. עם זאת, אפשר להפעיל טריגר ידני onBoot באמצעות קריאה ל-DashcamManager.startRecording()
שיטות מומלצות
אחסון מומלץ מאוד להשתמש באחסון חיצוני נשלף.
חוויית המשתמש תכנון ממשק המשתמש של אפליקציית מצלמת הדשבורד כך שיהיה אינטואיטיבי ונוח למשתמש, בהתאם להנחיות העיצוב של AAOS.
אופטימיזציה של הביצועים לבצע אופטימיזציה של הביצועים של האפליקציה כדי לצמצם את השימוש במשאבים ולהבטיח פעולה חלקה ב-AAOS.
פתרון בעיות
בעיות בקישוריות של המצלמה צריכה להיות תמיכה ב-EVS או ב-Camera2 והם צריכים להיות זמינים ב-AAOS IVI.
שגיאות אחסון איך בודקים את נפח האחסון הזמין ומנהלים את ההקלטות. מומלץ מאוד להשתמש באחסון חיצוני, כי שימוש באחסון פנימי עלול לגרום לבלאי מוקדם של האחסון.