الكاميرا

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

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

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

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

بنية كاميرا Android

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

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

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

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

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

يصف هذا القسم هندسة مكوّنات طبقة تجريد الأجهزة القديمة وكيفية تنفيذ طبقة تجريد الأجهزة. يجب أن تستخدم عمليات تنفيذ طبقة تجريد أجهزة الكاميرا على Android 8.0 والإصدارات الأحدث واجهة برمجة تطبيقات 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. تستدعي هذه الفئة وكلاء 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:

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

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

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