מצלמה

סמל HAL מצלמת אנדרואיד

שכבת ההפשטה של ​​חומרת המצלמה (HAL) של אנדרואיד מחברת את ממשקי ה-API של מסגרת המצלמה ברמה גבוהה יותר במצלמה 2 למנהל התקן ולחומרה של המצלמה הבסיסיים שלך. תת-מערכת המצלמה כוללת יישומים עבור רכיבי צנרת של המצלמה בעוד שה-HAL של המצלמה מספק ממשקים לשימוש בהטמעת הגרסה שלך של רכיבים אלה.

ארכיטקטורה

האיור והרשימה הבאים מתארים את רכיבי HAL.

ארכיטקטורת מצלמת אנדרואיד

איור 1. ארכיטקטורת המצלמה

מסגרת אפליקציה
ברמת המסגרת של האפליקציה נמצא קוד האפליקציה, המשתמש בממשק ה-API של Camera 2 כדי ליצור אינטראקציה עם חומרת המצלמה. באופן פנימי, קוד זה קורא לממשקי Binder המקבילים כדי לגשת לקוד המקורי שמקיים אינטראקציה עם המצלמה.
איידל
את ממשק הקלסר המשויך ל- CameraService ניתן למצוא ב- framesworks/av/camera/aidl/android/hardware . הקוד שנוצר קורא לקוד המקורי ברמה התחתונה כדי לקבל גישה למצלמה הפיזית ומחזיר נתונים המשמשים ליצירת ה- CameraDevice ובסופו של דבר אובייקטים CameraCaptureSession ברמת המסגרת.
מסגרת מקומית
מסגרת זו השוכנת בתוך frameworks/av/ מספקת מקבילה מקורית למחלקות CameraDevice ו- CameraCaptureSession . ראה גם התייחסות NDK camera2 .
ממשק IPC של קלסר
ממשק ה-IPC קלסר מקל על תקשורת על פני גבולות תהליך. ישנן מספר מחלקות קלסר מצלמות הממוקמות בספריית frameworks/av/camera/camera/aidl/android/hardware שמתקשרות לשירות המצלמה. ICameraService הוא הממשק לשירות המצלמה; ICameraDeviceUser הוא הממשק להתקן מצלמה שנפתח ספציפי; ו- ICameraServiceListener ו- ICameraDeviceCallbacks הם ההתקשרויות CameraService ו- CameraDevice בהתאמה למסגרת האפליקציה.
שירות מצלמות
שירות המצלמה, הממוקם ב- frameworks/av/services/camera/libcameraservice/CameraService.cpp , הוא הקוד בפועל שמקיים אינטראקציה עם ה-HAL.
HAL
שכבת הפשטת החומרה מגדירה את הממשק הסטנדרטי שאליו שירות המצלמה מתקשר ושאתה חייב ליישם כדי שחומרת המצלמה שלך תפעל כהלכה.

יישום ה-HAL

ה-HAL יושב בין מנהל ההתקן של המצלמה למסגרת האנדרואיד ברמה גבוהה יותר ומגדיר ממשק שעליך ליישם כדי שאפליקציות יוכלו להפעיל נכון את חומרת המצלמה. ממשקי ה-HIDL עבור המצלמה HAL מוגדרים בחומרה/ממשקים/מצלמה .

HAL אופייני למאגד חייב ליישם את ממשקי ה-HIDL הבאים:

יישומי HIDL עזר זמינים עבור CameraProvider.cpp , CameraDevice.cpp ו- CameraDeviceSession.cpp . היישום עוטף HALs ישנים שעדיין משתמשים ב- API מדור קודם . החל מ-Android 8.0, הטמעות של Camera HAL חייבות להשתמש ב-HIDL API; השימוש בממשק מדור קודם אינו נתמך.

אימות קלט

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

רכיבי HAL מדור קודם

סעיף זה מתאר את הארכיטקטורה של רכיבי HAL מדור קודם וכיצד ליישם את ה-HAL. יישומי HAL של מצלמה ב-Android 8.0 ואילך חייבים להשתמש ב-HIDL API במקום זאת, המתואר לעיל.

אדריכלות (מורשת)

האיור והרשימה הבאים מתארים את רכיבי HAL של המצלמה מדור קודם.

ארכיטקטורת מצלמת אנדרואיד

איור 2. ארכיטקטורת מצלמה מדור קודם

