त्रुटि: एकल डेक्स फ़ाइल में अनुरोधित कक्षाएं फिट नहीं की जा सकतीं। मुख्य-डीएक्स सूची की आपूर्ति करें। # विधियाँ: 72477> 65536


309

मैं फ़्यूस्ड स्थान सेवाओं को जोड़ना चाहता हूं लेकिन यह मुझे कुछ त्रुटि दिखाती है। मेरी मदद करो।

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "27.0.1"
    defaultConfig {
        applicationId "com.example.adil.bloodbankapplication"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:26.1.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.firebase:firebase-auth:11.8.0'
    compile 'com.google.firebase:firebase-database:11.8.0'
    compile 'com.android.support:support-v4:26.1.0'
    compile 'junit:junit:4.12'
    compile 'com.android.support:design:26.1.0'
    compile 'com.github.joielechong:countrycodepicker:2.1.5'
    compile 'com.jaredrummler:material-spinner:1.2.4'
    compile 'hanks.xyz:htextview-library:0.1.5'
    compile 'com.firebaseui:firebase-ui-database:1.2.0'
    compile 'com.google.android.gms:play-services:11.8.0'
}


apply plugin: 'com.google.gms.google-services'

जवाबों:


384

आपके द्वारा दिए गए उत्तरों में से कोई भी संपूर्ण नहीं था। समस्या मल्टीडेक्स में निहित है। आपको लाइब्रेरी को ऐप ग्रेड में जोड़ना होगा:

implementation 'com.android.support:multidex:1.0.3'

बाद में, एपेल डिफाल्ट के डिफॉल्टकॉन्ग में जोड़ें:

multiDexEnabled true

आपका एप्लिकेशन मल्टीडेक्स प्रकार का होना चाहिए .. आपको इसे मैनिफ़ेस्ट में लिखना होगा:

android:name=".MyApplication"

"MyApplication" या तो Multidex वर्ग होना चाहिए, या इसे इसे विस्तारित करना होगा।


5
तो MyApplication extends android.support.multidex.MultiDexApplication?
प्रतिबंध-जियोइंजीनियरिंग

2
मैं इस समाधान की कोशिश की है, लेकिन मैं इस नई समस्या के साथ समाप्त होता है: stackoverflow.com/questions/49518115/…
प्रतिबंध-जियोइंजीनियरिंग

22
यहां आधिकारिक Android doc पृष्ठ है कि ऐसा क्यों होता है और बेहतर रिलीज़-संस्करण बनाने के लिए अधिक स्पष्टीकरण प्रदान करते हैं APK: developer.android.com/studio/build/multidex
Vrakfall

2
यह समस्या को हल करने के लिए एक अच्छा तरीका नहीं है, अप्रयुक्त कोड और पुस्तकालयों को हटाने के लिए बेहतर है, अपने प्रोजेक्ट कोड को
रिफलेक्टर करें

5
80000 तरीकों का न होना एक अच्छा समाधान होगा अगर गोगल्स लाइब्रेरीज़ में 80000 तरीके नहीं थे (पूरे कारण कि उन्होंने मल्टीडेक्स जोड़ा क्योंकि उनकी अपनी सेवाओं की लाइब्रेरी थी जो वे चाहते थे कि हर कोई हजारों तरीकों का उपयोग कर सके)।
लस्सी किन्नुनेन

194

मैंने नीचे दिए गए समाधान के साथ अपनी समस्या तय की:

ग्रैड बिल्ड फ़ाइल में, निर्भरता जोड़ें:

कार्यान्वयन 'com.android.support:multidex:1.0.3'

और फिर "defaultConfig" अनुभाग में जोड़ें:

बहुविकल्पी सत्य


8
मेरे लिए काम किया। यहाँ विन्यास पर विस्तृत निर्देश: developer.android.com/studio/build/multidex#mdex-gradle
एलेक्स बर्दुलस

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

106

अपने एप्लिकेशन या मॉड्यूल को संशोधित करें build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 21 <----- *here
        targetSdkVersion 26
        multiDexEnabled true <------ *here
    }
    ...
}

आधिकारिक दस्तावेज के अनुसार

Android 5.0 और उच्चतर के लिए मल्टीडेक्स समर्थन

