एसडीके एकीकरण मुद्दों का निदान कैसे करें। Yandex मोबाइल विज्ञापन एसडीके विकास टीम का अनुभव

सभी को नमस्कार! मेरा नाम दिमित्री फिस्को है, मैं Yandex मोबाइल विज्ञापन एसडीके विकसित कर रहा हूं। हमारी लाइब्रेरी को Android और iOS प्लेटफ़ॉर्म पर मोबाइल एप्लिकेशन को मुद्रीकृत करने के लिए डिज़ाइन किया गया है। आज मैं आपको एंड्रॉइड एप्लिकेशन में जटिल एसडीके एकीकरण त्रुटियों के विश्लेषण को सरल बनाने के बारे में बताना चाहता हूं। शायद हमारा अनुभव आपके लिए उपयोगी होगा।

हमारे उपयोगकर्ता - मोबाइल एप्लिकेशन के डेवलपर्स - हमेशा दस्तावेज़ीकरण नहीं पढ़ते हैं, इसलिए कभी-कभी वे एसडीके का उपयोग करने के जटिल तरीकों के साथ आते हैं। गलत एकीकरण विज्ञापन की प्रभावशीलता को कम कर सकता है, और इसलिए डेवलपर की आय को कम कर सकता है। डेवलपर्स को बेहतर विमुद्रीकरण अनुप्रयोगों की मदद करने के लिए, हमने एक सक्रिय निगरानी प्रणाली बनाई है जो मोबाइल एप्लिकेशन के प्रदर्शन का विश्लेषण करती है। यदि हम निगरानी के माध्यम से समस्या के बारे में सीखते हैं, तो हम डेवलपर्स से संपर्क करते हैं और उन्हें समस्या के स्रोत का पता लगाने और उसे हल करने में मदद करते हैं।

दुर्भाग्य से, सभी एसडीके एकीकरण त्रुटियों की निगरानी करके नहीं पहचाना जा सकता है। यदि ऐसी स्थिति उत्पन्न होती है, तो हम एकीकरण के विवरण को स्पष्ट करने के लिए भागीदार की ओर मुड़ते हैं। फिर हम समस्याओं के कारण को निर्धारित करने और उन्हें हल करने में मदद करने का प्रयास करते हैं। यदि त्रुटियों के कारण को निर्धारित करने के लिए भी यह जानकारी पर्याप्त नहीं है, तो हम आवेदन को रिवर्स इंजीनियर करने के लिए भागीदार से पूछते हैं। अनुमति के बाद, हम एक काले बॉक्स के रूप में आवेदन एसडीके में विज्ञापन के काम को देखना शुरू करते हैं। हम एक प्रॉक्सी के माध्यम से नेटवर्क गतिविधि देखते हैं, लेआउट इंस्पेक्टर आदि के माध्यम से विज्ञापन विचारों के प्रदर्शन की जांच करते हैं।

एंड्रॉइड 7.0 के साथ शुरू होने वाले एप्लिकेशन की नेटवर्क गतिविधि को देखना समस्याग्रस्त है, क्योंकि सिस्टम डिफ़ॉल्ट रूप से उपयोगकर्ता द्वारा निर्धारित प्रमाणपत्रों पर भरोसा नहीं करता है। प्रॉक्सी के माध्यम से एप्लिकेशन के एसएसएल ट्रैफिक को देखने के लिए सर्टिफिकेट इंस्टॉलेशन की आवश्यकता होती है। यह 7.0 से पहले एंड्रॉइड संस्करणों पर एप्लिकेशन लॉन्च करके या आवेदन में network_security_config जोड़कर समस्या का समाधान करेगा, उदाहरण के लिए, Apktool के माध्यम से। आप किसी इंसुलेटर या किसी डिवाइस पर एप्लिकेशन चलाकर लेआउट इंस्पेक्टर उपयोगिता के माध्यम से विज्ञापन विचारों का प्रदर्शन देख सकते हैं। इस स्थिति में, आपको Apktool के माध्यम से debuggable = true विशेषता जोड़कर AndroidManifest.xml फ़ाइल को संशोधित करने की आवश्यकता है।

यदि ब्लैक बॉक्स विधि पर्याप्त नहीं थी और समस्या को पुन: प्रस्तुत नहीं किया जा सकता था, तो आप एप्लिकेशन के तर्क को देख सकते हैं। ऐसा करने के लिए, आप एपीके अपघटन उपयोगिताओं का उपयोग कर सकते हैं, जैसे कि जेडएडीएक्स , बायटेकोड व्यूअर । लेकिन अक्सर यह दृष्टिकोण बहुत अधिक समय लेता है और हमेशा परिणाम नहीं देता है। इसलिए, यह समझने के लिए कि आवेदन अंदर से एसडीके का उपयोग कैसे करता है, हमने एक नए एसडीके कार्यान्वयन को पहले से निर्मित एप्लिकेशन में स्थानापन्न करने के लिए एक स्क्रिप्ट बनाई।

