تربط طبقة تجريد أجهزة الكاميرا (HAL) في Android واجهات برمجة التطبيقات (API) لإطار عمل الكاميرا عالي المستوى في Camera 2 ببرنامج تشغيل الكاميرا الأساسي وأجهزتها. يتضمّن النظام الفرعي للكاميرا عمليات تنفيذ لمكوّنات مسار الكاميرا، بينما توفّر طبقة تجريد أجهزة الكاميرا واجهات لاستخدامها في تنفيذ إصدارك من هذه المكوّنات.
هندسة معمارية
يصف الشكل والقائمة أدناه مكوّنات طبقة تجريد الأجهزة.
الشكل 1: هندسة الكاميرا
- إطار عمل التطبيق
- على مستوى إطار عمل التطبيق، يكون رمز التطبيق الذي يستخدم Camera 2 API للتفاعل مع أجهزة الكاميرا. داخليًا، يستدعي هذا الرمز واجهات Binder المقابلة للوصول إلى الرموز البرمجية الأصلية التي تتفاعل مع الكاميرا.
- لغة تعريف واجهة نظام Android (AIDL)
- يمكن العثور على واجهة الرابط المرتبطة بـ
CameraServiceفي frameworks/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
- تحدّد طبقة تجريد الأجهزة الواجهة العادية التي تستدعيها خدمة الكاميرا والتي عليك تنفيذها لكي تعمل أجهزة الكاميرا بشكلٍ صحيح.
تنفيذ طبقة تجريد الأجهزة
تقع طبقة تجريد الأجهزة بين برنامج تشغيل الكاميرا وإطار عمل Android عالي المستوى، وتحدّد واجهة عليك تنفيذها لكي تتمكّن التطبيقات من تشغيل أجهزة الكاميرا بشكلٍ صحيح. يتم تعريف واجهات HIDL لطبقة تجريد أجهزة الكاميرا في hardware/interfaces/camera.
يجب أن تنفّذ طبقة تجريد الأجهزة النموذجية المستندة إلى الرابط واجهات HIDL التالية:
-
ICameraProvider: لترقيم الأجهزة الفردية وإدارة حالتها -
ICameraDevice: واجهة جهاز الكاميرا -
ICameraDeviceSession: واجهة جلسة جهاز الكاميرا النشطة
تتوفّر عمليات تنفيذ HIDL مرجعية لـ
CameraProvider.cpp و
CameraDevice.cpp, و
CameraDeviceSession.cpp.
تتضمّن عملية التنفيذ طبقات تجريد الأجهزة القديمة التي لا تزال تستخدم
واجهة برمجة التطبيقات القديمة.
بدءًا من الإصدار 8.0 من Android، يجب أن تستخدم عمليات تنفيذ طبقة تجريد أجهزة الكاميرا واجهة برمجة تطبيقات HIDL، ولا يتوفّر استخدام الواجهة القديمة.
التحقق من الإدخال
بما أنّ طبقة تجريد الأجهزة يمكنها الوصول إلى موارد مختلفة عن خدمة الكاميرا، يتم التعامل مع الحدّ الفاصل بينهما على أنّه حدّ أمان. وهذا يعني أنّ المَعلمات التي يتم تمريرها من خدمة الكاميرا تُعتبر غير موثوق بها وغير معالَجة. لمنع الثغرات الأمنية التي تسمح للمهاجمين بتوسيع نطاق الامتيازات أو الوصول إلى البيانات التي لا يُفترض أن يتمكّنوا من الوصول إليها، يجب أن تتحقّق طبقة تجريد أجهزة الكاميرا من صحة المَعلمات التي يتم تمريرها من خدمة الكاميرا إلى طبقة تجريد الأجهزة. ويشمل ذلك التحقّق من أنّ قيم طول المخزن المؤقت ضمن النطاقات المسموح بها ومعالجة المَعلمات قبل استخدامها وقبل تمريرها إلى أجهزة أو برامج تشغيل النواة.
مكوّنات طبقة تجريد الأجهزة القديمة
يصف هذا القسم هندسة مكوّنات طبقة تجريد الأجهزة القديمة وكيفية تنفيذ طبقة تجريد الأجهزة. يجب أن تستخدم عمليات تنفيذ طبقة تجريد أجهزة الكاميرا على الإصدار 8.0 من Android والإصدارات الأحدث واجهة برمجة تطبيقات HIDL بدلاً من ذلك، كما هو موضّح أعلاه.
الهندسة المعمارية (قديمة)
يصف الشكل والقائمة أدناه مكوّنات طبقة تجريد أجهزة الكاميرا القديمة.
الشكل 2: هندسة الكاميرا القديمة
- إطار عمل التطبيق
- على مستوى إطار عمل التطبيق، يكون رمز التطبيق الذي يستخدم
android.hardware.CameraAPI للتفاعل مع أجهزة الكاميرا. داخليًا، يستدعي هذا الرمز فئة 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
- تحدّد طبقة تجريد الأجهزة الواجهة العادية التي تستدعيها خدمة الكاميرا والتي عليك تنفيذها لكي تعمل أجهزة الكاميرا بشكلٍ صحيح.
- برنامج تشغيل النواة
- يتفاعل برنامج تشغيل الكاميرا مع أجهزة الكاميرا الفعلية وعملية تنفيذك لطبقة تجريد الأجهزة. يجب أن تتوافق الكاميرا وبرنامج التشغيل مع تنسيقَي الصور YV12 وNV21 لتوفير إمكانية معاينة صورة الكاميرا على الشاشة وتسجيل الفيديو.
تنفيذ طبقة تجريد الأجهزة (قديمة)
تقع طبقة تجريد الأجهزة بين برنامج تشغيل الكاميرا وإطار عمل Android عالي المستوى، وتحدّد واجهة عليك تنفيذها لكي تتمكّن التطبيقات من تشغيل أجهزة الكاميرا بشكلٍ صحيح. يتم تعريف واجهة طبقة تجريد الأجهزة في ملفَي الرأس 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 تتضمّن مؤشرات إلى الدوال التي تنفّذ
واجهة طبقة تجريد الأجهزة. للحصول على مستندات حول مَعلمات الكاميرا التي يمكن للمطوّرين ضبطها، يُرجى الرجوع إلى frameworks/av/include/camera/CameraParameters.h.
يتم ضبط هذه المَعلمات باستخدام الدالة التي يشير إليها int
(*set_parameters)(struct camera_device *, const char *parms) في طبقة تجريد الأجهزة.
للاطّلاع على مثال على عملية تنفيذ طبقة تجريد الأجهزة، يُرجى الرجوع إلى عملية التنفيذ لطبقة تجريد الأجهزة في Galaxy Nexus في hardware/ti/omap4xxx/camera.
ضبط المكتبة المشتركة
يمكنك إعداد نظام التصميم في Android لتجميع عملية تنفيذ طبقة تجريد الأجهزة بشكلٍ صحيح في مكتبة مشتركة ونسخها إلى الموقع المناسب من خلال إنشاء ملف 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 من تحميل الـ مكتبة بشكلٍ صحيح. للاطّلاع على مثال، يُرجى الاطّلاع على ملف makefile لكاميرا Galaxy Nexus الموجود فيhardware/ti/omap4xxx/Android.mk. - حدِّد أنّ جهازك يتضمّن ميزات الكاميرا من خلال نسخ ملفات XML الضرورية للميزات في الدليل
frameworks/native/data/etcباستخدام ملف makefile الخاص بجهازك. على سبيل المثال، لتحديد أنّ جهازك يتضمّن فلاش كاميرا و يمكنه التركيز التلقائي، أضِف الأسطر التالية في ملف 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 \
للاطّلاع على مثال على ملف makefile لجهاز، يُرجى الاطّلاع على
device/samsung/tuna/device.mk. - أعلِن عن إمكانات برنامج ترميز الوسائط وتنسيقها ودقتها في الكاميرا في
device/<company_name>/<device_name>/media_profiles.xmlوdevice/<company_name>/<device_name>/media_codecs.xmlملفَي XML. للحصول على التفاصيل، يُرجى الاطّلاع على عرض برامج الترميز لإطار العمل. - أضِف الأسطر التالية في ملف 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في ملف makefile الخاص بجهازكdevice/<company>/<device>/device.mk:PRODUCT_PACKAGES := \ Gallery2 \ ...