निष्पादित करने के लिए डेक्स में असमर्थ: में नहीं विधि आईडी [0, 0xffff]: 65536


344

मैंने पहले डीएक्स इरोस के विभिन्न संस्करणों को देखा है, लेकिन यह एक नया है। साफ / पुनः आरंभ करने आदि से कोई मदद नहीं मिलेगी। पुस्तकालय परियोजनाएं बरकरार हैं और निर्भरता सही ढंग से जुड़ी हुई लगती है।

Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

या

Cannot merge new index 65950 into a non-jumbo instruction

या

java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536

tl; dr : Google का आधिकारिक समाधान आखिरकार यहां है!

http://developer.android.com/tools/building/multidex.html

केवल एक छोटी सी टिप, आपको डेक्स-आईएनजी करते समय मेमोरी को रोकने के लिए ऐसा करने की आवश्यकता होगी।

dexOptions {
        javaMaxHeapSize "4g"
}

एक जंबो मोड भी है जो इसे कम विश्वसनीय तरीके से ठीक कर सकता है:

dexOptions {
        jumboMode true
}

अद्यतन: यदि आपका ऐप मोटा है और आपके मुख्य ऐप के अंदर बहुत अधिक विधियाँ हैं, तो आपको अपने ऐप को फिर से व्यवस्थित करना पड़ सकता है

http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html


1
क्या आप एपी का उपयोग करते हैं जो आपके कर्वी डिवाइस पर उपलब्ध नहीं है?
मार्के 4'13

यह, वहाँ एक अन्य परियोजना का निर्माण ठीक एक ही API वर्शन को लक्षित है।
एडिसन

तो आप कुछ बिंदु एपीआई पर उपयोग करें जो उपलब्ध नहीं है? क्या आप एक पंक्ति के साथ जाँच करते हैं if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)कि आप इस फ़ंक्शन को कॉल नहीं करते हैं यदि यह उपलब्ध नहीं है?
rekire

हाँ मैं करता हूँ। परियोजना पहले ठीक बनाया। इसके अलावा, यह एक रनटाइम त्रुटि होनी चाहिए, भले ही मैं लाइन से चूक गया हो।
एडिसन

यह शायद निर्भरता में से एक गड़बड़ है। (अभी maven + प्रोजेक्ट लिब का मिश्रण कर रहे हैं)
एडिसन

जवाबों:


379

अपडेट 3 (11/3/2014)
Google ने आखिरकार आधिकारिक विवरण जारी किया ।


अपडेट 2 (10/31/2014)
एंड्रॉइड के लिए ग्रैडल प्लगइन v0.14.0 मल्टी-डेक्स के लिए समर्थन जोड़ता है । सक्षम करने के लिए, आपको इसे build.gradle में घोषित करना होगा :

android {
   defaultConfig {
      ...
      multiDexEnabled  true
   }
}

यदि आपका एप्लिकेशन 5.0 से पहले एंड्रॉइड का समर्थन करता है (अर्थात, यदि आपका minSdkVersion20 या उससे कम है) तो आपको क्लास क्लासैडर को एप्लिकेशन को गतिशील रूप से पैच करना होगा, इसलिए यह माध्यमिक डेक्स से कक्षाएं लोड करने में सक्षम होगा। सौभाग्य से, एक पुस्तकालय है जो आपके लिए ऐसा करता है। इसे अपने ऐप की निर्भरता में जोड़ें:

dependencies {
  ...
  compile 'com.android.support:multidex:1.0.0'
} 

आपको जल्द से जल्द ClassLoader पैच कोड को कॉल करना होगा। MultiDexApplicationकक्षा का प्रलेखन तीन तरीके सुझाता है ( उनमें से किसी एक को चुनें , जो आपके लिए सबसे सुविधाजनक है):

1 - MultiDexApplicationअपने AndroidManifest.xml में आवेदन के रूप में वर्ग की घोषणा करें :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

2 - क्या आपकी Applicationकक्षा में मल्टीडेक्स्पेशन वर्ग का विस्तार है :

public class MyApplication extends MultiDexApplication { .. }

3 - MultiDex#installअपने Application#attachBaseContextतरीके से कॉल करें :

public class MyApplication {
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
        ....
    }
    ....
}