एक आवेदन में एक नया एसडीके कार्यान्वयन स्थापित करना


एसडीके कोड को बदलना आपको संशोधित एसडीके संस्करण की कक्षाओं के माध्यम से आवेदन में मनमाना कोड एम्बेड करने की अनुमति देता है और, उदाहरण के लिए, अतिरिक्त लॉगिंग मोड को सक्षम करें। ऑपरेशन एल्गोरिथ्म इस प्रकार है। स्क्रिप्ट:

  1. smali में एप्लिकेशन DEX फाइल को डिसैसमल करता है;
  2. SDK के नए संस्करण की JAR फ़ाइल को smali में कनवर्ट करता है;
  3. बदबूदार एसडीके फ़ाइलों के कार्यान्वयन को बदली हुई अनुप्रयोगों में बदल देता है;
  4. एसडीके के नए संस्करण के साथ एप्लिकेशन को फिर से बनाता है।


डी isassembling अनुप्रयोग डीएएक्स फ़ाइलों को स्माली में


आपको एप्लिकेशन को विघटित करने की आवश्यकता है, इसे छोटी इकाइयों में विभाजित करें, ताकि आप एप्लिकेशन कोड को बदले बिना एसडीके कक्षाओं के कोड को बदल सकें। इकट्ठे आवेदन के लिए कैसे संपर्क करें? DEX को स्माली फाइलों में इकट्ठा करें।

Android में, एप्लिकेशन DEX फ़ाइलों में कोड संग्रहीत करता है। आप उन्हें अनज़िप उपयोगिता के माध्यम से एप्लिकेशन से निकाल सकते हैं, क्योंकि एपीके संरचित सामग्री के साथ एक नियमित संग्रह है। DEX फाइलों में JAR की तुलना में सघन कोड पैकेजिंग के लिए एक द्विआधारी प्रारूप है। DEX की द्विआधारी प्रकृति के कारण, यह अमानवीय है, इसलिए DEX को बदलना स्वयं ही तर्कहीन है। पहली बात जो दिमाग में आती है वह है जावा में DEX को डिकंपोज करना। ऐसा रूपांतरण संभव है, लेकिन यह गैर-तुच्छ है और कोड की कार्यक्षमता के नुकसान के साथ होता है। इसलिए, हम अनुवाद का उपयोग स्माली-कोड में करेंगे। स्मली में परिवर्तित करने से आप DEX से निर्देशों को सटीक रूप से मानव-पठनीय रूप में काम करने योग्य कोड में रूपांतरण की संभावना के साथ स्थानांतरित कर सकते हैं।

स्माल यूटिलिटी को कॉल करना डीएक्स को स्माली कोड में कक्षाओं के एक सेट में परिवर्तित करता है। इस मामले में, उप-पैकेजों द्वारा कक्षाओं की प्रारंभिक व्यवस्था संरक्षित है।


नए एसडीके को बदबू में बदलना


हम एक प्रतिस्थापन एसडीके संस्करण तैयार करेंगे। समस्या की प्रतिलिपि प्रस्तुत करने योग्यता की गारंटी देने के लिए, हम एसडीके का एक संस्करण बनाएंगे जिसमें लॉगिंग सक्षम है उसी संस्करण के आधार पर जो पहले से ही एप्लिकेशन में एकीकृत है। आवेदन में यैंडेक्स मोबाइल विज्ञापन एसडीके के जुड़े संस्करण का पता लगाने के लिए सबसे आसान तरीकों में से एक है Android Android में Apk Analizer के माध्यम से MobileAds.getLibraryVersion () वर्ग में विधि की सामग्री को देखना। विज्ञापन एसडीके के उपयोग किए गए संस्करण का पता लगाने के बाद, हम इस रिलीज़ की शाखा में जाते हैं और अतिरिक्त लॉगिंग के साथ लाइब्रेरी संस्करण को इकट्ठा करते हैं। नतीजतन, हमें एक एएआर फ़ाइल मिलती है। इसमें संसाधन और पुस्तकालय कोड शामिल हैं। AAR फ़ाइल में, हम केवल JAR फ़ाइल के कोड में रुचि रखते हैं, क्योंकि हमारे SDK में कोई बाहरी संसाधन नहीं हैं: सभी संसाधन सीधे कोड में इनक्रिप्टेड हैं या बैकएंड से आते हैं। संसाधन फ़ाइलों की कमी आधुनिक बिल्ड सिस्टम के समर्थन के बिना आईडीई में एसडीके एकीकरण को सरल बनाती है।

