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

איור 1. ארכיטקטורת מצלמה
- מסגרת אפליקציות
- ברמת מסגרת האפליקציה נמצא קוד האפליקציה, המשתמש בממשק ה- API של מצלמה 2 כדי לקיים אינטראקציה עם חומרת המצלמה. באופן פנימי, קוד זה קורא לממשקי קלסר מתאימים כדי לגשת לקוד המקורי אשר מתקשר עם המצלמה.
- AIDL
- ניתן למצוא את ממשק הקלסר המשויך ל-
CameraService
במסגרות / av / camera / aidl / android / hardware . הקוד שנוצר מכנה קוד הילידים ברמה נמוכה כדי לקבל גישה לנתונים המצלמה וחוזר הפיזי המשמש ליצירתCameraDevice
ולבסוףCameraCaptureSession
אובייקטים ברמת המסגרת. - מסגרת מקומית
- מסגרת זו השוכנת
frameworks/av/
מספקת מקבילה מקוריתCameraDevice
CameraCaptureSession
ו-CameraCaptureSession
. ראה גם הפניה ל- NDK camera2 . - ממשק IPC קלסר
- ממשק קלסר ה- IPC מאפשר תקשורת על גבולות התהליך. ישנן מספר שיעורי קלסר למצלמות הממוקמים
frameworks/av/camera/camera/aidl/android/hardware
אשר קוראות לשירות המצלמה.ICameraService
הוא הממשק לשירות המצלמה;ICameraDeviceUser
הוא הממשק למכשיר מצלמה נפתח ספציפי; ו-ICameraServiceListener
ו-ICameraDeviceCallbacks
הםICameraDeviceCallbacks
CameraService
בהתאמה שלCameraService
ו-CameraDevice
למסגרת היישום. - שירות מצלמות
- שירות המצלמות, הממוקם
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, הוא הקוד האמיתיframeworks/av/services/camera/libcameraservice/CameraService.cpp
עם ה- HAL. - HAL
- שכבת הפשטת החומרה מגדירה את הממשק הסטנדרטי אליו מתקשר שירות המצלמה ועליך ליישם כדי שתפקוד החומרה של המצלמה יתפקד כראוי.
יישום ה- HAL
ה- HAL יושב בין מנהל התקן לבין מסגרת האנדרואיד ברמה הגבוהה יותר ומגדיר ממשק שעליך ליישם כדי שאפליקציות יוכלו להפעיל נכון את חומרת המצלמה. ממשקי HIDL למצלמת HAL מוגדרים בחומרה / ממשקים / מצלמה .
HAL אופייני לקשירת קלסור חייב ליישם את ממשקי HIDL הבאים:
-
ICameraProvider
: למניית מכשירים בודדים ולניהול מעמדם. -
ICameraDevice
: ממשק מכשיר המצלמה. -
ICameraDeviceSession
: ממשק ההפעלה של מכשיר המצלמה הפעיל.
יישומי HIDL לעיון זמינים עבור CameraProvider.cpp
, CameraDevice.cpp
ו- CameraDeviceSession.cpp
. היישום עוטף HALs ישנים שעדיין משתמשים ב- API מדור קודם . החל מ- Android 8.0, יישומי HAL של המצלמה חייבים להשתמש ב- API של HIDL; השימוש בממשק מדור קודם אינו נתמך.
רכיבי HAL מדור קודם
חלק זה מתאר את הארכיטקטורה של רכיבי HAL מדור קודם וכיצד ליישם את ה- HAL. יישומי HAL של מצלמות ב- Android 8.0 ואילך חייבים להשתמש ב- HIDL API במקום זאת, המתואר לעיל.
אדריכלות (מורשת)
האיור והרשימה שלהלן מתארים את רכיבי ה- HAL של המצלמה מדור קודם.

