دوربین

نماد دوربین اندروید HAL

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

معماری

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

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

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

چارچوب برنامه
در سطح چارچوب برنامه، کد برنامه وجود دارد که از API Camera 2 برای تعامل با سخت افزار دوربین استفاده می کند. در داخل، این کد رابط های Binder مربوطه را فراخوانی می کند تا به کد بومی که با دوربین تعامل دارد دسترسی پیدا کند.
ایدل
رابط کلاسور مرتبط با CameraService را می توان در Frameworks/av/camera/aidl/android/hardware یافت. کد تولید شده، کد بومی سطح پایین‌تر را برای دسترسی به دوربین فیزیکی فراخوانی می‌کند و داده‌هایی را برمی‌گرداند که برای ایجاد CameraDevice و در نهایت اشیاء CameraCaptureSession در سطح چارچوب استفاده می‌شوند.
چارچوب بومی
این فریم ورک که در frameworks/av/ قرار دارد، معادل بومی کلاس های CameraDevice و CameraCaptureSession را ارائه می دهد. همچنین به مرجع NDK camera2 مراجعه کنید.
رابط IPC binder
رابط IPC binder ارتباط را بر روی مرزهای فرآیند تسهیل می کند. چندین کلاس بایندر دوربین در دایرکتوری frameworks/av/camera/camera/aidl/android/hardware قرار دارند که به سرویس دوربین فراخوانی می‌شوند. ICameraService رابط سرویس دوربین است. ICameraDeviceUser رابط یک دستگاه دوربین باز شده خاص است. و ICameraServiceListener و ICameraDeviceCallbacks تماس‌های CameraService و CameraDevice مربوطه به چارچوب برنامه هستند.
خدمات دوربین
سرویس دوربین، واقع در frameworks/av/services/camera/libcameraservice/CameraService.cpp ، کد واقعی است که با HAL در تعامل است.
HAL
لایه انتزاعی سخت افزار رابط استانداردی را تعریف می کند که سرویس دوربین به آن فراخوانی می کند و شما باید آن را پیاده سازی کنید تا سخت افزار دوربین خود به درستی کار کند.

HAL را اجرا کنید

HAL بین درایور دوربین و فریم ورک سطح بالاتر اندروید قرار می گیرد و رابطی را تعریف می کند که باید آن را پیاده سازی کنید تا برنامه ها بتوانند سخت افزار دوربین را به درستی کار کنند. رابط های HIDL برای دوربین HAL در سخت افزار/رابط/دوربین تعریف شده اند.

یک HAL بایندر شده معمولی باید رابط های HIDL زیر را پیاده سازی کند:

پیاده سازی های مرجع HIDL برای CameraProvider.cpp ، CameraDevice.cpp ، و CameraDeviceSession.cpp در دسترس هستند. این پیاده‌سازی HAL‌های قدیمی را که هنوز از API قدیمی استفاده می‌کنند، می‌پوشاند. با شروع Android 8.0، اجراهای Camera HAL باید از HIDL API استفاده کنند. استفاده از رابط قدیمی پشتیبانی نمی شود.

اعتبار سنجی ورودی

از آنجا که HAL به منابع متفاوتی نسبت به سرویس دوربین دسترسی دارد، مرز بین این دو به عنوان یک مرز امنیتی در نظر گرفته می شود. این بدان معناست که پارامترهای ارسال شده از سرویس دوربین غیرقابل اعتماد و ضدعفونی تلقی می شوند. برای جلوگیری از آسیب‌پذیری‌های امنیتی که به مهاجمان اجازه می‌دهد امتیازات را افزایش دهند یا به داده‌هایی دسترسی پیدا کنند که قصد دسترسی به آنها را ندارند، HAL دوربین باید پارامترهای ارسال شده از سرویس دوربین به HAL را تأیید کند. این شامل بررسی اینکه مقادیر طول بافر در محدوده مجاز هستند و پاکسازی پارامترها قبل از استفاده و قبل از ارسال آنها به درایورهای سخت افزار یا هسته است.

اجزای قدیمی HAL

این بخش معماری اجزای HAL قدیمی و نحوه پیاده سازی HAL را توضیح می دهد. اجرای دوربین HAL در Android 8.0 و بالاتر باید به جای آن از HIDL API استفاده کند که در بالا توضیح داده شد.

معماری (میراث)

شکل و لیست زیر اجزای HAL دوربین قدیمی را توصیف می کند.

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

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

چارچوب برنامه
در سطح چارچوب برنامه، کد برنامه وجود دارد که از android.hardware.Camera API برای تعامل با سخت افزار دوربین استفاده می کند. در داخل، این کد یک کلاس چسب 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
لایه انتزاعی سخت افزار رابط استانداردی را تعریف می کند که سرویس دوربین به آن فراخوانی می کند و شما باید آن را پیاده سازی کنید تا سخت افزار دوربین خود به درستی کار کند.
درایور هسته
درایور دوربین با سخت افزار واقعی دوربین و اجرای 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، به اجرای Galaxy Nexus HAL در 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 به طور خودکار اضافه می شود)، بنابراین Android می تواند کتابخانه را به درستی بارگیری کند. برای مثال، فایل ساخت دوربین 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 makefile دستگاه خود اضافه کنید تا فایل های 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 \
    ...