
تعمل طبقة تجريد أجهزة الكاميرا (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 التالية:
-
ICameraProvider
: لتعداد الأجهزة الفردية وإدارة حالتها. -
ICameraDevice
: واجهة جهاز الكاميرا. -
ICameraDeviceSession
: واجهة جلسة جهاز الكاميرا النشطة.
تتوفر تطبيقات 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
:
- قم بإنشاء دليل
device/<company_name>/<device_name>/camera
ليحتوي على الملفات المصدر لمكتبتك. - قم بإنشاء ملف
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
. - حدد أن جهازك يحتوي على ميزات الكاميرا عن طريق نسخ ملفات 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
. - أعلن عن برنامج ترميز الوسائط وتنسيقها وإمكانيات الدقة الخاصة بالكاميرا في ملفات XML
device/<company_name>/<device_name>/media_profiles.xml
device/<company_name>/<device_name>/media_codecs.xml
. لمزيد من التفاصيل، راجع تعريض برامج الترميز لإطار العمل . - أضف الأسطر التالية في ملف تعريف الجهاز
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
- لتضمين تطبيق الكاميرا في صورة نظام جهازك، حدده في متغير
PRODUCT_PACKAGES
في ملف تعريف جهازكdevice/<company>/<device>/device.mk
:PRODUCT_PACKAGES := \ Gallery2 \ ...