Android 5.0 (एपीआई स्तर 21) और उच्चतर एआरटी नामक रनटाइम का उपयोग करता है जो मूल रूप से एपीके फ़ाइलों से कई डीएक्स फ़ाइलों को लोड करने का समर्थन करता है। ART ऐप इंस्टॉल समय पर प्री-कंपटीशन करता है जो classesN.dex फ़ाइलों के लिए स्कैन करता है और उन्हें एंड्रॉइड डिवाइस द्वारा निष्पादन के लिए एक .oat फ़ाइल में संकलित करता है। इसलिए, यदि आपका minSdkVersion 21 या अधिक है, तो आपको मल्टीडेक्स समर्थन लाइब्रेरी की आवश्यकता नहीं है।

Android 5.0 रनटाइम के बारे में अधिक जानकारी के लिए, ART और Dalvik पढ़ें।

https://developer.android.com/studio/build/multidex


59

डेक्स फाइलें क्या हैं: एंड्रॉइड ऐप (एपीके) फ़ाइलों में डाल्विक एक्ज़ीक्यूटेबल (डीईएक्स) फ़ाइलों के रूप में निष्पादन योग्य बायटेकोड फाइलें होती हैं, जिसमें आपके ऐप को चलाने के लिए उपयोग किए गए संकलित कोड होते हैं।

इस अपवाद का कारण: DEX विनिर्देशन उन विधियों की कुल संख्या को सीमित करता है, जिन्हें किसी एकल DEX फ़ाइल में 65,536 (64K संदर्भ सीमा) के लिए संदर्भित किया जा सकता है - अपने स्वयं के कोड में Android ढांचे के तरीकों, लाइब्रेरी विधियों और विधियों को छोड़कर।

चरण 01. निम्न निर्भरता इस प्रकार जोड़ें

गैर-एंड्रॉइड उपयोगकर्ताओं के लिए,

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}
defaultConfig {
    minSdkVersion 16
    targetSdkVersion 28
    multiDexEnabled true  //ADD THIS LINE
}

Androidx उपयोगकर्ताओं के लिए,

dependencies {
  implementation 'androidx.multidex:multidex:2.0.1'
}
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  //ADD THIS LINE
    }

चरण 02:

उन सिंक प्रोजेक्ट्स को जोड़ने और चलाने से पहले प्रोजेक्ट को रन से पहले प्रोजेक्ट बनाना सुनिश्चित करें। अन्यथा, आपको एक अपवाद मिलेगा।


53

आप का अनुसरण कर सकते यह

एंड्रॉइड 5.0 (एपीआई स्तर 21) से पहले प्लेटफॉर्म के संस्करण ऐप कोड को निष्पादित करने के लिए डालविक रनटाइम का उपयोग करते हैं। डिफ़ॉल्ट रूप से, Dalvik एप्स को एक ही class.dex bytecode फाइल प्रति एपीके में सीमित करता है। इस सीमा के आसपास पाने के लिए, आप अपने प्रोजेक्ट में मल्टीडेक्स सपोर्ट लाइब्रेरी जोड़ सकते हैं:

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

यदि आपका minSdkVersion 21 या अधिक पर सेट है, तो आपको बस इतना करना होगा कि आपके मॉड्यूल-स्तर build.gradle फ़ाइल में सत्य के लिए मल्टीडेक्सिबल सेट किया जाए, जैसा कि यहां दिखाया गया है:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

33

जब आप निर्भरता का उपयोग कर रहे हैं तो आपके तरीके बढ़ गए! google के पास इसके लिए एक उपाय है। जिसे मल्टीडेक्स कहा जाता है!

नोट: सुनिश्चित करें कि न्यूनतम एसडीके 14 से अधिक है।

अपने build.gradle में:

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}



  dependencies {
      implementation 'com.android.support:multidex:1.0.3'
    }

AndroidX के लिए:

 def multidex_version = "2.0.1"
 implementation 'androidx.multidex:multidex:$multidex_version'

अधिक जानकारी के लिए कृपया मूल लिंक पर जाएं:

https://developer.android.com/studio/build/multidex


महान समाधान! मेरी समस्या ठीक की
वैभव हेरुग

29

हाय समस्या यहाँ है इसे हटा दें

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

क्यों?

नोट: संयुक्त खेल सेवाओं के लक्ष्य का उपयोग न करें। यह दर्जनों पुस्तकालयों में लाता है, आपके आवेदन को फुलाता है। इसके बजाय, केवल उन विशिष्ट Google Play सेवाओं को निर्दिष्ट करें जो आपके ऐप का उपयोग करता है।

