ऐप मॉडर्नाइजेशन के बाद बढ़ी हुई पद्धति की गणना


16

एएस: 3.5.3; एंड्रॉइड ग्रैडल प्लगिन: 3.5.0; गाद: 5.6.2;

हमने 'ऐप' मॉड्यूल को कई छोटे मॉड्यूल में विभाजित करने के बाद हमारे ऐप में संदर्भित तरीकों की संख्या में भारी वृद्धि देखी। लेकिन अजीब बात यह है कि प्रत्येक वर्ग द्वारा संदर्भित विधियों का जोड़ Android Apk विश्लेषक उपकरण में वर्णित कुल से कम है।

परीक्षण के उद्देश्य के लिए, मैंने WebActivity.class को 'ऐप' मॉड्यूल से 'एडेप्टर' मॉड्यूल में स्थानांतरित कर दिया है और संदर्भित विधि की गणना 181 तरीकों से बढ़ गई है।

संक्षेप में:

app / WebActivity = 63546 वास्तविक संदर्भित विधियां लेकिन 65394 विधियां दिखा रही हैं । अनुकूलक / WebActivity = 63543 वास्तविक संदर्भित तरीकों लेकिन दिखा 65,575 तरीकों।

हमने 4 नए मॉड्यूल जोड़ने / विभाजित करने के बाद लगभग 10k की वृद्धि हुई 'संदर्भित विधि गणना' देखी है।

सटीक मुद्दा क्या है?

एप्लिकेशन मॉड्यलाइज़ेशन कैसे संदर्भित पद्धति की संख्या में इतनी अधिक वृद्धि कर सकता है?

निम्नलिखित दो स्क्रीनशॉट हैं जिन्हें मैंने दो अलग-अलग एपीके के लिए लिया था-केवल अंतर है वेबएक्टिविटी को 'ऐप' मॉड्यूल से 'एडेप्टर' मॉड्यूल में ले जाया गया और 181 संदर्भित तरीकों में वृद्धि हुई:

'ऐप' मॉड्यूल में WebActivity यहां छवि विवरण दर्ज करें

WebActivity को 'अडैप्टर' मॉड्यूल में ले जाया गया यहां छवि विवरण दर्ज करें

स्क्रीनशॉट में, प्रत्येक वर्ग (लाल रंग में चिह्नित) द्वारा संदर्भित विधियों को जोड़ने का तरीका एप्पी एनालाइजर में दिए गए कुल के बराबर क्यों नहीं है?


मैंने एक मुद्दा बनाया है, आप इसे यहाँ पर जारी कर सकते हैं tracketracker.google.com/issues/146957168
रोहित सर्वे

जवाबों:


9

मैं लंबे समय से कोड प्रदर्शन और ट्यूनिंग मापदंडों के बारे में पढ़ रहा हूं। और, एंड्रॉइड प्रोग्राम मेरे फोकस में से एक हैं।

आइए पहले बुनियादी या सबसे महत्वपूर्ण अवधारणाओं पर परिचय दें, जिसमें हमें किसी समाधान तक पहुंचने में मदद मिलती है।

जैसा कि Android डेवलपर ने बताया है

मॉड्यूल स्वतंत्र रूप से निर्मित, परीक्षण और डिबग किया जा सकता है

इसलिए, मॉड्यूल के अपने ग्रेड और निर्भरता हैं । और आप इसे परियोजना में देख सकते हैं Hierarchy Viewer

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

  • वंशानुक्रम की गहराई बढ़ाएँ

यहाँ एक आरेख है जिसे मैंने इसे स्पष्ट करने के लिए प्लॉट किया था। जैसा कि आप देख सकते हैं। असतत मॉड्यूल का उपयोग करने के लिए, विधि ए को असतत मॉड्यूल के बिना 2N micro secsतुलना करने के लिए N micro secs

यहां छवि विवरण दर्ज करें

यह सवाल मेरे दिमाग में आता है कि संदर्भित तरीके मायने रखते हैं कि वंशानुक्रम की गहराई से संबंधित क्या है?

