
Android का कैमरा हार्डवेयर अबस्ट्रैक्शन लेयर (एचएएल), Camera 2 में मौजूद, कैमरा फ़्रेमवर्क के हायर-लेवल एपीआई को आपके कैमरा ड्राइवर और हार्डवेयर से कनेक्ट करता है. कैमरा सबसिस्टम में, कैमरा पाइपलाइन कॉम्पोनेंट के लिए लागू किए गए तरीके शामिल होते हैं. वहीं, कैमरा HAL, इन कॉम्पोनेंट के अपने वर्शन को लागू करने के लिए इंटरफ़ेस उपलब्ध कराता है.
भवन निर्माण
नीचे दिए गए फ़िगर और सूची में, एचएएल कॉम्पोनेंट के बारे में बताया गया है.

पहली इमेज. कैमरे का आर्किटेक्चर
- ऐप्लिकेशन फ़्रेमवर्क
- ऐप्लिकेशन फ़्रेमवर्क लेवल पर, ऐप्लिकेशन का कोड होता है. यह कोड, कैमरे के हार्डवेयर के साथ इंटरैक्ट करने के लिए Camera 2 API का इस्तेमाल करता है. आंतरिक तौर पर, यह कोड Binder इंटरफ़ेस को कॉल करता है, ताकि उस नेटिव कोड को ऐक्सेस किया जा सके जो कैमरे के साथ इंटरैक्ट करता है.
- एआईडीएल
-
जनरेट किया गया कोड, फ़िज़िकल कैमरे का ऐक्सेस पाने के लिए, लोअर लेवल के नेटिव कोड को कॉल करता है. साथ ही, ऐसा डेटा दिखाता है जिसका इस्तेमाल फ़्रेमवर्क लेवल पर
CameraDevice
और आखिर मेंCameraCaptureSession
ऑब्जेक्ट बनाने के लिए किया जाता है. - नेटिव फ़्रेमवर्क
- यह फ़्रेमवर्क
frameworks/av/
में मौजूद है. यहCameraDevice
औरCameraCaptureSession
क्लास के नेटिव वर्शन के बराबर है. NDK camera2 के बारे में जानकारी भी देखें. - बाइंडर आईपीसी इंटरफ़ेस
- आईपीस बाइंडर इंटरफ़ेस, प्रोसेस की सीमाओं के बीच कम्यूनिकेशन की सुविधा देता है.
frameworks/av/camera/camera/aidl/android/hardware
डायरेक्ट्री में कई कैमरा बाइंडर क्लास मौजूद हैं. ये कैमरा सर्विस को कॉल करती हैं.ICameraService
कैमरा सेवा का इंटरफ़ेस है;ICameraDeviceUser
खुले हुए किसी खास कैमरे का इंटरफ़ेस है; औरICameraServiceListener
औरICameraDeviceCallbacks
, ऐप्लिकेशन फ़्रेमवर्क के लिएCameraService
औरCameraDevice
कॉलबैक हैं. - कैमरा सर्विस
- कैमरा सेवा,
frameworks/av/services/camera/libcameraservice/CameraService.cpp
में मौजूद है. यह HAL के साथ इंटरैक्ट करने वाला असली कोड है. - HAL
- हार्डवेयर ऐब्स्ट्रैक्शन लेयर, स्टैंडर्ड इंटरफ़ेस तय करती है. कैमरा सेवा, इस इंटरफ़ेस को कॉल करती है. आपको इस इंटरफ़ेस को लागू करना होगा, ताकि आपका कैमरा हार्डवेयर सही तरीके से काम कर सके.
CameraService
से जुड़ा बाइंडर इंटरफ़ेस,
frameworks/av/camera/aidl/android/hardware पर देखा जा सकता है.एचएएल लागू करना
एचएएल, कैमरा ड्राइवर और हायर-लेवल Android फ़्रेमवर्क के बीच काम करता है. यह एक ऐसा इंटरफ़ेस तय करता है जिसे आपको लागू करना होगा, ताकि ऐप्लिकेशन कैमरा हार्डवेयर को सही तरीके से इस्तेमाल कर सकें. कैमरा एचएएल के लिए एचआईडीएल इंटरफ़ेस, hardware/interfaces/camera में तय किए गए हैं.
किसी बाइंडराइज़्ड एचएएल को इन एचआईडीएल इंटरफ़ेस को लागू करना होगा:
-
ICameraProvider
: इसका इस्तेमाल, अलग-अलग डिवाइसों की गिनती करने और उनके स्टेटस को मैनेज करने के लिए किया जाता है. -
ICameraDevice
: कैमरा डिवाइस इंटरफ़ेस. -
ICameraDeviceSession
: चालू कैमरा डिवाइस के सेशन का इंटरफ़ेस.
रेफ़रंस एचआईडीएल लागू करने की सुविधा, CameraProvider.cpp
,
CameraDevice.cpp
, और CameraDeviceSession.cpp
के लिए उपलब्ध है.
यह लागू करने का तरीका, उन पुराने HAL को रैप करता है जो अब भी लेगसी एपीआई का इस्तेमाल करते हैं.
Android 8.0 से, Camera HAL को लागू करने के लिए HIDL API का इस्तेमाल करना ज़रूरी है. लेगसी इंटरफ़ेस का इस्तेमाल नहीं किया जा सकता.
इनपुट की पुष्टि करना
कैमरा सेवा के मुकाबले HAL के पास अलग-अलग संसाधनों का ऐक्सेस होता है. इसलिए, इन दोनों के बीच की सीमा को सुरक्षा सीमा माना जाता है. इसका मतलब है कि कैमरा सेवा से पास किए गए पैरामीटर को भरोसेमंद और सुरक्षित नहीं माना जाता. सुरक्षा से जुड़ी कमियों को रोकने के लिए, हमलावरों को विशेषाधिकार बढ़ाने या ऐसे डेटा को ऐक्सेस करने की अनुमति नहीं दी जानी चाहिए जिसे वे ऐक्सेस नहीं कर सकते. इसके लिए, कैमरा HAL को कैमरा सेवा से HAL को पास किए गए पैरामीटर की पुष्टि करनी होगी. इसमें यह जांच करना शामिल है कि buffer length की वैल्यू, तय सीमा के अंदर हों. साथ ही, इस्तेमाल करने से पहले और हार्डवेयर या कर्नल ड्राइवर को पास करने से पहले, पैरामीटर को सुरक्षित करना भी शामिल है.
लेगसी एचएएल कॉम्पोनेंट
इस सेक्शन में, लेगसी एचएएल कॉम्पोनेंट के आर्किटेक्चर और एचएएल को लागू करने का तरीका बताया गया है. Android 8.0 और इसके बाद के वर्शन पर, Camera HAL को लागू करने के लिए ऊपर बताए गए HIDL API का इस्तेमाल करना होगा.
आर्किटेक्चर (लेगसी)
नीचे दिए गए फ़िगर और सूची में, लेगसी कैमरा एचएएल कॉम्पोनेंट के बारे में बताया गया है.