और आपको जो चाहिए वो इस्तेमाल करें। https://developers.google.com/android/guides/setup

जैसे स्थान सेवा के लिए

com.google.android.gms:play-services-location:11.8.0

क्लाउड मैसेजिंग के लिए

com.google.android.gms:play-services-gcm:11.8.0

हाँ अब मैं समस्या का सामना कर रहा हूँ मेरा रन बटन अक्षम हो गया है।
मुहम्मद आदिल सत्तार

27

यदि आप DEBUG APK बना रहे हैं , तो बस जोड़ें:

debug {
            multiDexEnabled true
        }

के भीतर buildTypes

और यदि आप RAILASE APK बना रहे हैं , तो multiDexEnabled trueरिलीज़ ब्लॉक में निम्नानुसार जोड़ें-

release {
                ...
                multiDexEnabled true
                ...
        }

25

स्पंदन परियोजनाओं के लिए आप इस मुद्दे को भी हल कर सकते हैं

अपना \ android \ app \ build.gradle खोलें

आपके पास निम्नलिखित हैं:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

यदि आपका minSdkVersion 21 या उससे अधिक पर सेट है, तो आपको बस इतना करना होगा कि defaultConfig में सही पर multiDexEnabled सेट किया जाए। ऐशे ही

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true 

    }

}

अगर आपका minSdkVersion 20 पर सेट है या डिफ़ॉल्ट में बहु-उपयोगी जोड़ें को डिफ़ॉल्टफ़ॉन्ग के लिए सही है

और कार्यान्वयन को परिभाषित करते हैं

dependencies {
  implementation 'com.android.support:multidex:1.0.3'// or 2.0.1
}

अंत में आपके पास होना चाहिए:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true  // added this
    }

}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

अधिक जानकारी के लिए इसे पढ़ें: https://developer.android.com/studio/build/multidex


1
hhahaha! मुझे खुशी है कि इसने आपकी मदद की!
रिचर्ड

18

बस निम्नलिखित करें:

build.gradle

(module:app)


android {
            ....
      defaultConfig {
              multiDexEnabled true // enable mun
      }
}

और अपनी build.gradleऐप लेवल फ़ाइल में निर्भरता नीचे जोड़ें

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
} 

13
multiDexEnabled true

कृपया इसे अपने ऐप डिफॉल्ट कॉनफिग {} में जोड़ने का प्रयास करें। इस समस्या को हल करने में मेरी मदद करें


12

ग्रैड बिल्ड फ़ाइल में, निर्भरता जोड़ें:

implementation 'com.android.support:multidex:1.0.2'

या

implementation 'com.android.support:multidex:1.0.3'

या

implementation 'com.android.support:multidex:2.0.0'

और फिर "defaultConfig" अनुभाग में जोड़ें:

multiDexEnabled true

TargetSdkVersion के तहत

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

अब यदि आप इस त्रुटि का सामना करते हैं

त्रुटि: हल करने में विफल: मल्टीडेक्स-इंस्ट्रूमेंटेशन ओपन फाइल

आपको अपने ग्रेड को 3.0.1 में बदलना होगा

        classpath 'com.android.tools.build:gradle:3.0.1'

और फ़ाइल gradle-wrapper.properties में निम्न कोड डालें

distributionUrl = https: //services.gradle.org/distributions/gradle-4.1-all.zip

आखिरकार

प्रोजेक्ट में क्लास अप्लीकेशन जोड़ें और इसे AndroidManifest से मिलवाएं जो कि MultiDexApplication से लिया गया है

public class App extends MultiDexApplication {

@Override
public void onCreate( ) {
    super.onCreate( );
}

}

त्रुटि उत्पन्न करने के लिए पहले प्रोजेक्ट चलाएँ, फिर प्रोजेक्ट को साफ़ करें

अंत में, प्रोजेक्ट को फिर से लॉन्च करें और इसका आनंद लें


मेरे पास अभी भी "हल करने में विफल: मल्टीडेक्स-इंस्ट्रूमेंटेशन" है
Makalele

11

