دوربین

آیکون HAL دوربین اندروید

لایه انتزاعی سخت‌افزار دوربین اندروید (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 ، آن را در مکان مناسب کپی کنید:

  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 به طور خودکار اضافه می‌شود)، تا اندروید بتواند کتابخانه را به درستی بارگذاری کند. برای مثال، به فایل makefile مربوط به دوربین گلکسی نکسوس که در hardware/ti/omap4xxx/Android.mk قرار دارد، مراجعه کنید.

  3. با کپی کردن فایل‌های 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 مراجعه کنید.

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