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

אפליקציית מצלמת הדשבורד מיועדת לשילוב עם 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 השם של קובץ התצורה של הטריגר ב-/assets
  • allow_internal_storage מתן הרשאה לשמירת הקלטות באחסון הפנימי
  • boot_startup_enabled הפעלת שירות מצלמת הדשבורד בזמן האתחול של המכשיר
  • notifications_on הצגת התראות כשההקלטה מתחילה
  • default_app_component אפליקציית ברירת המחדל למצלמת הרכב, שיש לה גישה להקלטות ברחבי העולם וגישה להפעלה ברחבי העולם
  • recording_module ComponentName של הטמעת IRecordingModule
  • streaming_module ComponentName של הטמעת IStreamingModule
  • trigger_module ComponentName של הטמעת 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_module
  • IStreamModule עד streaming_module
  • ITriggerModule עד 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.

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