دوربین

نماد «لایه انتزاعی سخت‌افزار دوربین Android»

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

معماری

شکل و فهرست زیر اجزای HAL را توصیف می‌کنند:

معماری دوربین Android

شکل ۱. معماری دوربین.

چارچوب برنامه
در سطح چارچوب برنامه، کد برنامه قرار دارد که از 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 زیر را پیاده‌سازی کند:

پیاده‌سازی‌های مرجع 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

شکل ۲. معماری دوربین قدیمی.

چارچوب برنامه
در سطح چارچوب برنامه، کد برنامه قرار دارد که از 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 آن را در مکان مناسب کپی کند:

  1. device/<company_name>/<device_name>/camera دایرکتوری‌ای برای نگهداری فایل‌های منبع کتابخانه خود ایجاد کنید.
  2. برای ساختن کتابخانه مشترک، فایل 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 قرار دارد ببینید.

  3. با کپی کردن فایل‌های XML ویژگی‌های لازم در فهرست راهنمای frameworks/native/data/etc با فایل ساخت دستگاهتان، مشخص کنید که دستگاهتان ویژگی‌های دوربین را دارد. برای مثال، برای مشخص کردن اینکه دستگاهتان فلاش دوربین دارد و می‌تواند فوکوس خودکار داشته باشد، خطوط زیر را در <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 مراجعه کنید.

  4. قابلیت‌های کدک رسانه، قالب، و وضوح دوربینتان را در device/<company_name>/<device_name>/media_profiles.xml و فایل‌های device/<company_name>/<device_name>/media_codecs.xml XML اعلام کنید. برای جزئیات، به نمایش کدک‌ها در چارچوب مراجعه کنید.
  5. خطوط زیر را در 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
    
  6. برای گنجاندن برنامه «دوربین» در تصویر سیستم دستگاهتان، آن را در متغیر PRODUCT_PACKAGES در device/<company>/<device>/device.mk makefile دستگاهتان مشخص کنید:
    PRODUCT_PACKAGES := \
    Gallery2 \
    ...