स्रोत कोड के बिना, डेवलपर्स को कस्टम रोम में काम करने वाले कैमरे जैसे हार्डवेयर घटक कैसे मिलते हैं? उत्तर एक ब्लॉब, शिम और बहुत सारी डिबगिंग है।
Android Oreo और जैसे कई उपकरणों के रिलीज़ के साथ शाओमी रेडमी नोट 3, गूगल नेक्सस 5 और अन्य लोग अनौपचारिक रूप से इसे प्राप्त कर रहे हैं, यह आश्चर्य करना शायद उचित है कि जब डेवलपर्स एंड्रॉइड ओपन सोर्स प्रोजेक्ट (एओएसपी) आधारित रोम को पोर्ट करते हैं तो वही सुविधाएं (ज्यादातर कैमरा) क्यों टूट जाती हैं। आपने शायद शीर्ष पर टूटी हुई सुविधाओं की एक लंबी सूची के साथ ROM के XDA फोरम थ्रेड देखे होंगे। "क्या काम करता है" के बाद कार्यशील सुविधाओं की सूची, फिर उसके नीचे प्रतिष्ठित "क्या काम नहीं करता?" आप मुझे बताएं!" हमारे मंचों पर दो लोकप्रिय रिफ़्रेन्स हैं जो व्यावहारिक रूप से Reddit और Twitter जैसी जगहों पर एक मीम बन गए हैं।
जब भी कोई डेवलपर अपने डिवाइस पर AOSP ROM को पोर्ट करने का प्रयास करता है तो इतनी कार्यक्षमता क्यों टूट जाती है? मूल उत्तर यह है कि क्योंकि एंड्रॉइड के विभिन्न संस्करणों में फ़ंक्शन बदलते हैं, बीएलओबी के रूप में पैक किए गए पुराने डिवाइस ड्राइवर एंड्रॉइड के नए संस्करणों या यहां तक कि स्टॉक एओएसपी के साथ भी काम नहीं करेंगे। उस पर काबू पाने के लिए, डेवलपर्स "शिम" कहलाने वाली चीज़ का उपयोग करते हैं, लेकिन इसमें शामिल प्रक्रिया मुश्किल, समय लेने वाली और कभी-कभी डीबग करने में बहुत कठिन होती है।
इस लेख में, हम बताएंगे कि शिम्स कैसे काम करते हैं, विशेष रूप से एओएसपी-आधारित रोम पर कैमरे को ठीक से काम करने के संबंध में। हम उदाहरण के तौर पर वनप्लस 3टी का उपयोग करेंगे। ध्यान दें कि इन सुविधाओं को काम करने में आने वाली कठिनाई अत्यधिक डिवाइस विशिष्ट है।
वनप्लस 3टी ऑक्सीजनओएस पर चल रहा है। हालाँकि वनप्लस फोन अपनी कस्टम डेवलपमेंट फ्रेंडली के लिए जाने जाते हैं, लेकिन एओएसपी के स्थिर पोर्ट बनाने के लिए डेवलपर्स पर्दे के पीछे बहुत काम करते हैं।
शिम या ब्लॉब क्या है?
डेवलपर्स क्या कर रहे हैं इसका एक हिस्सा समझने के लिए, हमें पहले कुछ चीजें समझानी होंगी। यद्यपि एंड्रॉइड ओएस ओपन सोर्स है (इसे किसी कारण से एंड्रॉइड ओपन सोर्स प्रोजेक्ट कहा जाता है), हजारों एंड्रॉइड डिवाइसों पर भेजा गया सॉफ़्टवेयर (कर्नेल के बिना) नहीं है। डेवलपर्स के पास स्रोत कोड तक पहुंच नहीं है सैमसंग अनुभव, ईएमयूआई, ऑक्सीजनओएस, या एंड्रॉइड के अन्य तृतीय-पक्ष फ्लेवर में से कोई भी।
अब, स्टॉक एओएसपी को गैर-Google डिवाइस पर पोर्ट करने वाले डेवलपर्स शायद इन एंड्रॉइड स्किन्स के स्रोत कोड के बारे में परवाह नहीं करते हैं क्योंकि वे नहीं होने जा रहे हैं। इन ROM को संशोधित और निर्मित करना। यह सच होगा, यदि एक बड़े, बड़े कारण के लिए नहीं: मुख्य रूप से कैमरे को ठीक से काम करने के लिए आवश्यक हिस्से कैमरा एचएएल (हार्डवेयर एब्स्ट्रैक्शन लेयर), हैं स्रोत भी बंद कर दिया.
न केवल कैमरा HAL बल्कि ROM बंद स्रोत के साथ समस्या यह है कि डेवलपर्स अपने डिवाइस पर AOSP को पोर्ट करने पर काम कर रहे हैं। अंधा काम कर रहा है. बंद स्रोत OEM ROM कैमरा HAL के साथ ठीक से इंटरफ़ेस करने में सक्षम है क्योंकि OEM के पास कैमरा HAL स्रोत तक पहुंच है। कैमरा HAL वह है जो ROM को कैमरा हार्डवेयर से "बात" करने की अनुमति देता है - इसके बिना, कैमरा गैर-कार्यात्मक होगा। कैमरे HAL को कार के स्टीयरिंग व्हील और पैडल के रूप में सोचें। स्टीयरिंग व्हील/पैडल ड्राइवर (ROM) को आंतरिक घटकों का उपयोग करने के लिए एक बाहरी इंटरफ़ेस प्रदान करके वाहन के आंतरिक घटकों को नियंत्रित करने की अनुमति देते हैं।
जैसे-जैसे कैमरा हार्डवेयर अधिक से अधिक जटिल होता जाता है (... दोहरे कैमरों का आगमन, उदाहरण के लिए), कैमरा एचएएल स्रोत तक पहुंच होने से कार्यात्मक कैमरे के साथ एओएसपी रोम को पोर्ट करना बहुत आसान प्रयास हो जाएगा।
हालाँकि, OEM विभिन्न कारणों से कैमरा HAL स्रोत तक पहुँच प्रदान नहीं करते हैं। सबसे पहले, यदि उनके पास कैमरा एचएएल के सभी स्वामित्व अधिकार नहीं हैं (जैसे कि जब वे अन्य कंपनियों से बौद्धिक संपदा को शामिल करते हैं), तो वे स्रोत को वितरित नहीं कर सकते हैं। दूसरा, कैमरा एचएएल स्रोत जारी करने से उनकी अपनी बौद्धिक संपदा ख़तरे में पड़ सकती है। अंत में, कंपनियां इस स्रोत कोड को प्रदान करने के लिए किसी कानूनी बाध्यता के अधीन नहीं हैं (कर्नेल स्रोत कोड के विपरीत जो वे हैं जीपीएल के तहत जारी करने के लिए बाध्य), इस प्रकार उनके पास इसे जारी करने के लिए कोई प्रोत्साहन नहीं है। तो कैमरा एचएएल स्रोत तक पहुंच के बिना, डेवलपर्स वास्तव में एओएसपी रोम पर कैमरा कैसे काम करते हैं? इसका उत्तर है ब्लॉब, शिम और ढेर सारी डिबगिंग।
एक उपकरण ब्लॉब (बाइनरी लार्ज ओब्जेक्ट) में प्री-पैकेज्ड बायनेरिज़ शामिल हैं जो सॉफ्टवेयर का संकलित रूप हैं। इस मामले में, कैमरा एचएएल स्रोत OEM द्वारा संकलित किया जाता है और बायनेरिज़ के रूप में उपकरणों पर भेजा जाता है। जब डेवलपर्स बीएलओबी के बारे में बात करते हैं, तो वे उन बायनेरिज़ का उल्लेख करते हैं जो लाइव डिवाइस पर शिप होते हैं जिन्हें वे निकालने में सक्षम होते हैं। अब, "कैमरा BLOBs" का विषय है लंबे समय से परेशान वनप्लस कई महीनों तक, लेकिन मामले की सच्चाई यह है कि डेवलपर्स के पास हमेशा कैमरा बीएलओबी तक पहुंच होती है। कैमरा एचएएल स्रोत कोड सुनहरा टिकट है हालाँकि, यहाँ डेवलपर्स के लिए, लेकिन ऐसा होगा कभी भी, कभी भी रिहा नहीं किया जाएगा कानूनी खतरे के कारण यह वनप्लस जैसी कंपनियों को मुश्किल में डाल देगा।
इस प्रकार, किसी डिवाइस पर AOSP लाने के इच्छुक डेवलपर्स के पास केवल कैमरा HAL के BLOBs ही बचे हैं, जिसके लिए उनके पास स्रोत कोड तक पहुंच नहीं है। शायद ही कभी कोई डेवलपर अपने AOSP ROM कोड को कैमरे HAL BLOB के साथ जोड़ सकता है और उम्मीद कर सकता है कि यह काम करेगा, इसलिए दोनों के बीच के अंतर को पाटने के लिए, डेवलपर्स वह बनाते हैं जिसे "कहा जाता है"परत.”
"शिम" करने का अर्थ है "किसी चीज़ को तोड़ना या किसी स्थान को भरना।" एक डेवलपर प्रभावी रूप से यही करता है एक शिम लिखना - वे बीएलओबी को एओएसपी स्रोत कोड के साथ इंटरफेस करने की अनुमति देने के लिए कोड जोड़ते हैं जिस पर वे काम कर रहे हैं साथ। शिम का उपयोग सभी अलग-अलग प्रकार के बीएलओबी को एओएसपी के साथ काम करने के लिए किया जाता है, लेकिन आमतौर पर, यह कैमरा बीएलओबी है जिसे सबसे अधिक शिमिंग की आवश्यकता होती है। जैसा कि हमने पहले बताया, शिमिंग की आवश्यकता न केवल एंड्रॉइड के नए संस्करणों को किसी डिवाइस (जैसे) पर पोर्ट करने के लिए होती है वे सभी अनौपचारिक Android Oreo ROM) लेकिन उसी Android संस्करण के AOSP को उस पर पोर्ट करते समय भी इसकी आवश्यकता होती है उपकरण।
अनुशंसित पाठ: स्टोर से शेल्फ तक: एमएसएम8974 उपकरणों को नूगट से क्यों बाहर रखा गया है, इसका गहन विवरण
उदाहरण के लिए, वनप्लस 2 को यह प्राप्त हुआ अंतिम आधिकारिक प्रमुख OS अद्यतन एंड्रॉइड 6.0 मार्शमैलो के रूप में। हालाँकि, डिवाइस वास्तव में है पूरी तरह से काम करने वाले कस्टम AOSP-आधारित ROM एंड्रॉइड नौगट पर आधारित है, और यह डेवलपर्स और उनके शिम्स की कड़ी मेहनत के लिए धन्यवाद है। हम शिम के कुछ उदाहरण तोड़ेंगे, लेकिन पहले, हमें इस बारे में बात करने की ज़रूरत है कि शिम वास्तव में कैसे काम करते हैं।
शिमिंग कैसे काम करती है?
चूँकि डेवलपर्स के पास कैमरा HAL या OEM ROM स्रोत (और केवल पूर्व-संकलित बायनेरिज़) तक पहुंच नहीं है, वे यह नहीं जान सकते कि कैमरा HAL किस प्रकार के कार्यों की अपेक्षा करता है। इस वजह से, कैमरा एचएएल जिस फ़ंक्शन की तलाश कर रहा है उसके नाम और डेवलपर जिस एओएसपी कोड के साथ काम कर रहा है उसमें फ़ंक्शन के वास्तविक नाम के बीच अक्सर बेमेल होता है।
इस समस्या को हल करने के लिए, डेवलपर बस एक नया फ़ंक्शन बनाता है जो उसी नाम का उपयोग करता है वह फ़ंक्शन जो कैमरा HAL BLOB अपेक्षा करता है, लेकिन यह नया फ़ंक्शन केवल वही निष्पादित करता है जो डेवलपर चाहता है यह करने के लिए। यह नया कार्य जो बीएलओबी और एओएसपी के बीच मध्यस्थ के रूप में कार्य करता है वह शिम है। यह विशेष परिदृश्य जिसमें बीएलओबी उस फ़ंक्शन को ढूंढने में विफल रहता है जिसे वह ढूंढ रहा है, सबसे आम परिदृश्यों में से एक है जहां शिम की आवश्यकता होती है।
शायद वनप्लस 3टी से जुड़े एक काल्पनिक उदाहरण से चीजें कुछ अधिक समझ में आएँगी। हम ऑक्सीजनओएस और वनप्लस कैमरे का उपयोग करके एक उदाहरण बनाएंगे। यदि हम AOSP आधारित Nougat ROM बनाने के लिए वनप्लस 3T के लिए OxygenOS Nougat से लिए गए कैमरा BLOBs का उपयोग करते हैं, तो हमें समस्याओं का सामना करना पड़ सकता है। ऐसा इसलिए है क्योंकि कैमरा BLOBs (जो मूल रूप से OEM द्वारा संकलित किए गए थे) OxygenOS के भीतर आवश्यक सभी कार्यों को संदर्भित करने में सक्षम होंगे, लेकिन चूंकि संकलित AOSP ROM में वे फ़ंक्शन नहीं हो सकते हैं या उन्हें एक अलग नाम के तहत संकलित किया जा सकता है (इस प्रकार फ़ंक्शन प्रतीकों के बीच बेमेल हो सकता है), एक होगा गलती। इसे AOSP ROM के भीतर BLOB अपेक्षित नाम के साथ एक नया फ़ंक्शन बनाकर ठीक किया जा सकता है - हमारा शिम।
प्रोग्रामिंग संदर्भ में प्रतीकों का उपयोग कोड में विशिष्ट कार्यों को संदर्भित करने के लिए किया जाता है। प्रतीक आवश्यक हैं क्योंकि कोड संपादित होने पर फ़ंक्शन की स्थिति बदल सकती है, और इसलिए हार्डकोडिंग से बचने के लिए फ़ंक्शंस के संदर्भ में, कंपाइलर प्रतीकों की एक तालिका बनाता है जिसका उपयोग अन्य फ़ंक्शंस हमेशा दाईं ओर संदर्भित करने के लिए कर सकते हैं समारोह। जब आप संकलन करने से पहले किसी फ़ंक्शन का नाम बदलते हैं, तो उसका प्रतीक भी बदल जाता है, इसलिए मूल रूप से कोई भी परिवर्तन होता है संकलन से पहले ओईएम कैमरे को एचएएल स्रोत बनाता है, जिसके लिए डेवलपर्स को एक नया बनाने की आवश्यकता होगी शिम.
अब तक हमने जो स्पष्टीकरण दिया है, उससे ऐसा लगता है कि शिम बनाना आसान है। यहां-वहां कुछ फ़ंक्शन नाम बदलना बहुत कठिन नहीं लगता, है ना? यदि यह केवल इतना आसान था। शिम्स की वास्तविकता में केवल फ़ंक्शन नाम बदलने से कहीं अधिक शामिल है। हमने XDA मान्यता प्राप्त डेवलपर सुलतानक्सडा से बात की, जो हमें उन अधिक कठिन शिमों में से एक का उदाहरण प्रदान करने में सक्षम था, जिस पर उसने काम किया है।
शिमिंग - यह उतना आसान नहीं है जितना लगता है
वनप्लस 3टी से अपरिचित लोगों के लिए, फ्रंट-फेसिंग कैमरा शुरू में टूटा हुआ था AOSP-आधारित कस्टम ROM. आरंभ करने के लिए, 8MP से अधिक की कोई भी तस्वीर लेने का प्रयास करने पर परिणाम होगा दुर्घटनाग्रस्त. इस मुद्दे को सुलझाने के अपने प्रयास में, सुल्तानक्सडा ने कई प्रयास किये की परतें वनप्लस 3टी के फ्रंट-फेसिंग कैमरे को ठीक से काम करने देने के लिए।
शिम #1 - कैमरा पैकेज का नाम बदलना
जब भी उपयोगकर्ता 8MP से अधिक की तस्वीर लेता है तो फ्रंट-फेसिंग कैमरे को क्रैश होने से रोकने के लिए, सुलतानक्सडा ने कैमरा HAL को सभी कैमरों को वनप्लस कैमरे के रूप में पहचानने के लिए मजबूर किया। ऐसा इसलिए किया गया है क्योंकि वनप्लस ने कुछ अनुप्रयोगों के लिए एक सहायक फ़ंक्शन समर्पित करने का निर्णय लिया है (isOnePlusCamera
, isFacebookCamera
, आदि) किसी कारण से। सुलतानक्सडा ने कैमरा एचएएल को चमकाकर इसे ठीक किया ताकि यह एक नए फ़ंक्शन को इंगित करे जो हमेशा "सही" लौटाता है जैसे कि उपयोगकर्ता वनप्लस कैमरा का उपयोग कर रहा है - भले ही वे नहीं कर रहे हों।
शिम #2 - क्वाड्रासीएफए को अक्षम करें
अपने अगले शिम के लिए, उन्हें QuadraCfa को अक्षम करना पड़ा जो संभवतः कैमरे से संबंधित एक स्वामित्व वाली क्वालकॉम तकनीक है। हम शायद ऐसा इसलिए कह रहे हैं क्योंकि न तो मैं और न ही सुलतानक्सडा बिल्कुल निश्चित हैं कि क्वाड्रासीएफए क्या है, लेकिन सुलतानक्सदा को पता है कि जब भी इसे सक्षम किया गया था, इसने फ्रंट-फेसिंग कैमरा को तोड़ दिया था।
उन्होंने देखा कि क्वाड्रासीएफए किसी तरह खुद को सक्षम कर लेगा, लेकिन उन्हें यकीन नहीं था कि यह ऐसा क्यों और कैसे कर रहा है। इसे हल करने के लिए उनकी ओर से एक अपरंपरागत संशोधन की आवश्यकता थी। एक पारंपरिक शिम में, शिम फ़ंक्शन, संकलित होने पर, वह गायब प्रतीक प्रदान करता है जिसे बीएलओबी ढूंढ रहा है। इस मामले में, बीएलओबी के पास पहले से ही आवश्यक प्रतीक थे - वे जो संभवतः उन कार्यों का प्रतिनिधित्व करते थे जो क्वाड्रासीएफए शुरू कर रहे थे।
इस प्रकार, उसे कैमरे एचएएल द्वारा उपयोग किए गए प्रतीकों को ओवरराइड करने की आवश्यकता थी और संक्षेप में, उन्हें "गायब" बनाना था उसका शिम्स उन "लापता" प्रतीकों को प्रदान करेगा। ऐसा करने का एकमात्र तरीका है हेक्स कैमरा एचएएल को स्वयं संपादित कर रहा है. हेक्स संपादन मूल रूप से भूसे के ढेर में एक सुई ढूंढने के लिए बाइनरी डेटा के रूप में असंगठित अस्पष्टता के एक समूह को देखना है - या तो एक फ़ंक्शन या एक स्ट्रिंग जिसे आप संपादित करना चाहते हैं।
किसी फ़ंक्शन को हेक्स रूप से संपादित करना किसी स्ट्रिंग को हेक्स द्वारा संपादित करने की तुलना में काफी अधिक कठिन है, लेकिन सौभाग्य से, सुल्तानक्सडा इसके बजाय क्वाड्रासीएफए के पीछे के कार्यों को हेक्स द्वारा संपादित करने से बचने में सक्षम था। उन प्रतीकों को शून्य करने के लिए प्रतीक नामों का हेक्स संपादन.
शिम #3 - ब्राइट लाइट क्रैश फिक्स
इसके बाद, सुल्तान्क्सडा ने पहचाना कि तेज रोशनी की स्थिति में सामने वाले कैमरे से तस्वीर लेने से कैमरा क्रैश हो सकता है। इस बग को अपने डिवाइस पर पुन: उत्पन्न करने के लिए, वास्तव में सुल्तान्क्सडा अपने वनप्लस वन के फ्लैशलाइट फ़ंक्शन को चालू किया और वनप्लस 3टी के फ्रंट-फेसिंग कैमरे के सामने रोशनी डाली इसे क्रैश करने और प्रयोग करने योग्य लॉग तैयार करने के लिए! एक बार जब उन्हें पता चला कि कौन सा फ़ंक्शन क्रैश का कारण बन रहा है, तो उन्होंने डिवाइस को फ्रंट-फेसिंग कैमरे के लिए हर समय कम रोशनी मोड का उपयोग करने के लिए मजबूर करने के लिए एक शिम बनाया।
शिम #4 - कम-रिज़ॉल्यूशन वाले फ्रंट-फेसिंग कैमरा चित्र
पिछले शिम के साथ उज्ज्वल प्रकाश दुर्घटना को ठीक करने के बाद, सुल्तानएक्सडा ने एक और बग की खोज की जो वास्तव में उस शिम के प्रत्यक्ष परिणाम के रूप में उत्पन्न हुई: कम-रिज़ॉल्यूशन वाले फ्रंट-फेसिंग कैमरा चित्र। उपयोगकर्ता द्वारा अनुरोधित रिज़ॉल्यूशन पर तस्वीरें लेने के बजाय (उदाहरण के लिए)। 16MP), परिणामी तस्वीर 4MP पर ली जाएगी।
इसे हल करने के लिए आवश्यक था कि वह कार्यों को संपादित करे handleSuperResolution
और isSuperResolution
हमेशा सत्य लौटाने के लिए, लेकिन केवल तभी जब सामने वाला कैमरा सक्रिय हो (क्योंकि अन्यथा, पीछे के सेंसर से तस्वीरें लेते समय कैमरा क्रैश हो जाएगा)।
सबक सीखा - चमकाना कठिन हो सकता है
सुल्तानएक्सडा स्वीकार करता है कि वनप्लस 3टी के फ्रंट-फेसिंग कैमरे को चालू करने के लिए उसे जो शिम बनाना पड़ा, वह शिम के आपके विशिष्ट उदाहरण का प्रतिनिधित्व नहीं करता है। इसकी जटिलता और बीएलओबी को संपादित करने की दुर्लभ आवश्यकता को देखते हुए उन्हें अपने शिम पर गर्व है। लेकिन यह उदाहरण सिर्फ यह दिखाता है कि कुछ उपकरणों पर कैमरा हार्डवेयर को काम पर लाना कितना मुश्किल हो सकता है।
हो सकता है कि आपका कैमरा शिम रोमांच मेरे मुकाबले कम दर्दनाक हो। -सुल्तानक्सदा
लॉग, लॉग, और अधिक लॉग। किसी क्रैश को पुन: उत्पन्न करने के सुसंगत तरीके और लॉग के बिना, डेवलपर्स को समस्या का स्रोत खोजने की बहुत कम उम्मीद है। भले ही उन्हें पता चल जाए कि समस्या का कारण क्या है, यह हमेशा सीधा समाधान नहीं होता है। इन बगों को ढूंढने और उन्हें ख़त्म करने की पूरी प्रक्रिया में कई दिन या सप्ताह लग सकते हैं और यही कारण है कि AOSP ROM पर कैमरा ठीक करना अधिक कठिन कार्यों में से एक है।
यदि आपके डिवाइस में पूरी तरह से काम करने वाले हार्डवेयर के साथ AOSP ROM पोर्ट किया गया है, तो उम्मीद है, आप शुरू कर सकते हैं उस संघर्ष की सराहना करें जो उन डेवलपर्स ने आपके लिए इन्हें लाने के लिए किया होगा विशेषताएँ। उनके काम के लिए उनकी सराहना करें, क्योंकि यह आसान नहीं है। यह बहुत सारा काम है जिस पर अधिकांश उपयोगकर्ताओं का ध्यान भी नहीं जाएगा, क्योंकि हमारे मंचों पर प्रतिभाशाली डेवलपर्स एंड्रॉइड के कई अनदेखे हिस्सों की देखभाल कर रहे हैं।
हम इस लेख के निर्माण में सुझाए गए कई योगदानों के लिए सुल्तानक्सडा को विशेष धन्यवाद देना चाहते हैं।