अपडेट 1 (10/17/2014):
जैसा कि प्रत्याशित है, एंड्रॉइड सपोर्ट लाइब्रेरी के संशोधन 21 में मल्टीडेक्स समर्थन को भेज दिया गया है। आप android-support-multidex.jar / sdk / extras / android / support / multidex / पुस्तकालय / libs फ़ोल्डर में पा सकते हैं।


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

अनवर गुलाम द्वारा इस Android डेवलपर्स बैकस्टेज पॉडकास्ट एपिसोड में कहा गया था । मैंने संबंधित भाग की एक प्रतिलेख (और सामान्य बहु-डीएक्स स्पष्टीकरण) पोस्ट की है।


2
ब्लॉग पोस्ट एक सेवर है! : D
nadavfima

39
ग्रहण उपयोगकर्ताओं के लिए कुछ भी?
मुहम्मद बाबर

52
@MuhammadBabar ग्रहण उपयोगकर्ताओं के लिए एंड्रॉइड स्टूडियो है।
विपुलकुमार

2
@ मोहम्मदअली ज़रूर, अगर हो सके तो इसका इस्तेमाल करने से बचें। लेकिन आपको क्या करना चाहिए अगर आपके पास वास्तव में आपके ऐप में बहुत अधिक विधियां हैं, और आपने पहले ही सभी चालें आजमाई हैं जैसे कि आपने उल्लेख किया है? बिल्ड समय के बारे में - इसके लिए समाधान है, कम से कम विकास बिल्ड के लिए - मेरा जवाब यहां देखें: stackoverflow.com/a/30799491/1233652
एलेक्स लिपोव

2
एंड्रॉइड के लिए क्यूटी पर, मैं अपने ऐप के लिए रनटाइम पर मुद्दों को ले रहा था जब मल्टीडेक्स समर्थन को सक्षम करने के बाद भी फेसबुक + ट्विटर के एसडीके को एक साथ एकीकृत किया गया था (विशेष रूप से यह एक त्रुटि मुझे बुरे सपने देती थी:) java.lang.ClassNotFoundException: Didn't find class "org.qtproject.qt5.android.QtActivityDelegate" on path: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]। यह पता चला कि मेरी गलती थी कि मैं 5.0 से पहले एंड्रॉइड समर्थन के लिए अतिरिक्त चरणों को लागू नहीं कर रहा था। उस विकल्प के साथ, विकल्प # 3 ने इसे हल किया, और मेरे पास और कोई ClassNotFoundExceptionसमस्या नहीं थी । धन्यवाद, @Alex Lipov!
लूट

78

जैसा कि पहले ही कहा गया है, आपके पास अपनी परियोजना और देयताओं में बहुत अधिक विधियाँ (65k से अधिक) हैं।

समस्या को रोकें: Play Services 6.5+ और support-v4 24.2+ के साथ तरीकों की संख्या कम करें

चूंकि Google Play सेवाएं अपने 20k + तरीकों के साथ "बर्बाद" करने के तरीकों में से एक मुख्य संदिग्ध हैं । Google Play सेवाओं का संस्करण 6.5 या उसके बाद, आपके लिए कई छोटे क्लाइंट पुस्तकालयों का उपयोग करके Google Play सेवाओं को अपने एप्लिकेशन में शामिल करना संभव है। उदाहरण के लिए, यदि आपको केवल GCM और मानचित्रों की आवश्यकता है, तो आप केवल इन निर्भरताओं का उपयोग करने का विकल्प चुन सकते हैं:

dependencies {
    compile 'com.google.android.gms:play-services-base:6.5.+'
    compile 'com.google.android.gms:play-services-maps:6.5.+'
}

उप पुस्तकालयों की पूरी सूची और यह जिम्मेदारियों को आधिकारिक Google डॉक्टर में पाया जा सकता है

अद्यतन : चूंकि समर्थन पुस्तकालय v4 v24.2.0 यह निम्नलिखित मॉड्यूल में विभाजित किया गया था:

support-compat, support-core-utils, support-core-ui, support-media-compatऔरsupport-fragment

dependencies {
    compile 'com.android.support:support-fragment:24.2.+'
}

हालांकि ध्यान दें, यदि आप उपयोग करते हैं support-fragment, तो इसके अन्य सभी मॉड्यूलों पर निर्भरता होगी (यानी यदि आप उपयोग करते हैं android.support.v4.app.Fragmentतो कोई लाभ नहीं है)

यहाँ देखें समर्थन- v4 lib के लिए आधिकारिक रिलीज़ नोट


मल्टीडेक्सिंग सक्षम करें

