2017-10-18 9 views
11

मेरे पास एकाधिक लाइब्रेरी प्रोजेक्ट हैं और उनमें सभी की सहायता लाइब्रेरी के लिए निर्भरता है। मेरे आवेदन में इन एकाधिक लाइब्रेरी परियोजनाओं पर निर्भरता है। प्रत्येक लाइब्रेरी प्रोजेक्ट में उनके R.java फ़ाइल में लाइब्रेरी के संसाधनों का समर्थन करने के संदर्भ शामिल हैं। यह अनावश्यकता के कारण फ़ील्ड आईडी गिनती को बढ़ाता है। [, 0xffff 0] में नहीं क्षेत्र ID: क्योंकि यह अनावश्यक R.java संदर्भ की 65536एकाधिक आरजेवा में रिडंडेंट संसाधन संदर्भ DexIndexOverflowException

मेरा ऐप

DexIndexOverflowException हो जाता है।

इस वजह से मेरे ऐप में 47k विधियां हैं जबकि 65k फ़ील्ड आईडी हैं।

संपादित करें:

मैं बहु डेक्स का उपयोग नहीं होगा, यह मेरी समस्या का समाधान नहीं है। मैं अनावश्यक फ़ील्ड आईडी को दाढ़ी देना चाहता हूं।

प्रश्न इस समस्या के आसपास काम करने के बारे में नहीं है, सवाल यह है कि अनावश्यक फ़ील्ड आईडी से कैसे छुटकारा पाना है। बहु-डीएक्स का उपयोग अनावश्यक फ़ील्ड आईडी को नहीं हटाएगा।

उत्तर

3

@ IntelliJ-अमिय के जवाब की तरह, या proguard का उपयोग कर अपने समस्या का समाधान होगा और मैं व्यक्तिगत रूप से है कि सलाह देते हैं।

यदि आप उस विधि का पालन नहीं करना चाहते हैं, तो आप डुप्लीकेट निर्भरताओं को मैन्युअल रूप से बहिष्कृत कर सकते हैं।

डुप्लीकेट निर्भरताओं को खोजने के लिए अपने टर्मिनल में निम्न आदेश निष्पादित करें। अपनी परियोजना के नाम के रूप में

./gradlew :app:dependencies --configuration compile 

या खिड़कियों पर यदि आप,

gradlew.bat :app:dependencies --configuration compile 

परिवर्तन :app

मान लेते हैं अपने Gradle निर्भरता इस तरह कर रहे हैं दो:

compile 'com.android.support:support-compat:26.+' 
compile 'com.android.support:support-fragment:26.+' 

आप नीचे दिए गए की तरह उत्पादन प्राप्त होगा:

+--- com.android.support:support-compat:26.+ -> 26.0.0-alpha1 
| \--- com.android.support:support-annotations:26.0.0-alpha1 
\--- com.android.support:support-fragment:26.+ -> 26.0.0-alpha1 
    +--- com.android.support:support-compat:26.0.0-alpha1 (*) 
    +--- com.android.support:support-core-ui:26.0.0-alpha1 
    | +--- com.android.support:support-annotations:26.0.0-alpha1 
    | \--- com.android.support:support-compat:26.0.0-alpha1 (*) 
    \--- com.android.support:support-core-utils:26.0.0-alpha1 
      +--- com.android.support:support-annotations:26.0.0-alpha1 
      \--- com.android.support:support-compat:26.0.0-alpha1 (*) 

और तुम (*) के साथ चिह्नित निर्भरता को देख सकते हैं, और इन निर्भरताओं को बाहर रखा जा सकता है।आप देख सकते हैं support-compat दोहराया गया है, और बाहर निकालने के लिए यह संपादित करें द्वारा इस तरह से किया जाता है:

compile ('com.android.support:support-fragment:26.+') { 
    exclude module: 'support-compat' 
} 

इस दोहरा जब तक आप नीचे 64k

गिनती प्राप्त कर सकते हैं और अब सबसे कठिन हिस्सा बनी हुई है।

