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

الشكل 1. هندسة الكاميرا
- إطار التطبيق
- على مستوى إطار عمل التطبيق ، يوجد رمز التطبيق ، والذي يستخدم Camera 2 API للتفاعل مع أجهزة الكاميرا. داخليًا ، يستدعي هذا الرمز واجهات Binder المقابلة للوصول إلى الكود الأصلي الذي يتفاعل مع الكاميرا.
- AIDL
- يمكن العثور على واجهة الموثق المرتبطة بـ
CameraService
في framework / av / camera / aidl / android / Hardware . يستدعي الكود الذي تم إنشاؤه الرمز الأصلي ذي المستوى الأدنى للحصول على حق الوصول إلى الكاميرا الفعلية وإرجاع البيانات المستخدمة لإنشاءCameraDevice
وفي النهاية كائناتCameraCaptureSession
على مستوى إطار العمل. - الإطار الأصلي
- يوفر هذا الإطار الموجود في
frameworks/av/
مكافئًا أصليًا لفئاتCameraDevice
وCameraCaptureSession
. راجع أيضًا مرجع NDK camera2 . - بيندر 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 التالية:
-
ICameraProvider
: لتعداد الأجهزة الفردية وإدارة حالتها. -
ICameraDevice
: واجهة جهاز الكاميرا. -
ICameraDeviceSession
: واجهة جلسة جهاز الكاميرا النشطة.
تتوفر تطبيقات HIDL المرجعية لـ CameraProvider.cpp
و CameraDevice.cpp
و CameraDeviceSession.cpp
. يلتف التطبيق على HALs القديمة التي لا تزال تستخدم واجهة برمجة التطبيقات القديمة . بدءًا من Android 8.0 ، يجب أن تستخدم تطبيقات Camera HAL واجهة برمجة تطبيقات HIDL ؛ استخدام الواجهة القديمة غير مدعوم.
التحقق من صحة الإدخال
نظرًا لأن HAL لديه وصول إلى موارد مختلفة عن خدمة الكاميرا ، فإن الحد الفاصل بينهما يتم التعامل معه على أنه حد أمان. هذا يعني أن المعلمات التي تم تمريرها من خدمة الكاميرا تعتبر غير موثوقة وغير مصححة. لمنع الثغرات الأمنية التي تسمح للمهاجمين بتصعيد الامتيازات أو الوصول إلى البيانات التي لا يقصدون الوصول إليها ، يجب على الكاميرا HAL التحقق من صحة المعلمات التي تم تمريرها من خدمة الكاميرا إلى HAL. يتضمن ذلك التحقق من أن قيم طول المخزن المؤقت تقع ضمن النطاقات المسموح بها وتعقيم المعلمات قبل الاستخدام وقبل تمريرها إلى برامج تشغيل الأجهزة أو النواة.
مكونات HAL القديمة
يصف هذا القسم بنية مكونات HAL القديمة وكيفية تنفيذ HAL. يجب أن تستخدم تطبيقات Camera HAL على Android 8.0 والإصدارات الأحدث HIDL API بدلاً من ذلك ، كما هو موضح أعلاه.
العمارة (تراث)
يوضح الشكل والقائمة التاليان مكونات 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 الموثق على تسهيل الاتصال عبر حدود العملية. هناك ثلاث فئات من أدوات ربط الكاميرا موجودة في دليل
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 من تحميل المكتبة بشكل صحيح. للحصول على مثال ، راجع ملف makefile الخاص بكاميرا Galaxy Nexus الموجودة فيhardware/ti/omap4xxx/Android.mk
. - حدد أن جهازك يحتوي على ميزات الكاميرا عن طريق نسخ ملفات 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/<company_name>/<device_name>/media_profiles.xml
وdevice/<company_name>/<device_name>/media_codecs.xml
ملفات XML. للحصول على التفاصيل ، راجع تعريض برامج الترميز إلى إطار العمل . - أضف الأسطر التالية في
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
- لتضمين تطبيق الكاميرا في صورة نظام جهازك ، حدده في متغير
PRODUCT_PACKAGES
في جهازdevice/<company>/<device>/device.mk
makefile:PRODUCT_PACKAGES := \ Gallery2 \ ...