
لایه انتزاعی سختافزار دوربین اندروید (HAL) رابطهای برنامهنویسی کاربردی (API) چارچوب دوربین سطح بالاتر در Camera 2 را به درایور و سختافزار دوربین شما متصل میکند. زیرسیستم دوربین شامل پیادهسازیهایی برای اجزای خط لوله دوربین است، در حالی که HAL دوربین رابطهایی را برای استفاده در پیادهسازی نسخه شما از این اجزا فراهم میکند.
معماری
شکل و لیست زیر اجزای HAL را شرح میدهد.

شکل ۱. معماری دوربین
- چارچوب برنامه
- در سطح چارچوب برنامه، کد برنامه قرار دارد که از Camera 2 API برای تعامل با سختافزار دوربین استفاده میکند. در داخل، این کد رابطهای Binder مربوطه را فراخوانی میکند تا به کد بومی که با دوربین تعامل دارد، دسترسی پیدا کند.
- آیدل
- رابط اتصالدهنده مرتبط با
CameraServiceرا میتوان در frameworks/av/camera/aidl/android/hardware یافت. کد تولید شده، کد بومی سطح پایینتر را برای دسترسی به دوربین فیزیکی فراخوانی میکند و دادههایی را که برای ایجاد اشیاءCameraDeviceو در نهایتCameraCaptureSessionدر سطح چارچوب استفاده میشود، برمیگرداند. - چارچوب بومی
- این چارچوب که در
frameworks/av/قرار دارد، معادل بومی کلاسهایCameraDeviceوCameraCaptureSessionرا ارائه میدهد. همچنین به مرجع camera2 مربوط به 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 بین درایور دوربین و چارچوب سطح بالاتر اندروید قرار میگیرد و رابطی را تعریف میکند که شما باید آن را پیادهسازی کنید تا برنامهها بتوانند به درستی سختافزار دوربین را اداره کنند. رابطهای HIDL برای Camera HAL در hardware/interfaces/camera تعریف شدهاند.
یک HAL بایندری شده معمولی باید رابطهای HIDL زیر را پیادهسازی کند:
-
ICameraProvider: برای شمارش دستگاههای تکی و مدیریت وضعیت آنها. -
ICameraDevice: رابط دستگاه دوربین. -
ICameraDeviceSession: رابط کاربری جلسه دستگاه دوربین فعال.
پیادهسازیهای مرجع HIDL برای CameraProvider.cpp ، CameraDevice.cpp و CameraDeviceSession.cpp در دسترس هستند. این پیادهسازی، HALهای قدیمی را که هنوز از API قدیمی استفاده میکنند، در بر میگیرد. با شروع از اندروید ۸.۰، پیادهسازیهای Camera HAL باید از API HIDL استفاده کنند؛ استفاده از رابط قدیمی پشتیبانی نمیشود.
اعتبارسنجی ورودی
از آنجا که HAL به منابع متفاوتی نسبت به سرویس دوربین دسترسی دارد، مرز بین این دو به عنوان یک مرز امنیتی در نظر گرفته میشود. این بدان معناست که پارامترهای ارسالی از سرویس دوربین، غیرقابل اعتماد و پاکسازی نشده در نظر گرفته میشوند. برای جلوگیری از آسیبپذیریهای امنیتی که به مهاجمان اجازه میدهد امتیازات خود را افزایش دهند یا به دادههایی که قرار نیست به آنها دسترسی داشته باشند، دسترسی پیدا کنند، HAL دوربین باید پارامترهای ارسالی از سرویس دوربین به HAL را اعتبارسنجی کند. این شامل بررسی این موضوع است که مقادیر طول بافر در محدوده مجاز باشند و پارامترها را قبل از استفاده و قبل از ارسال آنها به درایورهای سختافزاری یا هسته، پاکسازی کند.
اجزای قدیمی HAL
این بخش معماری اجزای قدیمی HAL و نحوه پیادهسازی HAL را شرح میدهد. پیادهسازیهای HAL دوربین در اندروید ۸.۰ و بالاتر باید به جای آن از API HIDL که در بالا توضیح داده شد، استفاده کنند.
معماری (میراث)
شکل و لیست زیر اجزای HAL دوربین قدیمی را شرح میدهد.

شکل ۲. معماری دوربینهای قدیمی
- چارچوب برنامه
- در سطح چارچوب برنامه، کد برنامه قرار دارد که از API مربوط به
android.hardware.Cameraبرای تعامل با سختافزار دوربین استفاده میکند. در داخل، این کد یک کلاس JNI glue مربوطه را فراخوانی میکند تا به کد native که با دوربین تعامل دارد، دسترسی پیدا کند. - جی ان آی
- کد JNI مرتبط با
android.hardware.Cameraدرframeworks/base/core/jni/android_hardware_Camera.cppقرار دارد. این کد، کد native سطح پایینتر را برای دسترسی به دوربین فیزیکی فراخوانی میکند و دادههایی را که برای ایجاد شیء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 بین درایور دوربین و چارچوب سطح بالاتر اندروید قرار میگیرد و رابطی را تعریف میکند که شما باید آن را پیادهسازی کنید تا برنامهها بتوانند به درستی سختافزار دوربین را اداره کنند. رابط 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، به پیادهسازی HAL برای Galaxy Nexus در hardware/ti/omap4xxx/camera مراجعه کنید.
پیکربندی کتابخانه مشترک
سیستم ساخت اندروید را طوری تنظیم کنید که پیادهسازی 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به طور خودکار اضافه میشود)، تا اندروید بتواند کتابخانه را به درستی بارگذاری کند. برای مثال، به فایل makefile مربوط به دوربین گلکسی نکسوس که درhardware/ti/omap4xxx/Android.mkقرار دارد، مراجعه کنید. - با کپی کردن فایلهای XML مربوط به ویژگیهای دوربین در دایرکتوری
frameworks/native/data/etcبه همراه فایل makefile دستگاه خود، مشخص کنید که دستگاه شما دارای ویژگیهای دوربین است. به عنوان مثال، برای مشخص کردن اینکه دستگاه شما دارای فلش دوربین است و میتواند فوکوس خودکار داشته باشد، خطوط زیر را در فایل 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اعلام کنید. برای جزئیات بیشتر، به بخش «ارائه کدکها به چارچوب» مراجعه کنید. - خطوط زیر را در فایل makefile دستگاه خود در
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در فایل makefile دستگاه خود در مسیرdevice/<company>/<device>/device.mkمشخص کنید:PRODUCT_PACKAGES := \ Gallery2 \ ...