الكاميرا

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

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

هندسة معمارية

يصف الشكل والقائمة أدناه مكوّنات طبقة تجريد الأجهزة.

بنية كاميرا Android

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

تتوفّر عمليات تنفيذ HIDL مرجعية لـ CameraProvider.cpp و CameraDevice.cpp, و CameraDeviceSession.cpp. تتضمّن عملية التنفيذ طبقات تجريد الأجهزة القديمة التي لا تزال تستخدم واجهة برمجة التطبيقات القديمة. بدءًا من الإصدار 8.0 من Android، يجب أن تستخدم عمليات تنفيذ طبقة تجريد أجهزة الكاميرا واجهة برمجة تطبيقات HIDL، ولا يتوفّر استخدام الواجهة القديمة.

التحقق من الإدخال

بما أنّ طبقة تجريد الأجهزة يمكنها الوصول إلى موارد مختلفة عن خدمة الكاميرا، يتم التعامل مع الحدّ الفاصل بينهما على أنّه حدّ أمان. وهذا يعني أنّ المَعلمات التي يتم تمريرها من خدمة الكاميرا تُعتبر غير موثوق بها وغير معالَجة. لمنع الثغرات الأمنية التي تسمح للمهاجمين بتوسيع نطاق الامتيازات أو الوصول إلى البيانات التي لا يُفترض أن يتمكّنوا من الوصول إليها، يجب أن تتحقّق طبقة تجريد أجهزة الكاميرا من صحة المَعلمات التي يتم تمريرها من خدمة الكاميرا إلى طبقة تجريد الأجهزة. ويشمل ذلك التحقّق من أنّ قيم طول المخزن المؤقت ضمن النطاقات المسموح بها ومعالجة المَعلمات قبل استخدامها وقبل تمريرها إلى أجهزة أو برامج تشغيل النواة.

مكوّنات طبقة تجريد الأجهزة القديمة

يصف هذا القسم هندسة مكوّنات طبقة تجريد الأجهزة القديمة وكيفية تنفيذ طبقة تجريد الأجهزة. يجب أن تستخدم عمليات تنفيذ طبقة تجريد أجهزة الكاميرا على الإصدار 8.0 من Android والإصدارات الأحدث واجهة برمجة تطبيقات HIDL بدلاً من ذلك، كما هو موضّح أعلاه.

الهندسة المعمارية (قديمة)

يصف الشكل والقائمة أدناه مكوّنات طبقة تجريد أجهزة الكاميرا القديمة.

بنية كاميرا Android

الشكل 2: هندسة الكاميرا القديمة

إطار عمل التطبيق
على مستوى إطار عمل التطبيق، يكون رمز التطبيق الذي يستخدم android.hardware.Camera API للتفاعل مع أجهزة الكاميرا. داخليًا، يستدعي هذا الرمز فئة 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:

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

  4. أعلِن عن إمكانات برنامج ترميز الوسائط وتنسيقها ودقتها في الكاميرا في device/<company_name>/<device_name>/media_profiles.xml و device/<company_name>/<device_name>/media_codecs.xml ملفَي 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 في ملف makefile الخاص بجهازك device/<company>/<device>/device.mk:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...