تربط طبقة تجريد أجهزة الكاميرا (HAL) في Android واجهات برمجة التطبيقات (API) لإطار عمل الكاميرا عالي المستوى في Camera 2 ببرنامج تشغيل الكاميرا الأساسي وأجهزتها. يتضمّن النظام الفرعي للكاميرا عمليات تنفيذ لمكوّنات مسار الكاميرا، بينما توفّر طبقة تجريد أجهزة الكاميرا واجهات لاستخدامها في تنفيذ إصدارك من هذه المكوّنات.
هندسة معمارية
يصف الشكل والقائمة أدناه مكوّنات طبقة تجريد الأجهزة:
الشكل 1: هندسة معمارية للكاميرا
- إطار عمل التطبيق
- على مستوى إطار عمل التطبيق، يكون رمز التطبيق الذي يستخدم Camera 2 API للتفاعل مع أجهزة الكاميرا. داخليًا، يستدعي هذا الرمز واجهات Binder المقابلة للوصول إلى الرمز البرمجي الأصلي الذي يتفاعل مع الكاميرا.
- لغة تعريف واجهة نظام Android (AIDL)
- يمكن العثور على واجهة Binder المرتبطة بـ
CameraServiceفي frameworks/av/camera/aidl/android/hardware. يستدعي الرمز البرمجي الذي تم إنشاؤه الرمز البرمجي الأصلي من المستوى الأدنى للوصول إلى الـ كاميرا الفعلية ويعرض البيانات التي تُستخدَم لإنشاء الـCameraDeviceوفي النهاية الـCameraCaptureSessionعلى مستوى إطار العمل. - إطار العمل الأصلي
- يوفّر إطار العمل هذا، الذي يقع في
frameworks/av/، بديلاً أصليًا لفئتَيCameraDeviceوCameraCaptureSessionيمكنك أيضًا الاطّلاع على مرجع NDK camera2. - واجهة Binder للتواصل بين العمليات
- تسهّل واجهة Binder للتواصل بين العمليات التواصل بين حدود العمليات.
هناك عدة فئات Binder للكاميرا تقع في الدليل
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.
يجب أن تنفّذ طبقة تجريد الأجهزة النموذجية المستندة إلى Binder واجهات HIDL التالية:
-
ICameraProvider: لترقيم الأجهزة الفردية وإدارة حالتها -
ICameraDevice: واجهة جهاز الكاميرا -
ICameraDeviceSession: واجهة جلسة جهاز الكاميرا النشطة
تتوفّر عمليات تنفيذ HIDL مرجعية لـ
CameraProvider.cpp و
CameraDevice.cpp, و
CameraDeviceSession.cpp.
تغطي عملية التنفيذ طبقات تجريد الأجهزة القديمة التي لا تزال تستخدم الـ
legacy API.
بدءًا من Android 8.0، يجب أن تستخدم عمليات تنفيذ طبقة تجريد أجهزة الكاميرا واجهة برمجة تطبيقات HIDL، ولا يُسمح باستخدام الواجهة القديمة.
التحقق من الإدخال
بما أنّ طبقة تجريد الأجهزة يمكنها الوصول إلى موارد مختلفة عن خدمة الكاميرا، يتم التعامل مع الحدود بينهما على أنّها حدود أمان. وهذا يعني أنّ المَعلمات التي يتم تمريرها من خدمة الكاميرا تُعتبر غير موثوق بها وغير معالَجة. لمنع الثغرات الأمنية التي تسمح للمهاجمين بتوسيع نطاق الامتيازات أو الوصول إلى البيانات التي لا يُفترض أن يتمكنوا من الوصول إليها، يجب أن تتحقق طبقة تجريد أجهزة الكاميرا من صحة المَعلمات التي يتم تمريرها من خدمة الكاميرا إلى طبقة تجريد الأجهزة. ويشمل ذلك التحقّق من أنّ قيم طول المخزن المؤقت تقع ضمن النطاقات المسموح بها ومعالجة المَعلمات قبل استخدامها وقبل تمريرها إلى برامج تشغيل الأجهزة أو النواة.
طبقة تجريد الأجهزة القديمة
يصف هذا القسم هندسة مكوّنات طبقة تجريد الأجهزة القديمة وكيفية تنفيذ طبقة تجريد الأجهزة. يجب أن تستخدم عمليات تنفيذ طبقة تجريد أجهزة الكاميرا على Android 8.0 والإصدارات الأحدث واجهة برمجة تطبيقات 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. تستدعي هذه الفئة وكلاء Binder للتواصل بين العمليات للوصول إلى خدمة الكاميرا. - وكلاء Binder للتواصل بين العمليات
- تسهّل وكلاء Binder للتواصل بين العمليات التواصل بين حدود العمليات.
هناك ثلاث فئات Binder للكاميرا تقع في الدليل
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لإنشاء المكتبة المشتركة. تأكَّد من أنّ ملف Make يحتوي على الأسطر التالية: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باستخدام ملف Make الخاص بجهازك. على سبيل المثال، لتحديد أنّ جهازك يتضمّن فلاش كاميرا و يمكنه التركيز التلقائي، أضِف الأسطر التالية في ملف Make الخاص بجهازك<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. - أعلِن عن إمكانات برنامج ترميز الوسائط وتنسيقها ودقتها في الكاميرا في
device/<company_name>/<device_name>/media_profiles.xmlوdevice/<company_name>/<device_name>/media_codecs.xmlملفَي XML. للحصول على التفاصيل، يُرجى الاطّلاع على عرض برامج الترميز لإطار العمل. - أضِف الأسطر التالية في ملف Make الخاص بجهازك
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في ملف Make الخاص بجهازكdevice/<company>/<device>/device.mk:PRODUCT_PACKAGES := \ Gallery2 \ ...