SDK के संस्करण को एक नए में बदलने के लिए, हम AAR को उसी स्थिति में लाते हैं, जिस पर असंतुष्ट अनुप्रयोग है, अर्थात AAR से हमें smali फ़ाइलों का एक सेट मिलता है। रूपांतरण श्रृंखला के साथ होता है: AAR → JAR → DEX → SMALI:

  1. अनज़िप उपयोगिता का उपयोग करके एएआर से हम कोड के साथ जार को निकालते हैं;
  2. हम Android SDK टूल्स से dxdump उपयोगिता के माध्यम से JAR को DEX में परिवर्तित करते हैं;
  3. हम एक पैरामीटर के रूप में DEX फ़ाइल के साथ स्माली उपयोगिता का उपयोग करते हुए स्मली कोड में फाइलें प्राप्त करते हैं।


एसडीके कार्यान्वयन


लॉग के साथ एप्लिकेशन और एसडीके की स्माली-फाइलें प्राप्त करने के बाद, हम एसडीके कार्यान्वयन को एक नए के साथ बदल देते हैं। फिर हम एप्लिकेशन का पुनर्निर्माण करते हैं। जब स्माईली पर प्रसारित किया जाता है, तो परिणामी कक्षाएं उपपटेज द्वारा अपना स्थान बनाए रखती हैं। इसलिए, यदि वह पैकेज जहां एसडीके कक्षाएं स्थित हैं, ज्ञात है, तो लाइब्रेरी क्लास को एप्लिकेशन कक्षाओं से अलग करना आसान है। एसडीके कक्षाओं को कई डीईएक्स में वितरित किया जा सकता है। तो एल्गोरिथ्म जिसके द्वारा SDK कार्यान्वयन प्रतिस्थापित किया जाता है, एक या कई DEX फ़ाइलों के साथ एक अनुप्रयोग के लिए भिन्न होता है।

और एक डीईएक्स के साथ एक आवेदन में एसडीके कार्यान्वयन को बदलने के लिए एल्गोरिथ्म


एक एकल DEX एप्लिकेशन में, हम बस सभी आवेदन वर्गों में शीर्ष पर नए एसडीके स्माली कक्षाओं की प्रतिलिपि बनाते हैं और एक संशोधित DEX उत्पन्न करते हैं। आप baksmali उपयोगिता का उपयोग कर एक DEX फ़ाइल उत्पन्न कर सकते हैं। स्माली कोड में कक्षाओं की पैकेज फ़ाइलों के साथ निर्देशिका उपयोगिता इनपुट को खिलाया जाता है। आवेदन और नई एसडीके की संयुक्त स्माली-फ़ाइलों के बक्स्माली से गुजरने के बाद, हमें बदले हुए एसडीके तर्क के साथ एक संशोधित डीईएक्स-फ़ाइल मिलती है।


और मल्टीडेक्स के साथ एक आवेदन में एसडीके कार्यान्वयन को बदलने के लिए एल्गोरिथ्म


मल्टीडेक्स के साथ एक आवेदन के लिए, नए डीईएक्स में एक अलग एसडीके जोड़ें और एप्लिकेशन के बाकी डीएक्स फाइलों से एसडीके के पिछले संस्करण को हटा दें। अलग-अलग DEX में SDK का एक नया संस्करण जोड़ने से DEX प्रारूप में विधियों की संख्या पर सीमा समाप्त हो जाएगी। यदि इसे सही तरीके से नाम दिया गया है तो मल्टीडेक्स स्वचालित रूप से एसडीके कोड के साथ डीएक्स-फ़ाइल को लोड करेगा। मल्टीडेक्स बारी-बारी से डीएक्स फ़ाइलों की खोज करता है, फ़ाइल के अंत में सूचकांक का उपयोग करते हुए: पहले डेक्स 1, फिर डीएक्स 2 - और इसी तरह। यदि आप फ़ाइल को वृद्धिशील सूचकांक के साथ नाम देते हैं, तो मल्टीडेक्स स्वचालित रूप से वर्चुअल मशीन में लोड हो जाएगा। इस प्रकार, बकस्सली के माध्यम से, हम पहले प्राप्त एप्लिकेशन स्माईली फ़ाइलों के आधार पर डीईएक्स फाइलें उत्पन्न करेंगे, लेकिन पुराने एसडीएम संस्करण के हटाए गए वर्गों के साथ। और एसडीके के एक संशोधित संस्करण के साथ एक अतिरिक्त डीईएक्स फ़ाइल भी इकट्ठा करें, डीएक्स फ़ाइल के नाम में सूचकांक को बढ़ाते हुए।