इसका उत्तर है: हालांकि मॉडर्नाइजेशन का उपयोग करने से रेफरेंस मेथड्स बढ़ जाता है। लेकिन, यह वास्तव में ऐप के प्रदर्शन को प्रभावित नहीं करता है और मुख्य संभव मुद्दा इनहेरिटेंस की गहराई है , जिसमें ज्यादातर मामलों में इग्नोर किया जाता है

मैं जोर देता हूं कि मॉडर्नाइजेशन में रेफरेंस मेथड्स बढ़े हैं, यह प्रत्येक मॉड्यूल ग्रैडल और डिपेंडेंसी के कारण है

एप्लिकेशन मॉड्यलाइज़ेशन कैसे संदर्भित पद्धति की संख्या में इतनी अधिक वृद्धि कर सकता है?

जिन स्थितियों में एपीके एनालाइज़र असर करता है वे महत्वपूर्ण रूप से संदर्भित तरीके हैं

यह भी ध्यान दें कि स्रोत कोड संकलित होने के बाद मिनिफ़िकेशन और कोड सिकुड़ सकता है।

उपरोक्त आधिकारिक बयान के अलावा, मैं एक और शर्त जोड़ना चाहता हूं जिसमें एपीके विश्लेषक का प्रभाव है:

डेवलपर को मॉडर्लाइज़ेशन में कितना अनुभव होता है?

मॉडर्नाइजेशन एक घर जैसा है कि आर्किटेक्चर (डेवलपर) यह परिभाषित करता है कि कहां किचन होना चाहिए और कहां रेस्ट रूम होना चाहिए और कहां WC होना चाहिए। क्या होगा अगर वास्तुकला WC और रसोई के संयोजन का फैसला करता है? हाँ, यह एक आपदा है।

यह तब हो सकता है, जब डेवलपर बहुत अधिक अनुभवी न हो, लेकिन मॉडर्लाइज़ेशन हो सकता है।


अतिरिक्त जानकारी के लिए जोड़ में ओपी सवालों के जवाब

यहाँ मैं टिप्पणियों में पूछे गए सवालों के जवाब देता हूं

अलग ग्रेडल को संदर्भित विधि गणना में क्यों जोड़ा जाएगा? और अलग निर्भरता के लिए, यदि अंतिम परिणाम एकल एपीके है तो मुझे नहीं लगता कि 'ऐप' में डुप्लिकेट निर्भरताएं और फीचर मॉड्यूल संदर्भित विधि गणना में जोड़ देंगे।

क्योंकि मॉड्यूल का निर्माण, परीक्षण और डिबग किया जा सकता है, तो उनके पास अपने स्वयं के ग्रेड और निर्भरताएं होनी चाहिए।

जबकि मल्टी-मॉड्यूल प्रोजेक्ट का अनुपालन किया जा रहा है, कंपाइलर कई .dexफाइलें बनाता है जिसमें शामिल हैं:

  • .dexकुल-एकीकृत निर्भरता के लिए एक फ़ाइल
  • मॉड्यूल .dexएस

निर्भरता .dexफ़ाइल सभी मॉड्यूल ग्रेड के एक एकीकृत है

चलो देखते हैं कि कैसे एक मॉड्यूल ग्रेडल अंतिम संदर्भित Mothods गणना को प्रभावित करता है ?!

एक ही परिणाम के साथ 2 APK एस हैं, लेकिन संदर्भित तरीकों में अंतर मायने रखता है।

आकृति 1 चित्र 2

वे दोनों खाली गतिविधियां हैं जिनमें 1.7kसंदर्भित तरीकों की गणना में अंतर है जो उनकी कार्यक्षमता पर बहुत अधिक निर्भर हैं। वे महत्वपूर्ण अंतर उनके मॉड्यूल ग्रेड पर है उनमें से एक को कॉन्फ़िगर किया गया था

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
}

एक और कॉन्फ़िगर किया गया

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.2.0-alpha01'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta4'
}

हालाँकि वे सिर्फ खाली गतिविधियाँ हैं लेकिन ग्रैडल में न्यूनतम अंतर के कारण 1.7kरेफरेंस मेथड काउंट्स में अंतर आया।