दूसरी इमेज. लेगसी कैमरा आर्किटेक्चर
- ऐप्लिकेशन फ़्रेमवर्क
- ऐप्लिकेशन फ़्रेमवर्क लेवल पर, ऐप्लिकेशन का कोड होता है. यह कोड, कैमरा हार्डवेयर के साथ इंटरैक्ट करने के लिए
android.hardware.Camera
एपीआई का इस्तेमाल करता है. आंतरिक तौर पर, यह कोड कैमरे से इंटरैक्ट करने वाले नेटिव कोड को ऐक्सेस करने के लिए, JNI ग्लू क्लास को कॉल करता है. - JNI
-
android.hardware.Camera
से जुड़ा JNI कोड,frameworks/base/core/jni/android_hardware_Camera.cpp
में मौजूद है. यह कोड, फ़िज़िकल कैमरे का ऐक्सेस पाने के लिए, लोअर-लेवल के नेटिव कोड को कॉल करता है. साथ ही, यह ऐसा डेटा दिखाता है जिसका इस्तेमाल फ़्रेमवर्क लेवल परandroid.hardware.Camera
ऑब्जेक्ट बनाने के लिए किया जाता है. - नेटिव फ़्रेमवर्क
- में तय किया गया नेटिव फ़्रेमवर्क,
android.hardware.Camera
क्लास के लिए नेटिव वर्शन उपलब्ध कराता है.frameworks/av/camera/Camera.cpp
यह क्लास, कैमरा सेवा का ऐक्सेस पाने के लिए, IPC बाइंडर प्रॉक्सी को कॉल करती है. - बाइंडर आईपीसी प्रॉक्सी
- आईपीसी बाइंडर प्रॉक्सी, प्रोसेस बाउंड्री के बीच कम्यूनिकेशन को आसान बनाती हैं.
कैमरा बाइंडर की तीन क्लास हैं. ये
frameworks/av/camera
डायरेक्ट्री में मौजूद हैं. यह डायरेक्ट्री, कैमरा सेवा को कॉल करती है.ICameraService
कैमरा सेवा का इंटरफ़ेस है,ICamera
खुले हुए किसी खास कैमरा डिवाइस का इंटरफ़ेस है, औरICameraClient
डिवाइस का इंटरफ़ेस, ऐप्लिकेशन फ़्रेमवर्क पर वापस जाने का इंटरफ़ेस है. - कैमरा सर्विस
- कैमरा सेवा,
frameworks/av/services/camera/libcameraservice/CameraService.cpp
में मौजूद है. यह HAL के साथ इंटरैक्ट करने वाला असली कोड है. - HAL
- हार्डवेयर ऐब्स्ट्रैक्शन लेयर, स्टैंडर्ड इंटरफ़ेस तय करती है. कैमरा सेवा, इस इंटरफ़ेस को कॉल करती है. आपको इस इंटरफ़ेस को लागू करना होगा, ताकि आपका कैमरा हार्डवेयर सही तरीके से काम कर सके.
- कर्नेल ड्राइवर
- कैमरे का ड्राइवर, कैमरे के हार्डवेयर और एचएएल के आपके लागू किए गए वर्शन के साथ इंटरैक्ट करता है. कैमरा और ड्राइवर, YV12 और NV21 इमेज फ़ॉर्मैट के साथ काम करने चाहिए. इससे, डिसप्ले पर कैमरे की इमेज का प्रीव्यू देखा जा सकेगा और वीडियो रिकॉर्ड किया जा सकेगा.
HAL (लेगसी) को लागू करना
एचएएल, कैमरा ड्राइवर और हायर-लेवल Android फ़्रेमवर्क के बीच काम करता है. यह एक ऐसा इंटरफ़ेस तय करता है जिसे आपको लागू करना होगा, ताकि ऐप्लिकेशन कैमरा हार्डवेयर को सही तरीके से इस्तेमाल कर सकें. एचएएल इंटरफ़ेस को 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
स्ट्रक्चर होता है. इसमें ऐसे फ़ंक्शन के पॉइंटर होते हैं जो एचएएल इंटरफ़ेस लागू करते हैं. डेवलपर जिन कैमरा पैरामीटर को सेट कर सकते हैं उनके बारे में जानने के लिए, frameworks/av/include/camera/CameraParameters.h
देखें.
इन पैरामीटर को HAL में int
(*set_parameters)(struct camera_device *, const char *parms)
से पॉइंट किए गए फ़ंक्शन के साथ सेट किया जाता है.
एचएएल लागू करने के उदाहरण के लिए, hardware/ti/omap4xxx/camera
में Galaxy Nexus HAL लागू करने का तरीका देखें.
शेयर की गई लाइब्रेरी को कॉन्फ़िगर करना
एचएएल को लागू करने के लिए, Android बिल्ड सिस्टम सेट अप करें. इससे एचएएल को शेयर की गई लाइब्रेरी में सही तरीके से पैकेज किया जा सकेगा. साथ ही, Android.mk
फ़ाइल बनाकर, इसे सही जगह पर कॉपी किया जा सकेगा:
- अपनी लाइब्रेरी की सोर्स फ़ाइलों को रखने के लिए,
device/<company_name>/<device_name>/camera
डायरेक्ट्री बनाएं. - शेयर की गई लाइब्रेरी बनाने के लिए,
Android.mk
फ़ाइल बनाएं. पक्का करें कि मेकफ़ाइल में ये लाइनें शामिल हों:LOCAL_MODULE := camera.<device_name> LOCAL_MODULE_RELATIVE_PATH := hw
आपकी लाइब्रेरी का नाम
camera.<device_name>
होना चाहिए (.so
अपने-आप जुड़ जाता है), ताकि Android लाइब्रेरी को सही तरीके से लोड कर सके. उदाहरण के लिए,hardware/ti/omap4xxx/Android.mk
में मौजूद Galaxy Nexus कैमरे के लिए मेकफ़ाइल देखें. - अपने डिवाइस की मेकफ़ाइल के साथ, ज़रूरी सुविधा वाली एक्सएमएल फ़ाइलों को
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
एक्सएमएल फ़ाइलों में, अपने कैमरे के मीडिया कोडेक, फ़ॉर्मैट, और रिज़ॉल्यूशन की क्षमताओं के बारे में बताएं. ज़्यादा जानकारी के लिए, कोडेक को फ़्रेमवर्क के साथ इंटिग्रेट करना लेख पढ़ें.media_profiles.xml
औरmedia_codecs.xml
फ़ाइलों को सही जगह पर कॉपी करने के लिए, अपने डिवाइस कीdevice/<company_name>/<device_name>/device.mk
मेकफ़ाइल में ये लाइनें जोड़ें:# 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
- Camera ऐप्लिकेशन को अपने डिवाइस की सिस्टम इमेज में शामिल करने के लिए, इसे अपने डिवाइस की
device/<company>/<device>/device.mk
makefile मेंPRODUCT_PACKAGES
वैरिएबल में शामिल करें:PRODUCT_PACKAGES := \ Gallery2 \ ...