الكاميرا

رمز Android Camera HAL

تربط طبقة 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. يُرجى الاطّلاع أيضًا على مرجع 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 التالية:

تتوفّر عمليات التنفيذ المرجعية لنظام 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

الشكل 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:

  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 من تحميل مكتبة بشكل صحيح. على سبيل المثال، يمكنك الاطّلاع على ملف make لكاميرا Galaxy Nexus فيملف hardware/ti/omap4xxx/Android.mk.

  3. حدِّد أنّ جهازك يتضمّن ميزات الكاميرا من خلال نسخ ملفات 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.

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