
एंड्रॉइड का कैमरा हार्डवेयर एब्स्ट्रैक्शन लेयर (एचएएल) कैमरा 2 में उच्च-स्तरीय कैमरा फ्रेमवर्क एपीआई को आपके अंतर्निहित कैमरा ड्राइवर और हार्डवेयर से जोड़ता है। कैमरा सबसिस्टम में कैमरा पाइपलाइन घटकों के लिए कार्यान्वयन शामिल है जबकि कैमरा एचएएल इन घटकों के आपके संस्करण को लागू करने में उपयोग के लिए इंटरफेस प्रदान करता है।
वास्तुकला
निम्नलिखित चित्र और सूची एचएएल घटकों का वर्णन करती है।

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

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