الكاميرا

رمز طبقة تجريد أجهزة الكاميرا في Android

تعمل طبقة تجريد أجهزة الكاميرا (HAL) في نظام التشغيل Android على ربط واجهات برمجة التطبيقات لإطار عمل الكاميرا ذات المستوى الأعلى في Camera 2 ببرنامج تشغيل الكاميرا والأجهزة الأساسية. يتضمّن نظام الكاميرا الفرعي عمليات تنفيذ لمكوّنات مسار الكاميرا، بينما يوفّر طبقة تجريد الأجهزة (HAL) الخاصة بالكاميرا واجهات لاستخدامها في تنفيذ إصدارك من هذه المكوّنات.

البنية

يوضّح الشكل والقائمة التاليان مكوّنات طبقة تجريد الأجهزة (HAL).

بنية الكاميرا في Android

الشكل 1. بنية الكاميرا

إطار عمل التطبيق
على مستوى إطار عمل التطبيق، يوجد رمز التطبيق الذي يستخدم واجهة برمجة التطبيقات Camera 2 للتفاعل مع أجهزة الكاميرا. داخليًا، يستدعي هذا الرمز البرمجي واجهات Binder المقابلة للوصول إلى الرمز البرمجي الأصلي الذي يتفاعل مع الكاميرا.
AIDL
يمكن العثور على واجهة الرابط المرتبطة بـ CameraService في frameworks/av/camera/aidl/android/hardware. يستدعي الرمز البرمجي الذي تم إنشاؤه الرمز البرمجي الأصلي ذي المستوى الأدنى للحصول على إذن الوصول إلى الكاميرا المادية، ويعرض البيانات التي تُستخدم لإنشاء الكائنين CameraDevice و CameraCaptureSession في النهاية على مستوى إطار العمل.
إطار عمل أصلي
يوفر هذا الإطار، المتوفّر في frameworks/av/، مكافئًا أصليًا للفئتين CameraDevice و CameraCaptureSession. يمكنك أيضًا الاطّلاع على مرجع camera2 في حزمة تطوير البرامج الأصلية (NDK).
واجهة Binder IPC
تسهّل واجهة IPC binder التواصل عبر حدود العمليات. تتوفّر عدة فئات لربط الكاميرا في الدليل frameworks/av/camera/camera/aidl/android/hardware الذي يستدعي خدمة الكاميرا. 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 الموضّحة أعلاه.

البنية (قديمة)

يوضّح الشكل والقائمة التاليان مكوّنات HAL القديمة للكاميرا.

بنية الكاميرا في Android

الشكل 2. بنية الكاميرا القديمة

إطار عمل التطبيق
على مستوى إطار عمل التطبيق، يوجد رمز التطبيق الذي يستخدم واجهة برمجة التطبيقات android.hardware.Camera للتفاعل مع أجهزة الكاميرا. داخليًا، يستدعي هذا الرمز فئة JNI glue المقابلة للوصول إلى الرمز البرمجي الأصلي الذي يتفاعل مع الكاميرا.
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) في Binder
تسهّل وكلاء IPC binder عملية التواصل عبر حدود العمليات. تتوفّر ثلاث فئات لربط الكاميرا في الدليل 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:

  1. أنشِئ دليلاً device/<company_name>/<device_name>/camera يحتوي على ملفات المصدر الخاصة بالمكتبة.
  2. أنشئ ملف 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.

  3. حدِّد أنّ جهازك يتضمّن ميزات كاميرا من خلال نسخ ملفات XML الخاصة بالميزات الضرورية إلى الدليل frameworks/native/data/etc باستخدام ملف makefile الخاص بجهازك. على سبيل المثال، لتحديد أنّ جهازك مزوّد بفلاش كاميرا ويمكنه التركيز التلقائي، أضِف الأسطر التالية إلى ملف <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 \
    

    للاطّلاع على مثال على ملف makefile لجهاز، يُرجى الانتقال إلى device/samsung/tuna/device.mk.

  4. حدِّد إمكانات ترميز الوسائط وتنسيقها ودقتها في الكاميرا في ملفَي XML الخاصَين بـ device/<company_name>/<device_name>/media_profiles.xml وdevice/<company_name>/<device_name>/media_codecs.xml. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة إتاحة برامج الترميز للإطار.
  5. أضِف الأسطر التالية إلى ملف 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
    
  6. لتضمين تطبيق "الكاميرا" في صورة نظام جهازك، حدِّده في المتغيّر PRODUCT_PACKAGES في ملف device/<company>/<device>/device.mk makefile الخاص بجهازك:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...