الكاميرا

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

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

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

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

بنية كاميرا Android

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

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

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

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

التحقّق من صحة البيانات المدخَلة

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

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

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

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

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

بنية كاميرا Android

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

إطار عمل التطبيق
على مستوى إطار عمل التطبيق، يتوفّر رمز التطبيق الذي يستخدم android.hardware.Camera واجهة برمجة التطبيقات للتفاعل مع معدّات الكاميرا. داخليًا، تستدعي هذه التعليمة البرمجية فئة غراء 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 لـ binder
تُسهل الخوادم الوكيلة لحافظة IPC الاتصال عبر حدود العملية. هناك ثلاث فئات لحافظة الكاميرا موجودة في دليل frameworks/av/camera الذي يتصل بخدمة الكاميرا. ICameraService هي واجهة خدمة الكاميرا، ICamera هي واجهة لجهاز كاميرا مفتوح محدد، وICameraClient هي واجهة الجهاز التي تعود إلى إطار عمل التطبيق.
خدمة الكاميرا
خدمة الكاميرا المتوفّرة في frameworks/av/services/camera/libcameraservice/CameraService.cpp, هي التعليمة البرمجية الفعلية التي تتفاعل مع HAL.
HAL
تحدد طبقة تجريد الأجهزة الواجهة القياسية التي بمكالمات خدمة الكاميرا وينبغي أن تنفّذها لتثبيت الكاميرا عمل الأجهزة بشكل صحيح.
برنامج تشغيل kernel
يتفاعل برنامج تشغيل الكاميرا مع جهاز الكاميرا الفعلي تنفيذ اتفاقية 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 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 \
    

    للاطّلاع على مثال على ملف تصميم الجهاز، راجِع device/samsung/tuna/device.mk

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