שילוב של מצלמת הדשבורד

אפליקציית מצלמת הדשבורד מיועדת לשילוב עם AAOS, ומספקת לנהגים יכולות צילום וידאו לשיפור הבטיחות והאבטחה. במדריך הזה מפורטות הדרישות הטכניות, שלבי השילוב והשיטות המומלצות להטמעה מוצלחת.

דרישות מוקדמות

לפני שממשיכים, צריך לוודא שהתנאים המוקדמים הבאים מתקיימים:

SDK:

  • נדרשת גרסת SDK 31 ואילך.

חומרה:

  • מצלמות EVS או Camera2 שזמינות ל-AAOS.
  • צריך להיות מספיק מקום אחסון פנימי או תמיכה באחסון חיצוני נשלף
    כדי לצלם סרטונים.

דרישות התוכנה:

  • תמיכה ללא חבילת שירות מידע נוסף זמין במאמר אפליקציות לא בחבילה.
  • הרשאות כדי להשתמש במצלמת הרכב, נדרשות הרשאות מערכת.

קבלת קוד המקור

אפשר למצוא את קוד המקור ב-Android Code Search בכתובת:

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

קוד המקור זמין בשלושת המודולים הבאים:

  • שירות מצלמת הדשבורד לוגיקה של סטרימינג, הקלטה והפעלה.
  • מנהל מצלמת הדשבורד מתחבר לשירות Dashcam ומציג ללקוחות ממשק API יציב
  • אפליקציית Dashcam: הפניה לאפליקציית Dashcam באמצעות Dashcam Manager API

תרשים הארכיטקטורה

פיתוח מצלמת הדשבורד

משתמשים ב-Soong או ב-Gradle כדי ליצור את Dashcam.

סונג

לפני שמבצעים פיתוח מ-Soong, חשוב לנקות את הספריות .cxx.

ב-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"],
}

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

יוצרים קובץ הרשאות בשם 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>

מוסיפים את ההרשאות מהמניפסט לקובץ ההרשאות.

מידע נוסף זמין במאמר מובנה מראש בתמונת מערכת.

התקנה ממקור לא ידוע

אפשר גם להעביר את קובץ ההרשאות דרך ה-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

הגדרת שכבות-על

לשירות מצלמת הרכב יש הגדרות שאפשר להציג כשכבת-על.

הגדרת השירות

dashcam-service/res/values/config.xml

הקובץ הזה מכיל את ההגדרות של השירות:

  • allow_internal_storage הרשאה להקלטות באחסון הפנימי
  • save_location שם הספרייה שבה יישמרו ההקלטות. ברירת המחדל היא מצלמת רכב
  • max_storage_mb כמה נפח אחסון לאפשר למצלמת הרכב להשתמש בו
  • max_age_days למשך כמה זמן לשמור קובץ לפני גיזום
  • boot_startup_enabled הפעלת שירות מצלמת הדשבורד בזמן האתחול של המכשיר
  • notifications_on הצגת התראות כשההקלטה מתחילה
  • native_recorder שימוש בממשקי NDK API, ברירת המחדל היא ממשקי Java API
  • native_renderer שימוש בממשקי NDK API, ברירת המחדל היא ממשקי Java API
  • default_app_component אפליקציית ברירת המחדל למצלמת הרכב, לאפליקציה הזו יש גישה גלובלית להקלטות וגישה גלובלית להפעלה
  • recording_module ComponentName של הטמעת IRecordingModule
  • streaming_module ComponentName של הטמעת IRecordingModule
  • trigger_module ComponentName של הטמעת IRecordingModule

הגדרת טריגר

כדי להפעיל את ההגדרה, מריצים את הפקודה:

dashcam-service/src/assets/config.xml

הקובץ הזה מכיל הגדרות להפעלת טריגרים להקלטה. הגדרת הטריגר מורכבת משני חלקים:

  • מזהה הווידאו המקדים. המזהה של המצלמה, EVS או Camera2, בהתאם למה שנתמך.

  • prerollLengthMs האורך של הקליפ של מודעה מוקדמת שיאוחסן עם כל אירוע.

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

בדוגמה הזו מוצג מזהה המצלמה 0 עם מודעה מוקדמת של 10 שניות.

  • name שם הטריגר הייחודי

  • camera מזהה המצלמה, EVS או Camera2, בהתאם למה שנתמך

  • sensorPropertyID מזהה החיישן

  • description תיאור הטריגר שמוצג בממשק המשתמש

  • recordingLengthMs משך הזמן לאחר האירוע שרוצים לתעד, באלפיות שנייה.

  • sensorType סוג החיישן. האפשרויות הן VHAL או SENSOR_MANAGER

  • sensorValueType סוג הנתונים שהחיישן מייצר. האפשרויות הן INT,‏ INT_ARRAY,‏ FLOAT,‏ FLOAT_ARRAY ו-BOOLEAN, STRING

  • thresholdType איך מעריכים את ערך החיישן. האפשרויות הן AVERAGE,‏ BOOLEAN,‏ EQUALS,‏ LEAP,‏ LEAP_AVERAGE,‏ LEAP_OVER,‏ PEAK ו-PEAK_HOLD

  • thresholdValue הערך שאליו יש להשוות את ערך החיישן לפי סוג הסף

  • thresholdExtra ערך נוסף שנחוץ לסוגי סף מסוימים, כמו טווח, עבור AVERAGE

  • triggerCooldown זמן הצינון לפני הפעלת אירוע נוסף מהסוג הזה, ביחידות מילי-שנייה.

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

