تربط طبقة التجريد (HAL) لأجهزة الكاميرا في Android الأجهزة ذات المستوى الأعلى واجهات برمجة التطبيقات لإطار عمل الكاميرا في كاميرا 2 إلى برنامج تشغيل الكاميرا الأساسية والجهازها. النظام الفرعي للكاميرا يتضمّن عمليات تنفيذ لمكونات خط أنابيب الكاميرا بينما يتضمّن طبقة تجريد الأجهزة (HAL) للكاميرا توفر واجهات لاستخدامها في تنفيذ إصدارك من هذه والمكونات.
هندسة معمارية
يوضح الشكل والقائمة التاليان مكونات HAL.
- إطار عمل التطبيق
- على مستوى إطار عمل التطبيق، يتوفّر رمز التطبيق الذي يستخدم 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 التالية:
-
ICameraProvider
: لتعداد الأجهزة الفردية وإدارة حالتها -
ICameraDevice
: واجهة جهاز الكاميرا. -
ICameraDeviceSession
: واجهة جلسة جهاز الكاميرا النشطة.
تتوفّر عمليات تنفيذ شهادة 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.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
:
- إنشاء
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
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
) لنسخ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 \ ...