Google is committed to advancing racial equity for Black communities. See how.
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

الة تصوير

رمز Android Camera HAL

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

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

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

هندسة كاميرا Android

الشكل 1. هندسة الكاميرا

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

يجب أن تقوم طبقة تجريد الأجهزة ذات الروابط النموذجية بتنفيذ واجهات HIDL التالية:

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

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

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

العمارة (تراث)

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

هندسة كاميرا 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 Binder للحصول على حق الوصول إلى خدمة الكاميرا.
وكلاء IPC الموثق
تعمل وكلاء IPC الموثق على تسهيل الاتصال عبر حدود العملية. توجد ثلاث فئات من روابط الكاميرا موجودة في دليل 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 دليل device/<company_name>/<device_name>/camera لاحتواء الملفات المصدر لمكتبتك.
  2. قم بإنشاء ملف Android.mk لإنشاء المكتبة المشتركة. تأكد من أن ملف makefile يحتوي على الأسطر التالية:
    LOCAL_MODULE := camera.<device_name>
    LOCAL_MODULE_RELATIVE_PATH := hw
    

    يجب تسمية المكتبة camera.<device_name> ( .so يتم إلحاق تلقائيا)، لذلك الروبوت يمكن تحميل المكتبة بشكل صحيح. على سبيل المثال ، راجع ملف makefile الخاص بكاميرا 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 جهاز ، راجع device/samsung/tuna/device.mk .

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