בדוגמה הזו מוצג חיישן VHAL שמפיק ערכים שלמים, שבהם אנחנו משווים בין שוויון לערך הסף. כשתנאי השוויון מתקיים, הטריגר מתעד במצלמות 1 ו-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"/>

בדוגמה הזו מוצג חיישן VHAL שמייצר ערכים מסוג float, שבהם אנחנו מעריכים את הממוצע על פני טווח של דגימות בהשוואה לערך הסף. טווח הדגימה מוגדר ב-thresholdExtra

מודולים

שירות מצלמת הרכב מורכב משלושה מודולים:

  • Stream מכיל את הלוגיקה לטיפול בסטרימינג ממצלמות.

  • הקלטה מכילה את הלוגיקה לטיפול בהקלטות.

  • טריגר מכיל את הלוגיקה להפעלת הקלטה מנתוני חיישנים. ממשקי ה-API של המודולים מוגדרים בממשקים המתאימים שלהם, IStreamModule, ‏ IRecorderModule ו-ITriggerModule, וחשופים ל-DashcamManager דרך DashcamServiceAPI.

מודולים של שכבת-על

שירות Dashcam משתמש ב-dashcam-service/res/values/config.xml כדי לקבוע איפה נמצאות הטמעות המודול. אנחנו מספקים הטמעות ברירת מחדל לכל מודול. עם זאת, אפשר להציג שכבה של כל מודול על ידי הגדרת הרכיב שלו בערך התצורה המתאים.

  • הגדרת השם של רכיב ההטמעה של OEM מ-IRecorderModule ל-recording_module

  • מגדירים את שם הרכיב של הטמעת ה-OEM של IStreamModule למודול הסטרימינג.

  • הגדרת השם של רכיב ההטמעה של OEM מ-ITriggerModule ל-trigger_module

    בזמן הריצה, שירות Dashcam יוצר מופע של שם הרכיב שמוגדר ב-config.xml לכל מודול.

מדריך למפתחי אפליקציות

Dashcam הוא פתרון מצלמת דשבורד וגם בהתאמה אישית, שעומד בדרישות של סביבות ייצור. Dashcam משתמש בממשקי ה-API של Dashcam Manager כדי לתקשר עם Dashcam service. אפשר למצוא את Dashcam Manager API בכתובת IDashcamManager. כל אפליקציה עם ההרשאות הנדרשות יכולה להשתמש ב-Dashcam Manager.

הרשאות

יש תמיכה ב-Camera2 וב-EVS.

מובנה

הדרך הקלה ביותר להעניק את ההרשאות האלה היא לכלול אותן בהגדרה המוגדרת מראש באמצעות Blueprint או Make.

OverlayUI

אפשר להתאים אישית את האפליקציה באמצעות שכבות-על של משאבי זמן ריצה. למידע נוסף, ראו שכבות-על של משאבים בסביבת זמן ריצה. לרשימת הרכיבים שאפשר להוסיף שכבת-על להם, אפשר לעיין בקובץ overlayable.xml.

הרחבת הטריגרים

אפשר להאריך את הטריגרים לסשן הנוכחי באמצעות קריאה ל-DashcamManager.addTrigger(). טריגרים שנוספו נשארים בתוקף רק בסשן הנוכחי.

הפעלה אוטומטית

אין תמיכה בהפעלה אוטומטית של ההקלטה. עם זאת, אפשר להפעיל טריגר ידני onBoot באמצעות קריאה ל-DashcamManager.startRecording()

שיטות מומלצות

  • אחסון מומלץ מאוד להשתמש באחסון חיצוני נשלף.

  • חוויית המשתמש תכנון ממשק המשתמש של אפליקציית Dashcam כך שיהיה אינטואיטיבי ונוח למשתמש, בהתאם להנחיות העיצוב של AAOS.

  • אופטימיזציה של הביצועים לבצע אופטימיזציה של הביצועים של האפליקציה כדי לצמצם את השימוש במשאבים ולהבטיח תפעול חלק ב-AAOS.

פתרון בעיות

  • בעיות בקישוריות של המצלמה צריכה להיות תמיכה ב-EVS או ב-Camera2 והם צריכים להיות זמינים ב-AAOS IVI.

  • שגיאות אחסון איך בודקים את נפח האחסון הזמין ומנהלים את ההקלטות. מומלץ מאוד להשתמש באחסון חיצוני, כי שימוש באחסון פנימי עלול לגרום לבלאי מוקדם של האחסון.