الكاميرا

أيقونة كاميرا أندرويد HAL

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

بنيان

يصف الشكل والقائمة التالية مكونات HAL.

بنية كاميرا أندرويد

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

إطار التطبيق
على مستوى إطار عمل التطبيق، يوجد رمز التطبيق، الذي يستخدم Camera 2 API للتفاعل مع أجهزة الكاميرا. داخليًا، يستدعي هذا الكود واجهات Binder المقابلة للوصول إلى الكود الأصلي الذي يتفاعل مع الكاميرا.
AIDL
يمكن العثور على واجهة الموثق المرتبطة بـ CameraService على Frameworks/av/camera/aidl/android/hardware . تستدعي التعليمات البرمجية التي تم إنشاؤها التعليمات البرمجية الأصلية ذات المستوى الأدنى للوصول إلى الكاميرا الفعلية وإرجاع البيانات المستخدمة لإنشاء كائنات CameraDevice وفي النهاية CameraCaptureSession على مستوى إطار العمل.
الإطار الأصلي
يوفر إطار العمل الموجود في frameworks/av/ مكافئًا أصليًا لفئتي CameraDevice و CameraCaptureSession . انظر أيضًا مرجع كاميرا NDK2 .
واجهة 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 بين برنامج تشغيل الكاميرا وإطار عمل Android عالي المستوى ويحدد الواجهة التي يجب عليك تنفيذها حتى تتمكن التطبيقات من تشغيل أجهزة الكاميرا بشكل صحيح. يتم تعريف واجهات HIDL الخاصة بـ Camera HAL في الأجهزة/الواجهات/الكاميرا .

يجب أن يقوم HAL الموثق النموذجي بتنفيذ واجهات HIDL التالية:

تتوفر تطبيقات HIDL المرجعية لـ CameraProvider.cpp و CameraDevice.cpp و CameraDeviceSession.cpp . يغلف التنفيذ شرائح HAL القديمة التي لا تزال تستخدم واجهة برمجة التطبيقات القديمة . بدءًا من Android 8.0، يجب أن تستخدم تطبيقات Camera HAL واجهة برمجة تطبيقات HIDL؛ استخدام الواجهة القديمة غير مدعوم.

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

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

مكونات HAL القديمة

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

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

يصف الشكل والقائمة التاليان مكونات HAL للكاميرا القديمة.

بنية كاميرا أندرويد

الشكل 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 Binder للوصول إلى خدمة الكاميرا.
وكلاء IPC الموثق
تعمل وكلاء IPC Binder على تسهيل الاتصال عبر حدود العملية. توجد ثلاث فئات لرابط الكاميرا موجودة في دليل frameworks/av/camera الذي يستدعي خدمة الكاميرا. ICameraService هي الواجهة لخدمة الكاميرا، و ICamera هي الواجهة لجهاز كاميرا مفتوح محدد، و ICameraClient هي واجهة الجهاز التي تعود إلى إطار عمل التطبيق.
خدمة الكاميرا
خدمة الكاميرا، الموجودة في frameworks/av/services/camera/libcameraservice/CameraService.cpp ، هي الكود الفعلي الذي يتفاعل مع 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، راجع تنفيذ Galaxy Nexus HAL في 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 من تحميل المكتبة بشكل صحيح. على سبيل المثال، راجع ملف التكوين الخاص بكاميرا 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 \
    

    للحصول على مثال لملف تكوين الجهاز، راجع 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.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 :
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...