لایه انتزاعی سختافزار دوربین Android (HAL) رابطهای برنامهسازی کاربردی چارچوب دوربین سطح بالاتر در Camera 2 را به سختافزار و درایور دوربین زیرین شما متصل میکند. زیرسیستم دوربین شامل پیادهسازیهایی برای عناصر خط لوله دوربین است، درحالیکه HAL دوربین رابطهایی برای استفاده در پیادهسازی نسخه خودتان از این عناصر ارائه میدهد.
معماری
شکل و فهرست زیر اجزای HAL را توصیف میکنند:
شکل ۱. معماری دوربین.
- چارچوب برنامه
- در سطح چارچوب برنامه، کد برنامه قرار دارد که از Camera 2 API برای تعامل با سختافزار دوربین استفاده میکند. در داخل، این کد میاناهای Binder مربوطه را فراخوانی میکند تا به کد بومی که با دوربین تعامل دارد دسترسی پیدا کند.
- AIDL
- میانای چسباننده مرتبط با
CameraServiceرا میتوانید در frameworks/av/camera/aidl/android/hardware پیدا کنید. کد تولیدشده برای دسترسی به دوربین فیزیکی، کد بومی سطح پایینتر را فرا میخواند و دادههایی را برمیگرداند که برای ایجادCameraDeviceو درنهایتCameraCaptureSessionدر سطح چارچوب استفاده میشود. - چارچوب بومی
- این چارچوب که در
frameworks/av/قرار دارد، معادل بومی برایCameraDeviceوCameraCaptureSessionکلاسها ارائه میدهد. همچنین مرجع NDK camera2 را ببینید. - میانای ارتباط میان پردازشی binder
- میانای چسباننده 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 در hardware/interfaces/camera تعریف شدهاند.
«لایه انتزاع سختافزار» (HAL) نوعی که بایندرشده است باید میاناهای HIDL زیر را پیادهسازی کند:
-
ICameraProvider: برای فهرست کردن دستگاههای فردی و مدیریت وضعیت آنها. -
ICameraDevice: میانای دستگاه دوربین. -
ICameraDeviceSession: میانای جلسه دستگاه دوربین فعال.
پیادهسازیهای مرجع HIDL برای
CameraProvider.cpp،
CameraDevice.cpp، و
CameraDeviceSession.cpp دردسترس است.
این پیادهسازی HALهای قدیمی را که هنوز از
میانای برنامهسازی کاربردی قدیمی استفاده میکنند دربرمیگیرد.
از Android 8.0 به بعد، پیادهسازیهای Camera HAL باید از HIDL API استفاده کنند؛ استفاده از میانای قدیمی پشتیبانی نمیشود.
اعتبارسنجی ورودی
چون HAL به منابع متفاوتی نسبتبه سرویس دوربین دسترسی دارد، مرز بین این دو بهعنوان مرز امنیتی درنظر گرفته میشود. این یعنی پارامترهای منتقلشده از سرویس دوربین غیرقابلاعتماد و پالایشنشده درنظر گرفته میشوند. برای جلوگیری از آسیبپذیریهای امنیتی که به مهاجمان اجازه میدهد امتیازات را افزایش دهند یا به دادههایی دسترسی پیدا کنند که قرار نیست به آنها دسترسی داشته باشند، HAL دوربین باید پارامترهای منتقلشده از سرویس دوربین به HAL را اعتبارسنجی کند. این شامل بررسی مقادیر طول بافر در محدودههای مجاز و پاکسازی پارامترها قبلاز استفاده و قبلاز انتقال آنها به سختافزار یا درایورهای هسته است.
لایه انتزاع سختافزار قدیمی
این بخش معماری اجزای HAL قدیمی و نحوه پیادهسازی HAL را شرح میدهد. پیادهسازیهای Camera HAL در Android 8.0 و بالاتر باید بهجای آن از میانای برنامه کاربردی HIDL که در بالا توضیح داده شد استفاده کنند.
معماری (قدیمی)
شکل و فهرست زیر اجزای Camera 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 binder را برای دسترسی به سرویس دوربین فراخوانی میکند. - پراکسیهای IPC binder
- پراکسیهای IPC binder ارتباطات را در مرزهای فرایند تسهیل میکنند.
سه کلاس چسباننده دوربین در
frameworks/av/cameraدایرکتوری وجود دارد که سرویس دوربین را فرا میخواند.ICameraServiceمیانای سرویس دوربین است،ICameraمیانای دستگاه دوربین بازشده خاصی است، وICameraClientمیانای دستگاه برای بازگشت به چارچوب برنامه است. - سرویس دوربین
- خدمات دوربین، واقع در
frameworks/av/services/camera/libcameraservice/CameraService.cpp، کد واقعی است که با HAL تعامل دارد. - HAL
- لایه انتزاع سختافزار رابط استاندارد را تعریف میکند که سرویس دوربین با آن تماس میگیرد و شما باید آن را پیادهسازی کنید تا سختافزار دوربینتان بهدرستی کار کند.
- درایور هسته
- راهانداز دوربین با سختافزار دوربین واقعی و پیادهسازی شما از HAL تعامل دارد. دوربین و راننده باید از قالبهای تصویر YV12 و NV21 پشتیبانی کنند تا بتوانند از پیشنمایش تصویر دوربین در نمایشگر و ضبط ویدیو پشتیبانی کنند.
پیادهسازی لایه انتزاع سختافزار (قدیمی)
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با فایل ساخت دستگاهتان، مشخص کنید که دستگاهتان ویژگیهای دوربین را دارد. برای مثال، برای مشخص کردن اینکه دستگاهتان فلاش دوربین دارد و میتواند فوکوس خودکار داشته باشد، خطوط زیر را در<device>/<company_name>/<device_name>/device.mkmakefile دستگاهتان اضافه کنید: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.xmlXML اعلام کنید. برای جزئیات، به نمایش کدکها در چارچوب مراجعه کنید. - خطوط زیر را در
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.mkmakefile دستگاهتان مشخص کنید:PRODUCT_PACKAGES := \ Gallery2 \ ...