मेरे अनुभव में, कुछ निर्भरताओं को छोड़कर निर्माण विफल, रनटाइम अपवाद आदि हो सकता है। इसलिए आपको बिना किसी समस्या के अपने आवेदन को अच्छी तरह से जांचने की आवश्यकता है।

इस सहायता की आशा करें।

+1

'(*)' के साथ चिह्नित निर्भरता का मतलब है कि उनका पहले उल्लेख किया गया है। उन्हें बाहर मत करो। उनकी आवश्यकता है और केवल एक बार शामिल है। –

3

DexIndexOverflowException: में नहीं क्षेत्र आईडी [0, 0xffff]: 65536

  • एंड्रॉयड ऊपरी limit of Methods of 65536 पूर्व-निर्धारित किया है।

कब?

DEX फ़ाइल की विधि सूचकांक का आकार 16 बिट है, इसलिए इसका मतलब है कि 65536 संदर्भ एक भी DEX फ़ाइल के भीतर कोड से लागू किया जा सकता है की कुल संख्या का प्रतिनिधित्व करता है। अगर पराजित करें तो इस त्रुटि को उत्पन्न करें।

एक बार जब आप पर्याप्त पुस्तकालयों का कारण बनता है कि 64K विधि सीमा तक पहुँच होने के लिए शामिल करने के लिए शुरू करते हैं, आप बाहरी निर्भरता को दूर करने की जरूरत है।

कैसे?multiDex

  • का उपयोग किए बिना आप proguard जोड़ना चाहिए।

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

सक्षम कैसे Proguard

अपने build.gradle फ़ाइल में उचित निर्माण प्रकार में जोड़ने के minifyEnabled true

android { 
    buildTypes { 
     release { //You can add this in debug mode 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
        'proguard-rules.pro' 
     } 
    } 

} 

नोट

  1. getDefaultProguardFile('proguard-android.txt') विधि एंड्रॉयड एसडीके tools->proguard->folder से डिफ़ॉल्ट ProGuard सेटिंग हो जाता है।

  2. proguard-rules.pro फ़ाइल जहां कस्टम ProGuard नियम जोड़ सकते हैं।

संसाधन केवल कोड सिकुड़ने के साथ संयोजन के रूप में

संसाधन सिकुड़ते काम करता है सिकुड़। कोड सिकुड़ने के बाद सभी अप्रयुक्त कोड को हटा दिया जाता है, संसाधन सिकुड़ने वाला यह पहचान सकता है कि ऐप अभी भी किस संसाधन का उपयोग करता है।

buildTypes { 
    release { 
       minifyEnabled true 
       shrinkResources true //You can add this in debug mode 
    } 
} 
+0

'com.android.support: multidex: 1.0.1' api 19 और केवल निम्न के लिए आवश्यक है। असल में मेरे लिए कभी काम नहीं किया, मैं एपीआई 1 पर मल्टीडेक्स के साथ सफल नहीं था। मैं रिलीज बिल्ड के लिए प्रोगार्ड सिकुड़ नियमों के साथ समाप्त हुआ (फिर यह मल्टीडेक्स के बिना काम करता है) – user1209216

+1

@ user1209216 यह मेरे मामले में मल्टीडेक्स जोड़कर कभी काम नहीं करता है, लेकिन मैं इसे बना सकता हूं थोड़ा चिमटा कर काम करता है। हालांकि यह उत्तर सेशन की मदद नहीं करता है। –

+3

** पूरे पैकेज को न रखें! ** समर्थन लाइब्रेरी अपने स्वयं के न्यूनतम प्रोजेक्ट नियम लागू करती है, जो आपके सुझाव से अधिक अनुकूलित हैं। –

-1

मॉड्यूल build.gradle में निम्नलिखित के रूप में "multiDexEnabled true" जोड़कर मेरी समस्या हल हो गई।

android { 
      ... 
      defaultConfig { 
          ... 
          multiDexEnabled true 
         } 
     } 
संबंधित मुद्दे