चूंकि लॉलीपॉप (उर्फ बिल्ड 21+ उपकरण) को संभालना बहुत आसान है। अप्रोच फाइल प्रॉब्लम के आसपास काम करने के लिए अप्रोच फाइल प्रॉब्लम के आसपास काम करना है। अपनी ग्रेडल बिल्ड फ़ाइल में निम्न जोड़ें ( यह 65k से अधिक विधियों के साथ आधिकारिक Google दस्तावेज़ से लिया गया है ):

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.0"

    defaultConfig {
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

दूसरा चरण या तो अपने एप्लिकेशन वर्ग को तैयार करना है या यदि आप आवेदन का विस्तार नहीं करते हैं तो MultiDexApplicationअपने एंड्रॉइड मेनिफेस्ट में उपयोग करें :

या तो इसे अपने Application.java में जोड़ें

@Override
  protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
  }

या mutlidex lib से प्रदान किए गए एप्लिकेशन का उपयोग करें

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

मल्टीडेक्स के साथ आउटऑफमेरी को रोकें

आगे की नोक के रूप में, यदि आप OutOfMemoryनिर्माण चरण के दौरान अपवादों में भाग लेते हैं तो आप ढेर को बड़ा कर सकते हैं

android {
    ...
    dexOptions {
        javaMaxHeapSize "4g"
    }
}

जो ढेर को 4 गीगाबाइट पर सेट करेगा।

डेक्स हीप मेमोरी मुद्दे पर अधिक विस्तार के लिए इस प्रश्न को देखें।


समस्या के स्रोत का विश्लेषण करें

तरीकों के स्रोत का विश्लेषण करने के लिए ग्रेडिंग प्लगइन https://github.com/KeepSafe/dexcount-gradle-plugin उदासीनता ट्री के साथ संयोजन में मदद कर सकता है जैसे उदा।

.\gradlew app:dependencies

Android में विधि गणना के बारे में अधिक जानकारी के लिए इस उत्तर और प्रश्न को देखें


मैंने प्ले सर्विसेज 6.5+ समाधान का उपयोग किया है और यह पूरी तरह से काम करता है। अतुल्य उपयोगी टिप। बहुत बहुत धन्यवाद!
होआंग गुयेन हुआ हू

यदि मैं अन्य सभी प्ले सर्विसेज सामानों को काट सकता / सकती हूं, तो हम बहु-डेक्स का सहारा लिए बिना इस मुद्दे का उपयोग नहीं कर रहे थे, जिसका निर्माण करते समय नकारात्मक प्रदर्शन प्रभाव पड़ता है।
शॉन बारब्यू

1
मेरी आँखों में आँसुओं के साथ आपको बहुत धन्यवाद। आपने मुझे बचाया
insomniac

मैंने GCM के लिए क्लाइंट लाइब्रेरी का उपयोग किया है, क्योंकि मैं प्ले सेवा से केवल gcm सेवा का उपयोग कर रहा हूं, अब इसने मेरी समस्या को ठीक कर दिया है। धन्यवाद! मेरा समय बचाने के लिए।
अंकित 10

57

आपका प्रोजेक्ट बहुत बड़ा है। आपके पास कई तरीके हैं। प्रति आवेदन केवल 65536 तरीके हो सकते हैं। यहां देखें https://code.google.com/p/android/issues/detail?id=7147#c6


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

5
अधिक विशिष्ट होने के लिए, डलविक निष्पादन योग्य (डेक्स) फ़ाइल में केवल 65,536 विधियाँ हो सकती हैं। और एक एप्लिकेशन (एपीके) में कस्टम लोडिंग जैसी चीजों के साथ एक से अधिक डेक्स फाइल हो सकती हैं।
डेनिस शील

7
यह वास्तव में Android के लिए शर्मनाक बग है! वैसे भी, मेरे मामले में मैंने जार को हटा दिया जो कि लिबास में था और उपयोग में नहीं था, और ऐप संकलित किया गया
डेविड

मेरी परियोजना को साफ करने का समय:
डेको

1
डिबग बिल्ड
एलेब के

12

नीचे दिए गए कोड में मदद मिलती है, अगर आप ग्रैडल का उपयोग करते हैं। 65k दहलीज से नीचे जाने के लिए आपको अनावश्यक Google सेवाओं को हटाने की अनुमति देता है (आप उनका उपयोग कर रहे हैं)। इस पोस्ट का सारा श्रेय: https://gist.github.com/dmarcato/d7c91b94214acd3636442

