![نماد دوربین اندروید HAL](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_hal_camera.png?authuser=1&hl=fa)
لایه انتزاعی سخت افزاری دوربین اندروید (HAL) API های چارچوب دوربین سطح بالاتر در دوربین 2 را به درایور و سخت افزار دوربین اصلی شما متصل می کند. زیرسیستم دوربین شامل پیاده سازی هایی برای اجزای خط لوله دوربین است در حالی که دوربین HAL رابط هایی را برای استفاده در اجرای نسخه شما از این اجزا ارائه می دهد.
معماری
شکل و لیست زیر اجزای HAL را توصیف می کند.
![معماری دوربین اندروید](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera2.png?authuser=1&hl=fa)
شکل 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 زیر را پیاده سازی کند:
-
ICameraProvider
: برای برشمردن دستگاه های فردی و مدیریت وضعیت آنها. -
ICameraDevice
: رابط دستگاه دوربین. -
ICameraDeviceSession
: رابط جلسه دستگاه دوربین فعال.
پیاده سازی های مرجع 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 دوربین قدیمی را توصیف می کند.
![معماری دوربین اندروید](https://source.android.google.cn/static/docs/core/camera/images/ape_fwk_camera.png?authuser=1&hl=fa)
شکل 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
آن را در مکان مناسب کپی کنید:
- یک دایرکتوری
device/<company_name>/<device_name>/camera
ایجاد کنید تا حاوی فایل های منبع کتابخانه شما باشد. - یک فایل
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
را ببینید. - با کپی کردن ویژگیهای ضروری فایلهای 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
را ببینید. - کدک رسانه، قالب و قابلیتهای وضوح دوربین خود را در
device/<company_name>/<device_name>/media_profiles.xml
وdevice/<company_name>/<device_name>/media_codecs.xml
فایلهای XML اعلام کنید. برای جزئیات، به قرار دادن کدک ها در چارچوب مراجعه کنید. - خطوط زیر را در
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
- برای گنجاندن برنامه دوربین در تصویر سیستم دستگاه خود، آن را در متغیر
PRODUCT_PACKAGES
درdevice/<company>/<device>/device.mk
makefile دستگاه خود مشخص کنید:PRODUCT_PACKAGES := \ Gallery2 \ ...