![סמל HAL של מצלמת Android](https://source.android.com/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=0000&hl=he)
שכבת ההפשטה של חומרת המצלמה (HAL) ב-Android מחברת את הרמה הגבוהה יותר ממשקי API של framework של מצלמה מצלמה 2 לחומרה ולמנהל ההתקן של המצלמה. מערכת המשנה של המצלמה כולל הטמעות של רכיבי צינור עיבוד נתונים של מצלמה, בזמן שהמצלמה עם HAL מספקת ממשקים לשימוש ביישום הגרסה שלך רכיבים.
ארכיטקטורה
האיור והרשימה הבאים מתארים את רכיבי ה-HAL.
![ארכיטקטורה של מצלמות Android](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=0000&hl=he)
איור 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 הבאים:
-
ICameraProvider
: לספירת מכשירים ספציפיים ולניהול הסטטוס שלהם. -
ICameraDevice
: הממשק של מכשיר המצלמה. -
ICameraDeviceSession
: ממשק הסשן במכשיר המצלמה הפעילה.
הטמעות של 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](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera.png?authuser=0000&hl=he)
איור 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
:
- יצירת
device/<company_name>/<device_name>/camera
כדי להכיל את קובצי המקור של הספרייה. - כדי ליצור את הספרייה המשותפת צריך ליצור קובץ
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
- כדי לציין שהמכשיר כולל תכונות מצלמה, צריך להעתיק את ה-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
- הצהרה על יכולות קודק המדיה, הפורמט והרזולוציה של המצלמה
device/<company_name>/<device_name>/media_profiles.xml
ו-device/<company_name>/<device_name>/media_codecs.xml
קובצי XML. פרטים נוספים זמינים במאמר חשיפת רכיבי קודק framework. - צריך להוסיף את השורות הבאות ל
קובץ 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
- כדי לכלול את אפליקציית המצלמה בתמונת המערכת של המכשיר, יש לציין אותה בשדה
משתנה אחד (
PRODUCT_PACKAGES
) בהגדרת המכשירdevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...