यदि आप Proify के साथ minifyEnabled का उपयोग कर रहे हैं, तो आपको बहु-डेक्स को सक्षम करने की आवश्यकता नहीं होगी। मैं एमजी डेवलपर से सहमत हूं कि यदि संभव हो तो आपको मल्टी-डेक्स से बचने की कोशिश करनी चाहिए। मेरा समाधान केवल डीबग बिल्ड के लिए मल्टी-डेक्स को सक्षम करना था। minifyEnabled रिलीज़ बिल्ड के लिए समस्या हल करता है

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        // getting error: Cannot fit requested classes in a single dex file.  # methods: 65537 > 65536
        // https://developer.android.com/studio/build/multidex
        // minifyEnabled true (used with release) will fix this by getting rid of unused method calls, but this will hide debugging info on crash
        multiDexEnabled true
    }
}

यदि हमें करना है तो मल्टीडेक्स का उपयोग करने की कुछ कमियां क्या हैं?
isJulian00

1
बहुत अच्छा सवाल, जिसका मेरे पास वास्तव में कोई जवाब नहीं है। यदि आपने ऐसा नहीं किया है, तो निम्नलिखित पढ़ें: developer.android.com/studio/build/multidex#mdex-gradle पर यह API> = 21 के लिए लगता है, बहुत अधिक समस्या नहीं है। <21 के लिए, लगता है कि एंड्रॉइड को कुछ फैंसी फुटवर्क करना होगा जो संभावित रूप से समस्या हो सकती है। चूंकि कई लोगों को इसे चालू करने की आवश्यकता है, इसलिए मेरा अनुमान है कि एंड्रॉइड ने इसे अच्छी तरह से काम किया है, इसलिए मैं इसके बारे में बहुत ज्यादा चिंता नहीं करूंगा। मैं जहां संभव हो, रूढ़िवादी रहना पसंद करता हूं।
एर्नी थॉमसन

10

मुझे पता नहीं क्यों, शायद यह इसलिए है क्योंकि मैं कोटलिन में विकसित होता हूं, लेकिन इस त्रुटि को ठीक करने के लिए मुझे आखिरकार एक वर्ग बनाना होगा MultiDexApplicationजो इस प्रकार है:

class MyApplication : MultiDexApplication() {
}

और अपने में Manifest.xmlमुझे सेट करना है

<application
        ...
        android:name=".MyApplication">

किसी को भ्रमित न करने के लिए, मैं यह भी करता हूं:

multiDexEnabled true
implementation 'com.android.support:multidex:1.0.3'

androidx के लिए, यह मेरे लिए भी काम करता है:

implementation 'androidx.multidex:multidex:2.0.0'

...

<application android:name="android.support.multidex.MultiDexApplication">

मेरे लिए काम नहीं करता है


MultiDexEnabled सच को स्थापित करने के बाद परियोजना को साफ और पुनर्निर्माण करना याद रखें। यह मेरे लिए तय है।
स्यूडोज़ाच

मैनिफ़ेस्ट में एप्लिकेशन नाम विशेषता को बदलना मेरे लिए भी काम नहीं करता था, लेकिन मल्टीलेक्स को ग्रेड बिल्ड फ़ाइल में सक्षम करना और कार्यान्वयन को जोड़ना काम नहीं करता था। ऐसा लगता है कि अब प्रकट नाम टैग को बदलना वैकल्पिक है?
कोड़ी

9

आपके पास बहुत अधिक विधियां हैं। एंड्रॉइड डेक्स फ़ाइल में 65536 तरीकों की एक सीमा है जो आपके पास होने की अनुमति है।

शुरुआत के लिए, अगर आपको Google play services API और केवल स्थान की आवश्यकता नहीं है, तो प्रतिस्थापित करें

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

साथ में

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

इससे बचने के लिए या अधिक अनुमति देने के तरीकों के लिए आप इस पेज का संदर्भ ले सकते हैं: https://developer.android.com/studio/build/multidex.html


हाँ, लेकिन यह वास्तविक समस्या नहीं है। मुझे लगता है कि मैं उसी पर निर्भरता जोड़ रहा हूं। फायरबेस के लिए एक और स्थान के लिए अन्य एक चेक दो पंक्तियों की जाँच करें।
मुहम्मद आदिल सत्तार

6

मुझे बस इतना करना था कि फ़ाइल> प्रोजेक्ट स्ट्रक्चर> ऐप> फ्लेवर्स में न्यूनतम एसडीके संस्करण को 21 पर सेट किया जाए