एसडीके के नए संस्करण के साथ आवेदन का पुनर्निर्माण करें


हमें एसडीके के संशोधित संस्करण के साथ एप्लिकेशन डीईएक्स फाइलें मिलीं। बात छोटी है: हम DEX फ़ाइलों को मूल रूप से अनएक्सपेक्टेड APK फ़ाइल में संशोधित DEX फ़ाइलों के साथ बदल देंगे। और जिप कमांड को कॉल करके हम एपीके का अंतिम संस्करण प्राप्त करते हैं, जिस पर हस्ताक्षर करना बाकी है। हम डिबग कुंजी के माध्यम से एस्काइनर के माध्यम से हस्ताक्षर करेंगे ताकि एप्लिकेशन को डिवाइस पर स्थापित किया जा सके। संशोधित एसडीके तर्क के साथ आवेदन तैयार है।

एन सेविंग


एल्गोरिथ्म ज्यादातर मामलों के लिए काम करता है, लेकिन कभी-कभी यह एप्लिकेशन में एसडीके कार्यान्वयन को बदलने के लिए काम नहीं करेगा। इसके कारण:

  1. ऑबफसकेशन प्रोगार्ड। लाइब्रेरी की उपभोक्ता फ़ाइल में नियम ProGuard को SDK क्लासेस ले जाने से रोकते हैं। लेकिन अगर डेवलपर इन निर्देशों को रद्द कर देता है, तो लाइब्रेरी कक्षाओं का हिस्सा अपना पैकेज बदल सकता है। इस मामले में, एल्गोरिथ्म काम नहीं करेगा, क्योंकि स्क्रिप्ट को पुराने एसडीके के वर्गों का स्थान नहीं मिलेगा।
  2. DEX प्रारूप सीमा। यदि एप्लिकेशन का सभी कोड एक DEX फ़ाइल में संग्रहीत है, जो उपयोग की गई विधियों की सीमा को लगभग पूरी तरह से समाप्त कर चुका है। अतिरिक्त लॉगिंग वाले संस्करण के साथ एक आवेदन में एसडीके संस्करण को बदलते समय, तरीकों की संख्या बढ़ जाएगी। सीमा पार हो जाएगी। DEX प्रारूप में, सीमा 2 ^ 16 है।
  3. अपने एप्लिकेशन को परिवर्तन से सुरक्षित रखें। आवेदन में संशोधन का मुकाबला करने के लिए अंतर्निहित तंत्र हैं। उदाहरण के लिए, आवेदन हस्ताक्षर सत्यापन के माध्यम से। एपीके को बदलकर, हम तदनुसार उसके हस्ताक्षर बदलते हैं। जब आवेदन शुरू होता है, तो यह संदर्भ के खिलाफ हस्ताक्षर की जांच करता है और एक अपवाद फेंकता है। यदि यह मूल भाग में रखा गया है, तो इस चेक को निकालना विशेष रूप से मुश्किल है।

और टोगा


हमने आलेख में वर्णित चरणों को एक सरल बैश स्क्रिप्ट के साथ स्वचालित किया। स्क्रिप्ट में खामियां हैं, लेकिन यह एसडीके को भागीदार अनुप्रयोगों में एकीकृत करते समय जटिल समस्याओं के विश्लेषण को तेज करता है। हालांकि, हम शायद ही कभी इस दृष्टिकोण का उपयोग करते हैं, क्योंकि हम अक्सर पहले के चरणों में समाधान पाते हैं।

रूपांतरण से लेकर स्माली तक, आप अतिरिक्त लाभ प्राप्त कर सकते हैं: स्माईली-फाइलें आपको स्रोत के बिना एप्लिकेशन को डीबग करने की अनुमति देती हैं। डिबगिंग शुरू करने के लिए, आपको एप्लिकेशन की स्माली-फाइलों के आधार पर एंड्रॉइड स्टूडियो में एक प्रोजेक्ट तैयार करना होगा और डिबगर को ब्याज की प्रक्रिया में संलग्न करना होगा। इस लेख में अधिक विवरण लिखे गए हैं।

Source: https://habr.com/ru/post/hi460597/


All Articles