और ऐप ग्रैडल है

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation project(path: ':module')
}

प्रमुख चिंता यह है कि Apk विश्लेषक में व्यक्तिगत रूप से संदर्भित विधि गणना के अलावा कुल संदर्भित विधि संख्या से अलग क्यों है?

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

अपने स्क्रीनशॉट में आपने कई .dexफ़ाइलों का चयन किया है तो एनालाइज़र फ़िल्टर समानता।

हमारी परियोजना में हम केंद्रीकृत निर्भरता.ग्रेड फ़ाइल का उपयोग कर रहे हैं, इसलिए विभिन्न संस्करण की संभावना नहीं है। तो, क्या आपको लगता है कि अगर हमारे पास एक ही / सटीक निर्भरताएँ हैं और फीचर मॉड्यूल में उनके संस्करण हैं, तो यह संदर्भित विधि की संख्या में वृद्धि करेगा?

सैद्धांतिक रूप से इसे संदर्भित विधि संख्या में वृद्धि नहीं करनी चाहिए । लेकिन , जैसा कि मैंने इसे समझाया, डेवलपर का अनुभव अंतिम परिणाम को अत्यधिक प्रभावित करता है।

टीम एनालाइजर को रिलीज से पहले प्रदर्शन के मुद्दों को जांचना और ठीक करना चाहिए

  • रक्षक नियम
  • सिकुड़ और छोटा संसाधन
  • AndroidManifest.xml
  • ढाल सेटिंग्स

अब मैं इसे स्पष्ट करना चाहता हूं कि डेवलपर अनुभव और कोड रखरखाव अंतिम परिणाम को कैसे प्रभावित करता है। EVEN अगर आपका एपीके सेंट्रलाइज्ड डिपेंडेंसी का इस्तेमाल करता है

चित्र तीन

उपर्युक्त उदाहरण में, मैं 5.1kसंदर्भित तरीकों में वृद्धि कर रहा हूं, यदि मैं केंद्रीयकृत निर्भरता रखता था तो गणना करें !!!!!

यह कैसे संभव है ?

इसका उत्तर है: मैंने परियोजना की निर्देशिका .jarमें एक बेकार और छिपी हुई फ़ाइल को जोड़ा libs। बस के रूप में आसान के रूप में आप देख सकते हैं मैं अंतिम परिणाम को प्रभावित किया।

जैसा कि आप देख सकते हैं कि डेवलपर अनुभव अंतिम result.as को प्रभावित करता है, व्यावहारिक रूप से यह संभव है कि संदर्भित विधियों को बढ़ाया जाए, हालांकि सैद्धांतिक रूप से नहीं होना चाहिए ।

और जब मैं समांतर संकलन को अक्षम करके केवल 'ऐप' मॉड्यूल संकलित करता हूं तो संदर्भित विधि गणना में कोई अंतर क्यों है? यह कम हो जाना चाहिए क्योंकि केवल 'ऐप' मॉड्यूल की निर्भरता का उपयोग किया गया होगा, है ना?

संकलन का संदर्भित तरीकों से कोई संबंध नहीं है। मायने रखता है कि डेवलपर क्या अनुपालन करना चाहता है।


निष्कर्ष

मैंने मुद्दे के चारों ओर सभी संभावनाओं को कवर किया है। वास्तव में, इसे विभिन्न स्थितियों से उभारा जा सकता है और एक डेवलपर इस दिशानिर्देश का उपयोग करके समस्या को ठीक कर सकता है।

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

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