מסגרת אפליקציה
ברמת המסגרת של האפליקציה נמצא קוד האפליקציה, המשתמש ב- android.hardware.Camera API כדי ליצור אינטראקציה עם חומרת המצלמה. באופן פנימי, קוד זה קורא למחלקת דבק מקבילה של JNI כדי לגשת לקוד המקורי שמקיים אינטראקציה עם המצלמה.
JNI
קוד JNI המשויך ל- android.hardware.Camera נמצא ב- frameworks/base/core/jni/android_hardware_Camera.cpp . קוד זה קורא לקוד המקורי ברמה נמוכה יותר כדי לקבל גישה למצלמה הפיזית ומחזיר נתונים המשמשים ליצירת אובייקט android.hardware.Camera ברמת המסגרת.
מסגרת מקומית
המסגרת המקורית המוגדרת ב- frameworks/av/camera/Camera.cpp מספקת מקבילה מקורית למחלקה android.hardware.Camera . מחלקה זו קוראת ל-IPC קלסר פרוקסי כדי לקבל גישה לשירות המצלמה.
פרוקסי IPC של קלסר
פרוקסי הקלסר של IPC מקלים על תקשורת על פני גבולות תהליך. ישנן שלוש מחלקות קלסר מצלמות הממוקמות בספריית frameworks/av/camera שמתקשרת לשירות המצלמה. ICameraService הוא הממשק לשירות המצלמה, ICamera הוא הממשק למכשיר מצלמה שנפתח ספציפי, ו- ICameraClient הוא הממשק של המכשיר בחזרה למסגרת האפליקציה.
שירות מצלמות
שירות המצלמה, הממוקם ב- frameworks/av/services/camera/libcameraservice/CameraService.cpp , הוא הקוד בפועל שמקיים אינטראקציה עם ה-HAL.
HAL
שכבת הפשטת החומרה מגדירה את הממשק הסטנדרטי שאליו שירות המצלמה מתקשר ושאתה חייב ליישם כדי שחומרת המצלמה שלך תפעל כהלכה.
מנהל התקן ליבה
מנהל ההתקן של המצלמה יוצר אינטראקציה עם חומרת המצלמה בפועל ועם היישום שלך של HAL. המצלמה והנהג חייבים לתמוך בפורמטים של תמונה YV12 ו-NV21 כדי לספק תמיכה בתצוגה מקדימה של תמונת המצלמה בתצוגה והקלטת וידאו.

יישום ה-HAL (מורשת)

ה-HAL יושב בין מנהל ההתקן של המצלמה למסגרת האנדרואיד ברמה גבוהה יותר ומגדיר ממשק שעליך ליישם כדי שאפליקציות יוכלו להפעיל נכון את חומרת המצלמה. ממשק HAL מוגדר בקבצי הכותרת hardware/libhardware/include/hardware/camera.h ו- hardware/libhardware/include/hardware/camera_common.h .

camera_common.h מגדיר camera_module , מבנה סטנדרטי לקבלת מידע כללי על המצלמה, כגון מזהה המצלמה ומאפיינים המשותפים לכל המצלמות (כלומר, בין אם זו מצלמה קדמית או אחורית).

camera.h מכיל קוד שמתאים ל- android.hardware.Camera . קובץ כותרת זה מכריז על מבנה camera_device שבתורו מכיל מבנה camera_device_ops עם מצביעים לפונקציות המיישמות את ממשק HAL. לתיעוד על פרמטרי המצלמה שמפתחים יכולים להגדיר, עיין ב- frameworks/av/include/camera/CameraParameters.h . פרמטרים אלו נקבעים עם הפונקציה עליה מצביע int (*set_parameters)(struct camera_device *, const char *parms) ב-HAL.

לדוגמה למימוש HAL, עיין ביישום עבור ה-Galaxy Nexus HAL ב- hardware/ti/omap4xxx/camera .

הגדרת הספרייה המשותפת

הגדר את מערכת ה-build של אנדרואיד כדי לארוז נכון את יישום HAL לספרייה משותפת והעתק אותו למיקום המתאים על ידי יצירת קובץ Android.mk :

  1. צור device/<company_name>/<device_name>/camera כדי להכיל את קובצי המקור של הספרייה שלך.
  2. צור קובץ Android.mk כדי לבנות את הספרייה המשותפת. ודא שקובץ ה-make מכיל את השורות הבאות:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    הספרייה שלך חייבת להיקרא camera.<device_name> ( .so מצורף אוטומטית), כך ש-Android יוכל לטעון נכון את הספרייה. לדוגמא, ראה את הקובץ makefile עבור מצלמת ה-Galaxy Nexus הממוקמת ב- hardware/ti/omap4xxx/Android.mk .

  3. ציין שהמכשיר שלך כולל תכונות מצלמה על-ידי העתקת קובצי ה-XML של התכונה הדרושים בספריית frameworks/native/data/etc עם ה-makefile של המכשיר שלך. לדוגמה, כדי לציין שהמכשיר שלך כולל פלאש מצלמה ויכול להתמקד אוטומטית, הוסף את השורות הבאות בקובץ <device>/<company_name>/<device_name>/device.mk makefile של המכשיר שלך:
    PRODUCT_COPY_FILES := \ ...
    
    PRODUCT_COPY_FILES += \
    frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:system/etc/permissions/android.hardware.camera.flash-autofocus.xml \
    

    לדוגמא של קובץ makefile, ראה device/samsung/tuna/device.mk .

  4. הצהר על ה-codec, הפורמט והרזולוציה של המדיה של המצלמה שלך בקבצי XML של device/<company_name>/<device_name>/media_profiles.xml ו- device/<company_name>/<device_name>/media_codecs.xml . לפרטים, ראה חשיפת קודקים למסגרת .
  5. הוסף את השורות הבאות device/<company_name>/<device_name>/device.mk makefile של המכשיר שלך כדי להעתיק את קבצי media_profiles.xml ו- media_codecs.xml למיקום המתאים:
    # media config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_profiles.xml:system/etc/media_profiles.xml
    
    # media codec config xml file
    PRODUCT_COPY_FILES += \
        <device>/<company>/<device>/media_codecs.xml:system/etc/media_codecs.xml
    
  6. כדי לכלול את אפליקציית המצלמה בתמונת המערכת של המכשיר שלך, ציין אותה במשתנה PRODUCT_PACKAGES device/<company>/<device>/device.mk makefile:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...
    
    המכשיר שלך