מצלמה

סמל HAL של מצלמת Android

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

ארכיטקטורה

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

ארכיטקטורה של מצלמות Android

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

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

הטמעת תקן HAL

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

HAL בדרך כלל משולב חייב להטמיע את ממשקי HIDL הבאים:

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

אימות הקלט

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

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

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

ארכיטקטורה (מדור קודם)

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

ארכיטקטורה של מצלמות Android

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

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

הטמעת HAL (מדור קודם)

פרוטוקול HAL נמצא בין מנהל ההתקן של המצלמה למסגרת של Android ברמה גבוהה יותר ומגדיר ממשק שצריך להטמיע כדי שאפליקציות יוכלו לפעול כראוי בחומרה של המצלמה. ממשק 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 של Android כדי לארוז כראוי את הטמעת ה-HAL לספרייה משותפת ולהעתיק אותה למיקום המתאים על ידי יצירת קובץ Android.mk:

  1. יצירת device/<company_name>/<device_name>/camera כדי להכיל את קובצי המקור של הספרייה.
  2. כדי ליצור את הספרייה המשותפת צריך ליצור קובץ Android.mk. ודאו שה-createfile מכיל את השורות הבאות:
    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 עם 'cookie' של המכשיר. לדוגמה, כדי לציין שבמכשיר יש פלאש במצלמה יכול להוסיף מיקוד אוטומטי, להוסיף את השורות הבאות <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 \
    

    קובץ לדוגמה של קובץ יצרן של מכשיר מופיע כאן: device/samsung/tuna/device.mk

  4. הצהרה על יכולות קודק המדיה, הפורמט והרזולוציה של המצלמה device/<company_name>/<device_name>/media_profiles.xml ו-device/<company_name>/<device_name>/media_codecs.xml קובצי XML. פרטים נוספים זמינים במאמר חשיפת רכיבי קודק framework.
  5. צריך להוסיף את השורות הבאות ל קובץ makefile אחד (device/<company_name>/<device_name>/device.mk) כדי להעתיק את 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 \
    ...