איור 2. ארכיטקטורת מצלמות מדור קודם
- מסגרת אפליקציות
- ברמת מסגרת האפליקציה נמצא קוד האפליקציה, שמשתמש ב-
android.hardware.Camera
API כדי ליצור אינטראקציה עם חומרת המצלמה. באופן פנימי, קוד זה מכנה מחלקת דבק מקבילה של JNI כדי לגשת לקוד המקורי אשר מתקשר עם המצלמה. - ג'ני
- קוד JNI המשויך ל-
android.hardware.Camera
ממוקםframeworks/base/core/jni/android_hardware_Camera.cpp
. קוד זה קורא לקוד המקורי ברמה התחתונה כדי להשיג גישה למצלמה הפיזית ומחזיר נתונים המשמשים ליצירת אובייקטandroid.hardware.Camera
ברמת המסגרת. - מסגרת מקומית
- המסגרת המקורית המוגדרת
frameworks/av/camera/Camera.cpp
מספקת מקבילה מקוריתframeworks/av/camera/Camera.cpp
android.hardware.Camera
. מחלקה זו מכנה את פרוקסי קלסר ה- IPC כדי לקבל גישה לשירות המצלמה. - כריכות IPC של קלסר
- פרוקסי קלסר ה- IPC מאפשרים תקשורת על גבולות התהליך. ישנן שלוש שיעורי קלסר למצלמות הנמצאים בספריית
frameworks/av/camera
הקוראת לשירות המצלמה.ICameraService
הוא הממשק לשירות המצלמה,ICamera
הוא הממשק למכשיר מצלמה שנפתח ספציפי, ו-ICameraClient
הוא ממשק המכשיר בחזרה למסגרת האפליקציה. - שירות מצלמות
- שירות המצלמות, הממוקם
frameworks/av/services/camera/libcameraservice/CameraService.cpp
, הוא הקוד האמיתי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
מבנה 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
.
קביעת תצורה של הספרייה המשותפת
הגדר את מערכת ה- Android build כך שתארוז נכון את יישום ה- HAL לספריה משותפת והעתק אותה למיקום המתאים על ידי יצירת קובץ Android.mk
:
- צור ספריית
device/<company_name>/<device_name>/camera
כדי להכיל את קובצי המקור של הספרייה שלך. - צור קובץ
Android.mk
לבניית הספרייה המשותפת. וודא כי הקובץ מכיל את השורות הבאות:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
יש לקרוא לספרייה שלך
camera.<device_name>
(כך.so
אוטומטית), כך ש- Android יכול לטעון נכון את הספרייה. לדוגמא, עייןhardware/ti/omap4xxx/Android.mk
מצלמת הגלקסיה נקסוס הממוקמתhardware/ti/omap4xxx/Android.mk
. - ציין כי למכשיר שלך יש תכונות מצלמה על ידי העתקת קובצי ה- XML המאפיינים הדרושים בספריית
frameworks/native/data/etc
עם קובץ ה- makefile של המכשיר שלך. לדוגמא, כדי לציין שהמכשיר שלך כולל פלאש למצלמה והוא יכול למקד אוטומטית, הוסף את השורות הבאות במכשיר הקובץ<device>/<company_name>/<device_name>/device.mk
: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
מכשיר, ראהdevice/samsung/tuna/device.mk
.device/samsung/tuna/device.mk
. -
device/<company_name>/<device_name>/media_profiles.xml
יכולות ה- Codec, הפורמט והרזולוציה של המצלמה שלךdevice/<company_name>/<device_name>/media_profiles.xml
device/<company_name>/<device_name>/media_codecs.xml
XMLdevice/<company_name>/<device_name>/media_profiles.xml
device/<company_name>/<device_name>/media_codecs.xml
. לפרטים, ראה חשיפת רכיבי codec למסגרת . - הוסף את השורות הבאות של המכשיר
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
- כדי לכלול את אפליקציית המצלמה בתמונת המערכת של המכשיר שלך, ציין אותה במשתנה
PRODUCT_PACKAGES
במכשירdevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...