संपादित करें 2014-10-22 : ऊपर संदर्भित जिस्ट पर बहुत दिलचस्प चर्चा हुई है। TLDR? इसे इस तरह से देखें: https://gist.github.com/Takhion/10a37046b9e6d259bb31

इस कोड को अपनी build.gradle फ़ाइल के नीचे पेस्ट करें और उन Google सेवाओं की सूची को समायोजित करें जिनकी आपको आवश्यकता नहीं है:

def toCamelCase(String string) {
    String result = ""
    string.findAll("[^\\W]+") { String word ->
        result += word.capitalize()
    }
    return result
}

afterEvaluate { project ->
    Configuration runtimeConfiguration = project.configurations.getByName('compile')
    ResolutionResult resolution = runtimeConfiguration.incoming.resolutionResult
    // Forces resolve of configuration
    ModuleVersionIdentifier module = resolution.getAllComponents().find { it.moduleVersion.name.equals("play-services") }.moduleVersion

    String prepareTaskName = "prepare${toCamelCase("${module.group} ${module.name} ${module.version}")}Library"
    File playServiceRootFolder = project.tasks.find { it.name.equals(prepareTaskName) }.explodedDir

    Task stripPlayServices = project.tasks.create(name: 'stripPlayServices', group: "Strip") {
        inputs.files new File(playServiceRootFolder, "classes.jar")
        outputs.dir playServiceRootFolder
        description 'Strip useless packages from Google Play Services library to avoid reaching dex limit'

        doLast {
            copy {
                from(file(new File(playServiceRootFolder, "classes.jar")))
                into(file(playServiceRootFolder))
                rename { fileName ->
                    fileName = "classes_orig.jar"
                }
            }
            tasks.create(name: "stripPlayServices" + module.version, type: Jar) {
                destinationDir = playServiceRootFolder
                archiveName = "classes.jar"
                from(zipTree(new File(playServiceRootFolder, "classes_orig.jar"))) {
                    exclude "com/google/ads/**"
                    exclude "com/google/android/gms/analytics/**"
                    exclude "com/google/android/gms/games/**"
                    exclude "com/google/android/gms/plus/**"
                    exclude "com/google/android/gms/drive/**"
                    exclude "com/google/android/gms/ads/**"
                }
            }.execute()
            delete file(new File(playServiceRootFolder, "classes_orig.jar"))
        }
    }

    project.tasks.findAll { it.name.startsWith('prepare') && it.name.endsWith('Dependencies') }.each { Task task ->
        task.dependsOn stripPlayServices
    }
}

इसे प्यार करना! डीईएफ़ की जरूरत है क्योंकि Google जैसी कंपनियां पैकेजों को बढ़ाती रहती हैं।
एडीसन

1
अच्छा - यह काम पर हाजिर था। न कोई हैवानियत और न कोई चिंता!
slott

नोट: यह मेरे Android SDK में Android स्टूडियो में Google play Services के jars को हटा दिया गया है! एक बुरा विचार है क्योंकि मूल जार में वापस लौटना आसान नहीं है। लेखक को निर्माण निर्देशिका में जार बदलने के लिए स्क्रिप्ट को संशोधित करना चाहिए।
inder

@ंडर: मुझे वह समस्या नहीं आई। हालाँकि, मुझे cleanहर बार ऐसा करना पड़ता था जब मैं बहिष्कृत (हम एनालिटिक्स का उपयोग करते हैं) के साथ बंदर करता था।
जॉनीलैम्बडा

इसे रिलीज बिल्ड से कैसे हटाया जाए?
user1324936

6

मैंने एक नमूना परियोजना साझा की है जो custom_rules.xml बिल्ड स्क्रिप्ट और कोड की कुछ पंक्तियों का उपयोग करके इस समस्या को हल करती है।

मैंने इसे अपने प्रोजेक्ट पर इस्तेमाल किया और यह 1M + डिवाइस (एंड्रॉइड -8 से लेटेस्ट ऐंड्रॉयड -19) पर बेधड़क चलता है। आशा है ये मदद करेगा।

https://github.com/mmin18/Dex65536


1
स्क्रिप्ट के लिए धन्यवाद। आपको एआरटी के लिए देखना चाहिए। डिवाइस केवल आपके डिफ़ॉल्ट डेक्स को रूपांतरित कर सकता है और द्वितीयक को नहीं। रक्षक समाधानों को प्राथमिकता दी जानी चाहिए।
एडिसन