6

अपनी फ़ाइल android / app / build.gradle जोड़ें

 defaultConfig {
        applicationId "com.ubicacion"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 1
        versionName "1.0"
        multiDexEnabled true // ✔
        missingDimensionStrategy 'react-native-camera', 'general'
    }

5

मुझे दो बार इस त्रुटि का सामना करना पड़ा है और इसके लिए समाधान है; अपने लक्ष्य एसडीके को देखने के लिए आप ऐप ग्रेड फ़ाइल की जांच करें, यदि यह 20 या अधिक है, तो बस एक पंक्ति को अपने साथ जोड़ेंdefaultconfig { multiDexEnabled true }

यदि आपका टारगेटकेक 20 से कम है, तो अपने डिफॉल्टकॉन्ग में लाइन जोड़ें और निर्भरता भी जोड़ें

implementation 'com.android.support:multidex:1.0.3'.

अधिक के लिए इस लिंक की जाँच करें।

https://developer.android.com/studio/build/multidex#mdex-gradle


5

मल्टीडेक्स समर्थन का उपयोग करना अंतिम उपाय होना चाहिए। डिफ़ॉल्ट रूप से ढाल निर्माण से आपके APK के लिए एक टन सकर्मक निर्भरता प्राप्त होगी। जैसा कि Google डेवलपर्स डॉक्स में सुझाया गया है , पहले अपने प्रोजेक्ट से अनावश्यक निर्भरता को हटाने का प्रयास करें।

एंड्रॉइड प्रोजेक्ट्स रूट पर कमांड लाइन नेविगेट का उपयोग करना। आप इस प्रकार संकलित निर्भरता पेड़ प्राप्त कर सकते हैं।

gradlew app:dependencies --configuration debugCompileClasspath

आप निर्भरता के पेड़ की पूरी सूची प्राप्त कर सकते हैं

gradlew app:dependencies

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

फिर अपने ऐप build.gradle से अनावश्यक या सकर्मक निर्भरता को हटा दें। एक उदाहरण के रूप में यदि आपका ऐप 'com.google.api-client' नामक निर्भरता का उपयोग करता है, तो आप उन पुस्तकालयों / मॉड्यूल को बाहर कर सकते हैं जिनकी आपको आवश्यकता नहीं है।

implementation ('com.google.api-client:google-api-client-android:1.28.0'){
   exclude group: 'org.apache.httpcomponents'
   exclude group: 'com.google.guava'
   exclude group: 'com.fasterxml.jackson.core'
   }

फिर एंड्रॉइड स्टूडियो में बिल्ड> एनालाइज एपीके ... सामग्री देखने के लिए रिलीज / डिबग एपीके फाइल का चयन करें। यह आपको तरीके और संदर्भ गणना निम्नानुसार देगा।

APK का विश्लेषण करें


1
मल्टीडेक्स का उपयोग करने की कुछ कमियां क्या हैं अगर हमें करना है
isJulian00

2

बिल्ड में: ऐप

apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
    applicationId "com.proyecto.marketdillo"
    minSdkVersion 14
    targetSdkVersion 28
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    multiDexEnabled true
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
  }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
implementation 'com.google.firebase:firebase-core:16.0.7'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:support-v4:28.0.0-rc02'
implementation 'com.android.support:design:28.0.0-rc02'
implementation 'com.google.firebase:firebase-auth:16.1.0'
implementation 'com.squareup.picasso:picasso:2.5.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.google.firebase:firebase-firestore:17.1.5'
implementation 'com.android.support:multidex:1.0.3'
}
apply plugin: 'com.google.gms.google-services'

1
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.dev.khamsat"
        minSdkVersion 16
        targetSdkVersion 28
        versionCode 1
        versionName "2.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }

मेरे लिए भी यही काफी था।
nyxee

1

त्रुटि आपके ऐप ग्रैडल फ़ाइल में मौजूद वर्ग निर्भरता की संख्या के कारण होती है। यदि कक्षाएं 72,400 से अधिक हैं, तो आप फ़ाइल अनुक्रमण को बेहतर तरीके से संभालने के लिए एक समाधान के रूप में मल्टीडेक्स का उपयोग करना चाह सकते हैं। यहां से अधिक जानकारी प्राप्त करें: https://developer.android.com/studio/build/multidex

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