![رمز Android Camera HAL](https://source.android.com/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=0&hl=ar)
تربط طبقة HAL لأجهزة الكاميرا في Android واجهات برمجة التطبيقات ذات المستوى الأعلى لإطار عمل الكاميرا في Camera 2 ببرنامج تشغيل الكاميرا والأجهزة الأساسية. يتضمّن النظام الفرعي للكاميرا عمليات تنفيذ لمكونات مسار الكاميرا، في حين يوفّر HAL للكاميرا واجهات لاستخدامها في تنفيذ إصدارك من هذه المكونات.
هندسة معمارية
يوضّح الشكل والقائمة التاليان مكوّنات HAL.
![بنية كاميرا Android](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=0&hl=ar)
الشكل 1: بنية الكاميرا
- إطار عمل التطبيق
- على مستوى إطار عمل التطبيق، يتوفّر رمز التطبيق الذي يستخدم واجهة برمجة التطبيقات Camera 2 للتفاعل مع أجهزة الكاميرا. داخليًا، يُطلِق هذا الرمز البرمجي واجهات Binder المقابلة للوصول إلى الرمز البرمجي الأصلي الذي يتفاعل مع الكاميرا.
- لغة تعريف الهوية (AIDL)
- يمكن العثور على واجهة الربط المرتبطة بـ
CameraService
في frameworks/av/camera/aidl/android/hardware. تستدعي التعليمة البرمجية التي تم إنشاؤها الرمز البرمجي الأصلي من المستوى الأدنى للحصول على إذن بالوصول إلى الكاميرا الفعلية، وتُرجع البيانات التي يتم استخدامها لإنشاءCameraDevice
وفي النهايةCameraCaptureSession
الأجسام على مستوى الإطار. - إطار عمل أصلي
- يوفّر هذا الإطار الذي يقيم في
frameworks/av/
مكافئًا أصليًا لفئةCameraDevice
وفئةCameraCaptureSession
. يُرجى الاطّلاع أيضًا على مرجع NDK camera2. - واجهة IPC الخاصة ببرنامج Binder
- تسهِّل واجهة رابط IPC عملية التواصل عبر حدود العملية.
هناك عدة فئات لرابط الكاميرا في ملف
frameworks/av/camera/camera/aidl/android/hardware
directory التي تتصل بخدمة الكاميرا.ICameraService
هي واجهة خدمة الكاميرا،ICameraDeviceUser
هي واجهة جهاز كاميرا معيّن تم فتحه،ICameraServiceListener
وICameraDeviceCallbacks
هماCameraService
وCameraDevice
المخصّصان لإطار عمل التطبيق. - خدمة الكاميرا
- خدمة الكاميرا، المتوفّرة فيملف
frameworks/av/services/camera/libcameraservice/CameraService.cpp
، هي الرمز البرمجي الفعلي الذي يتفاعل مع HAL. - HAL
- تحدِّد طبقة تجريد الأجهزة الواجهة العادية التي تُستخدَم في خدمة الكاميرا والتي يجب تنفيذها لكي تعمل كاميرا الأجهزة بشكل صحيح.
تنفيذ HAL
يقع HAL بين برنامج تشغيل الكاميرا وإطار عمل Android الأعلى مستوى، ويحدِّد واجهة يجب تنفيذها لكي تتمكّن التطبيقات من تشغيل مكونات الكاميرا بشكلٍ صحيح. يتم تحديد واجهات HIDL لطبقة HAL للكاميرا في hardware/interfaces/camera.
يجب أن تنفّذ واجهة HAL المعتادة المستندة إلى Binder واجهات HIDL التالية:
-
ICameraProvider
: لتعداد الأجهزة الفردية وإدارة حالتها. -
ICameraDevice
: واجهة جهاز الكاميرا -
ICameraDeviceSession
: واجهة جلسة جهاز الكاميرا النشطة.
تتوفّر عمليات التنفيذ المرجعية لنظام HIDL لـ
CameraProvider.cpp
و
CameraDevice.cpp
وCameraDeviceSession.cpp
.
ويُغلِف التنفيذ واجهات HAL القديمة التي لا تزال تستخدم
واجهة برمجة التطبيقات القديمة.
بدءًا من الإصدار 8.0 من Android، يجب أن تستخدم عمليات تنفيذ Camera HAL واجهة برمجة التطبيقات HIDL، ولا يُسمح باستخدام الواجهة القديمة.
التحقّق من صحة البيانات المُدخَلة
بما أنّ HAL يمكنه الوصول إلى موارد مختلفة عن خدمة الكاميرا، يتم التعامل مع الحدود بين الخدمتَين على أنّها حدود أمان. وهذا يعني أنّه يتم اعتبار المَعلمات التي يتم تمريرها من خدمة الكاميرا غير موثوق بها وغير محصَّنة. لمنع الثغرات الأمنية التي تسمح للمهاجمين بالحصول على امتيازات أعلى أو الوصول إلى بيانات لا يُسمح لهم بالوصول إليها، يجب أن تُجري HAL للكاميرا عملية التحقّق من المَعلمات التي يتم تمريرها من خدمة الكاميرا إلى HAL. ويشمل ذلك التحقّق من أنّ قيم طول ملف التخزين المؤقت ضمن النطاقات المسموح بها وتطهير المَعلمات قبل استخدامها وقبل إرسالها إلى برامج تشغيل الأجهزة أو النواة.
مكونات HAL القديمة
يصف هذا القسم بنية مكوّنات HAL القديمة وكيفية تنفيذ HAL. يجب أن تستخدم عمليات تنفيذ HAL للكاميرا على الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث واجهة برمجة التطبيقات HIDL API بدلاً من واجهة برمجة التطبيقات الموضّحة أعلاه.
البنية (قديمة)
يوضّح الشكل والقائمة التاليان مكوّنات HAL القديمة للكاميرا.
![بنية كاميرا Android](https://source.android.com/static/docs/core/camera/images/ape_fwk_camera.png?authuser=0&hl=ar)
الشكل 2: بنية الكاميرا القديمة
- إطار عمل التطبيق
- على مستوى إطار عمل التطبيق، يتوفّر رمز التطبيق الذي يستخدم واجهة برمجة التطبيقات
android.hardware.Camera
للتفاعل مع أجهزة الكاميرا. داخليًا، تستدعي هذه التعليمة البرمجية فئة JNI glue class المقابلة للوصول إلى الرمز البرمجي الأصلي الذي يتفاعل مع الكاميرا. - 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 بين برنامج تشغيل الكاميرا وإطار عمل 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، يمكنك الرجوع إلى عملية تنفيذ HAL لجهاز
Galaxy Nexus في hardware/ti/omap4xxx/camera
.
ضبط المكتبة المشتركة
إعداد نظام إنشاء Android لحزمة تنفيذ HAL بشكلٍ صحيح
في مكتبة مشترَكة ونسخها إلى الموقع المناسب من خلال إنشاءملف
Android.mk
:
- أنشئ
device/<company_name>/<device_name>/camera
مجلدًا يحتوي على ملفات مصدر مكتبتك. - أنشئ ملف
Android.mk
لإنشاء المكتبة المشتركة. تأكَّد مما يلي: يحتوي ملف makefile على السطور التالية:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
يجب أن يكون اسم مكتبتك
camera.<device_name>
(يتم إلحاق.so
تلقائيًا)، حتى يتمكّن Android من تحميل مكتبة بشكل صحيح. على سبيل المثال، يمكنك الاطّلاع على ملف make لكاميرا Galaxy Nexus فيملف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 \
للحصول على مثال على ملف make الخاص بالجهاز، يُرجى الاطّلاع على
device/samsung/tuna/device.mk
. - حدِّد قدرات ترميز الوسائط وتنسيقها ودرجة دقتها في ملفَي XML
device/<company_name>/<device_name>/media_profiles.xml
وdevice/<company_name>/<device_name>/media_codecs.xml
. لمعرفة التفاصيل، يُرجى الاطّلاع على مقالة إتاحة برامج الترميز لإطار العمل. - أضِف الأسطر التالية فيملف
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
فيملف ملف بدء compilation ملف بدء compilationdevice/<company>/<device>/device.mk
على جهازك:PRODUCT_PACKAGES := \ Gallery2 \ ...