धन्यवाद Mr.AF, मैं जवाब पाने के बाद उम्मीद कर रहा था "यह सवाल मेरे दिमाग में आया है कि संदर्भित तरीके मायने रखता है कि वंशानुक्रम की गहराई से संबंधित क्या है? जवाब है," लेकिन आपने इसका जवाब नहीं दिया। क्या आप कृपया विस्तार से बता सकते हैं कि वंशानुक्रम की गहराई में संदर्भित विधि की संख्या क्यों बढ़ जाती है? जैसा कि हमारे मामले में हमने कोई अतिरिक्त परत नहीं जोड़ी है, लेकिन सिर्फ 'ऐप' मॉड्यूल को विभाजित करें। 'ऐप' मॉड्यूल के माध्यम से किसी अन्य फ़ीचर मॉड्यूल के तरीकों तक पहुँचने के मामले में संदर्भित विधि गणना में वृद्धि का एक मौका है, क्या यही कारण है?
रोहित सूरसे

@RohitSurwase का उत्तर शेष विवरण है। वंशानुक्रम की अनुपस्थिति विधि संदर्भों को नहीं बढ़ाती है, ऐसा करने वाले संशोधन और वंशानुक्रम के प्रतिदीप्ति cuz की गहराई।
१५:१५ पर मि

@RohitSurwase, अन्य मॉड्यूल में किसी अन्य सुविधा तक पहुँचने वाली सुविधा वास्तव में संदर्भित तरीकों को अत्यधिक नहीं बढ़ाती है। संदर्भित पद्धति की संख्या में वृद्धि का मुख्य कारण ग्रेड और निर्भरता है जो प्रत्येक मॉड्यूल की आवश्यकता होती है।
मि

@RohitSurwase आप मॉड्यूल से मॉड्यूल संबंध के बारे में अच्छी युक्तियों को इंगित करते हैं। तथ्य की बात के रूप में, यदि 2 मॉड्यूल में बहुत सारे संबंध और संदर्भित विधियां हैं, तो उन्हें बेहतर प्रदर्शन के लिए जोड़ा जाना चाहिए। वास्तव में मॉड्यूल शब्द और अवधारणा में स्वतंत्र होने की जरूरत है।
Mr.AF

1
@RohitSurwase जैसा कि मैंने बताया कि, अप्रयुक्त जार आपका मामला नहीं हो सकता है। संभव है कि मेरा मतलब डेवलपर अनुभव है और यह संभव है, संभावना विभिन्न स्रोतों से उभर सकती है। और मैंने उन सभी संभावित स्रोतों को सूचीबद्ध किया है
जिनकी

2

समाधान के रूप में मेरे स्वयं के प्रश्न का उत्तर देना मेरे दिमाग में बस क्लिक किया गया है, हालांकि यह कोशिश नहीं की गई है, लेकिन निश्चित रूप से या शायद सबसे अधिक काम करेगा। :) अंतिम समाधान तक पहुँचने के लिए Mr.AF द्वारा दिया गया उत्तर बहुत उपयोगी था। यह क्यों बात करता है? लेकिन यह नहीं कि इससे कैसे बचा जाए या उस पर कैसे सुधार किया जाए।

यहाँ मूल / वास्तविक संदर्भित विधि गणना को वापस लेने का एक तरीका है -

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

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

हम दोनों को प्राप्त कर सकते हैं यदि हम डिबग और रिलीज़ बिल्ड के लिए निर्भरता को अलग कर सकते हैंडिबग बिल्ड के लिए 'कार्यान्वयन' का उपयोग करके सभी निर्भरताएं जोड़ें और केवल 'एपी' का उपयोग करके रिलीज़ बिल्ड के लिए आवश्यक और अनुकूलित निर्भरता जोड़ें । इस तरह डिबग बिल्ड तेजी से होगा और रिलीज बिल्ड धीमी होगी जो सस्ती है।

नोट: डिबग और रिलीज़ बिल्ड के लिए अलग-अलग निर्भरता प्रदान करने का तरीका जानने के बाद मैं इस उत्तर को अपडेट करूंगा।


मुझे यह पसंद आया। अच्छी सामग्री।
मि। स.फा.

0

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


हां मैंने 'कॉम' सहित प्रत्येक पैकेज का विस्तार और जांच की। प्रमुख चिंता यह है कि Apk विश्लेषक में व्यक्तिगत रूप से संदर्भित विधि गणना के अलावा कुल संदर्भित विधि संख्या से अलग क्यों है?
रोहित सुरवासे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.