2
जब मैं परियोजनाओं को ग्रहण में आयात करता हूं और चलाता हूं तो यह त्रुटि देता है। "डेक्स को निष्पादित करने में असमर्थ: विधि आईडी [0, 0xffff]: 65536 में नहीं"। क्या आप प्रोजेक्ट के उपयोग की खोज कर सकते हैं
कराकैगो जू

6

एक ही समस्या का सामना करना पड़ा और निर्भरता अनुभाग पर मेरी बिल्ड.ग्रेडल फ़ाइल को संपादित करके इसे हल किया, हटा दिया:

compile 'com.google.android.gms:play-services:7.8.0'

और इसे बदलकर:

compile 'com.google.android.gms:play-services-location:7.8.0'
compile 'com.google.android.gms:play-services-analytics:7.8.0' 

उत्तम! मैं सिर्फ Google ड्राइव API का उपयोग करता हूं और यह काम करता है।
vedavis

5

नीचे दिए गए कोड को build.gradle में जोड़ने का प्रयास करें, यह मेरे लिए काम करता है -

compileSdkVersion 23
buildToolsVersion '23.0.1'
defaultConfig {
    multiDexEnabled true
}

2

इसके लिए सही समाधान प्रोगार्ड के साथ काम करना होगा। जैसा कि टिप्पणी में उल्लिखित है। यह डेक्स फ़ाइल के आकार को आधे से कम कर देगा।


1
सहमत, एक तेजी से बड़े गूगल प्ले सेवाओं जार के साथ विशेष रूप से * (18k तरीके अपने आप में)
एडिसन

2

आप Android स्टूडियो का उपयोग करके समस्या (डेक्स फ़ाइल संदर्भ) का विश्लेषण कर सकते हैं:

बिल्ड -> विश्लेषण APK ।।

परिणाम पैनल पर classes.dex फ़ाइल पर क्लिक करें

और आप देखेंगे:

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


0

gradle + proguard समाधान:

afterEvaluate {
  tasks.each {
    if (it.name.startsWith('proguard')) {
        it.getInJarFilters().each { filter ->
            if (filter && filter['filter']) {
                filter['filter'] = filter['filter'] +
                        ',!.readme' +
                        ',!META-INF/LICENSE' +
                        ',!META-INF/LICENSE.txt' +
                        ',!META-INF/NOTICE' +
                        ',!META-INF/NOTICE.txt' +
                        ',!com/google/android/gms/ads/**' +
                        ',!com/google/android/gms/cast/**' +
                        ',!com/google/android/gms/games/**' +
                        ',!com/google/android/gms/drive/**' +
                        ',!com/google/android/gms/wallet/**' +
                        ',!com/google/android/gms/wearable/**' +
                        ',!com/google/android/gms/plus/**' +
                        ',!com/google/android/gms/topmanager/**'
            }
        }
    }
  }
}

0

Libs फ़ोल्डर से कुछ जार फ़ाइल निकालें और किसी अन्य फ़ोल्डर में कॉपी करें, और _Project Properties> जावा बिल्ड पाथ चुनें, लाइब्रेरियों का चयन करें, बाहरी जार जोड़ें, अपनी परियोजना के लिए हटाए गए जार का चयन करें, सहेजें पर क्लिक करें, यह संदर्भित के तहत जोड़ा जाएगा Libs फ़ोल्डर के बजाय लाइब्रेरी। अब अपने प्रोजेक्ट को क्लीन एंड रन करें। आपको मल्टीडेक्स के लिए कोई कोड जोड़ने की आवश्यकता नहीं है। इसके बस मेरे लिए काम किया।


0

मैं आज उसी मुद्दे का सामना कर रहा था जिसके लिए काम करना नीचे से नीचे है

ANDROID STUDIO के लिए ... तुरंत रन सक्षम करें

फ़ाइल में-> प्राथमिकताएं-> निर्माण, निष्पादन, परिनियोजन-> त्वरित रन-> हॉट स्वैप के लिए इंस्टेंट रन को सक्षम करें ...

आशा है ये मदद करेगा


1
इसने मेरे लिए काम किया - मैंने बस इनेबल रन को निष्क्रिय कर दिया, अप्लाई को क्लिक कर दिया, इसे फिर से अक्षम कर दिया और इसने फिर से काम किया।
MrBigglesworth
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.