.Dex फ़ाइल में विधि संदर्भों की संख्या 64k API 17 से अधिक नहीं हो सकती है


154

मैं सुगर लाइब्रेरी के साथ एक ऐप बना रहा हूं लेकिन जब मैं एपीआई 17 के लिए प्रोजेक्ट बनाने की कोशिश करता हूं (दूसरों के लिए जांच नहीं करता) तो यह बिल्ड एरर दिखाता है।

    Information:Gradle tasks [:app:assembleDebug]
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72330Library UP-TO-DATE
:app:prepareComAndroidSupportCardviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2330Library UP-TO-DATE
:app:prepareComAndroidSupportMediarouterV72300Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42330Library UP-TO-DATE
:app:prepareComAndroidSupportSupportVectorDrawable2330Library UP-TO-DATE
:app:prepareComAndroidVolleyVolley100Library UP-TO-DATE
:app:prepareComGithubSatyanSugar14Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServices840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAds840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAnalytics840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppindexing840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppinvite840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAppstate840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesCast840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesDrive840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesFitness840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGames840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesGcm840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesIdentity840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesLocation840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesNearby840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPanorama840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesPlus840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesSafetynet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesVision840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWallet840Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesWearable840Library UP-TO-DATE
:app:prepareMeDrakeetMaterialdialogLibrary131Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJavaWithJavac
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:prePackageMarkerForDebug
:app:transformClassesWithDexForDebug
Error:The number of method references in a .dex file cannot exceed 64K.
Learn how to resolve this issue at https://developer.android.com/tools/building/multidex.html
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
Information:BUILD FAILED
Information:Total time: 21.663 secs
Information:2 errors
Information:0 warnings
Information:See complete output in console

लेकिन जब मैं android v5.0 या इसके बाद के संस्करण के लिए इस परियोजना का निर्माण करता हूं, तो यह ठीक काम करता है। अगर मैं शुगर कमेल निर्भरता को हटाता हूं तो यह दोनों डिवाइसों v4.2.2 और v5.0 के लिए ठीक काम करता है।



इस लिंक का उपयोग करने का प्रयास करें android-arsenal.com/details/1/337 प्रमोशन के साथ सुगरोम का उपयोग निर्दिष्ट करता है
Shaan_B

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

1
@RunLoop ढीली आशा मत करो .... मैंने पाया कि एंड्रॉइड अब तक विकसित सबसे अच्छा प्लेटफ़ॉर्म है .... मोच फ्लेक्सिबल और शक्तिशाली .... जैसा कि आप अपने हाथों को कोडिंग में गंदा कर देंगे .... यह ठीक रहेगा। .... हर त्रुटि संदेश उपयोगी है। लेकिन संदेशों को समझने की जरूरत है
संदीप सिंह राणा

2
@ बजाज खान One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.मैं शीर्ष (और स्वीकृत) उत्तर का सुझाव देता हूं।
जॉन गुडविन

जवाबों:


331

आपके पास कई तरीके हैं। डेक्स के लिए केवल 65536 तरीके हो सकते हैं ।

जैसा कि सुझाव दिया गया है कि आप मल्टीडेक्स समर्थन का उपयोग कर सकते हैं ।

बस इन पंक्तियों को इसमें जोड़ें module/build.gradle:

android {

    defaultConfig {
        ...

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

dependencies {
  implementation 'com.android.support:multidex:1.0.3'  //with support libraries
  //implementation 'androidx.multidex:multidex:2.0.1'  //with androidx libraries
}

इसके अलावा अपने में Manifestजोड़ने के MultiDexApplicationआवेदन तत्व को multidex समर्थन पुस्तकालय से वर्ग

    <?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">

            <!-- If you are using androidx use android:name="androidx.multidex.MultiDexApplication" -->

            <!--If you are using your own custom Application class then extend -->
            <!--MultiDexApplication and change above line as-->
            <!--android:name=".YourCustomApplicationClass"> -->

            ...
        </application>
    </manifest>

यदि आप अपनी Applicationकक्षा का उपयोग कर रहे हैं , तो मूल वर्ग को इसमें से बदल Applicationदें MultiDexApplication
यदि आप ऐसा नहीं कर सकते हैं, तो आपके एप्लिकेशन वर्ग के attachBaseContextसाथ विधि को ओवरराइड करें :

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

एक अन्य उपाय है कि प्रोगार्ड के साथ अप्रयुक्त कोड को हटाने की कोशिश करें - प्रोगार्ड को चलाने के लिए अपने ऐप के लिए प्रोगार्ड सेटिंग्स कॉन्फ़िगर करें और सुनिश्चित करें कि आपके पास रिलीज़ बिल्ड के लिए सिकुड़ सक्षम है।


1
@ ऑवरराइड संरक्षित शून्य अटैचबेसबोंटेक्स्ट (प्रसंग newBase) {super.attachBaseContext (newBase); MultiDex.install (this); } ओवरराइड भी
संदीप सिंह राणा

1
Cmd पर क्लिक करने से MultiDexApplication, मुझे विघटित .class फ़ाइल दिखाई देती है जो पहले से ही आपके द्वारा वर्णित अटैचमेंट BaseContext () को ओवरराइड करती है। इसलिए यह आवश्यक नहीं होगा कि मैं फिर से अनुमान
लगाऊँ

4
क्या होगा अगर मेरे पास बहुत सारे तरीके नहीं हैं। मेरे पास अपने ऐप पर उतने तरीके नहीं हैं। मेरा मानना ​​है कि यह उस तक भी नहीं पहुंचता है।
नियॉन वेज

6
मैंने केवल अपनी बिल्ड.grandle फ़ाइल में ये दो भाग किए: "multDexEnabled true" और संकलन 'com.android.support:multidex:1.0.0'। मुझे अपनी मैनिफ़ेस्ट फ़ाइल में कुछ भी बदलने की ज़रूरत नहीं थी और न ही आपके द्वारा अटैच किए गए अन्य चीजों को संलग्न करने के बारे में बताया गया है, जैसे बन्सेन्टेक्स्ट इत्यादि, लेकिन आपके समाधान ने मेरे लिए समस्या तय कर दी! धन्यवाद।
जेम मोंटोया

2
@NeonWarge शायद आपकी निर्भरता के कारण। शायद, आपने संपूर्ण Google Play सेवाएँ शामिल की हैं? विवरण के लिए
mr5

131

Android / app / build.gradle में

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

इसे अपने डिफ़ॉल्ट के अंदर रखें:

multiDexEnabled true 

इससे मेरा काम बनता है


3
यह लॉलीपॉप या उच्चतर के लिए है न?
विक टॉरियस

1
यह बिल्ड को सफल बनाता है, लेकिन लॉन्च के बाद ऐप क्रैश हो जाता है।
वसंत

18

मुझे यह त्रुटि संदेश मिला क्योंकि मेरी परियोजना के कोड को मेरी build.gradleफ़ाइल में अपडेट करने के लिए संकलित संस्करण :

android {
    ...
    buildToolsVersion "23.0.2"
    ...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0' }

संस्करण को ठीक करके इसे हल करें:

android {
        ...
        buildToolsVersion "23.0.2"
        ...
    }

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:design:23.0.1'
}

2
मैं सरल ऐप बना रहा हूं, जो तब तक ठीक काम करता है जब तक मैंने Google मैप ऑब्जेक्ट ट्यूटोरियल का अनुसरण करने की कोशिश नहीं की। अचानक मैं अब और संकलन नहीं कर पा रहा था। इस समाधान ने तय किया है कि मेरे लिए। पृथ्वी पर आपने इसे कैसे काम किया?
मैककारो

4
इस विधि ने सौभाग्य से काम किया क्योंकि नए संकलित पुस्तकालयों में बहुत अधिक विधियाँ हैं (65536 से अधिक), और पुराने पुस्तकालय नहीं करते हैं। तो यह सिर्फ एक त्वरित फिक्स है, जितनी जल्दी या बाद में आपको स्वीकृत उत्तर की तरह मल्टीडेक्स समर्थन जोड़कर ठीक करना चाहिए।
क्वान गुयेन

15

इसी से मेरा काम बना है:

ऐसा इसलिए होता है क्योंकि बहुत सारे अप्रयुक्त तरीके हैं। इनमें से अधिकांश विधियाँ आपके build.gradle में शामिल पुस्तकालयों से आ रही हैं

इसको ठीक करने के लिए और उसी समय अपने कोड को साफ़ करने के लिए संसाधनों को छोटा और सिकोड़ें।

buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled true
            shrinkResources true
        }
    }

12

एप्लिकेशन स्तर build.gradle बदलें:

android {

compileSdkVersion 23

 buildToolsVersion '23.0.0'

    defaultConfig {
        applicationId "com.dkm.example"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
    }

यह मेरे लिए काम किया।


हाँ, यह एक पुराना मुद्दा है, लेकिन एपीआई के अंतिम संस्करणों के लिए हमें केवल multiDexEnabledविकल्प की आवश्यकता है, बिना निर्भरता या प्रकट फ़ाइल परिवर्तन के
Hpsaturn

11

यह त्रुटि तब भी हो सकती है जब आप सभी Google play services के एप को लोड करते हैं जब आप केवल afew का उपयोग करते हैं।

जैसा कि Google द्वारा कहा गया है: "6.5 से पहले Google Play सेवाओं के संस्करणों में, आपको एपीआई के पूरे पैकेज को अपने ऐप में संकलित करना था। कुछ मामलों में, ऐसा करने से आपके ऐप में तरीकों की संख्या को बनाए रखना और अधिक कठिन हो गया (सहित) 65,536 सीमा के तहत फ्रेमवर्क एपीआई, पुस्तकालय के तरीके, और आपका अपना कोड)।

संस्करण 6.5 से, आप इसके बजाय Google Play सेवा API को अपने ऐप में चुन सकते हैं।

उदाहरण के लिए जब आपके ऐप को प्ले-सर्विसेज-मैप्स, प्ले-सर्विसेज-लोकेशन की जरूरत हो। आपको अपने बिल्ड में केवल दो एप्स जोड़ने की जरूरत है। ऐप लेवल पर नीचे दिए गए शो के रूप में फाइल करें:

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

के बजाय:

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

Google Play सेवाओं की पूर्ण प्रलेखन और सूची के लिए एपिस यहां क्लिक करें


9

जब आपका ऐप संदर्भ 65,536 से अधिक हो जाता है , तो आप एक बिल्ड त्रुटि का सामना करते हैं जो इंगित करता है कि आपका ऐप एंड्रॉइड बिल्ड आर्किटेक्चर की सीमा तक पहुंच गया है

Android 5.0 से पहले मल्टीडेक्स समर्थन

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

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

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

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

64K की सीमा से बचें

  • प्रोगार्ड के साथ अप्रयुक्त कोड निकालें - कोड सिकुड़ सक्षम करें

के लिए ऐप में मल्टीडेक्स कॉन्फ़िगर करें

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

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

यदि आपका minSdkVersion 20 या उससे कम पर सेट है, तो आपको मल्टीडेक्स समर्थन लाइब्रेरी का उपयोग करना होगा

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

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

एप्लिकेशन वर्ग को ओवरराइड करें, इसे मल्टीडेक्सएप्लिकेशन (यदि संभव हो तो) के विस्तार के लिए बदल दें :

public class MyApplication extends MultiDexApplication { ... }

मैनिफ़ेस्ट फ़ाइल में जोड़ें

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

8

मैं एक ही समस्या का सामना कर रहा हूं और मल्टीडेक्स समर्थन के लिए, आपको अपने आवेदन के minSdkVersion को ध्यान में रखना होगा । यदि आप minSdkVersion 21 या इसके बाद के संस्करण का उपयोग कर रहे हैं तो बस इस तरह से मल्टीडेक्नेबल राइट लिखें

defaultConfig {
    applicationId *******************
    minSdkVersion 21
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

यह मेरे लिए काम करता है और अगर आप 21 से नीचे ( लॉलीपॉप से नीचे ) मिनीस्क्रीम का उपयोग कर रहे हैं तो आपको दो अतिरिक्त काम करने होंगे

1. सबसे पहले इस निर्भरता को जोड़ें

संकलन 'com.android.support:multidex:1.0.1'

अपने build.gradle में।

2. अंतिम और दूसरा प्रकट में आपके आवेदन के नीचे एक पंक्ति जोड़ें

एंड्रॉयड: नाम = "android.support.multidex.MultiDexApplication"

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:name="android.support.multidex.MultiDexApplication"
    android:theme="@style/AppTheme" >
    <activity android:name=".MainActivity" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

बिंगो तब यह निचले संस्करण में भी काम करेगा .. :) हैप्पी कोडिंग


1

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

उदाहरण के लिए आधिकारिक फेसबुक एनालिटिक्स गाइड में

वे स्पष्ट रूप से कहते हैं कि आपको निम्नलिखित निर्भरता को जोड़ना चाहिए:

implementation 'com.facebook.android:facebook-android-sdk:[4,5)'

जो वास्तव में संपूर्ण FacebookSDK है - इसलिए यदि आपको उदाहरण के लिए केवल Analytics की आवश्यकता है, तो आपको इसे बदलने की आवश्यकता है:

implementation 'com.facebook.android:facebook-core:5.+'

फेसबुक आंशिक एसडीके विकल्प


पूर्णतया सहमत। उदाहरण के लिए मेरे मामले में, मुझे बस "फेसबुक के साथ लॉगिन" बटन की आवश्यकता थी और पूरे फेसबुक एसडीके का उपयोग कर रहा था। मैं के साथ यह बदल दिया है facebook-coreऔर facebook-loginऔर त्रुटि हो गई है।
cleybertandre

0

मेरे लिए ग्रेडिंग अपग्रेड करना। Android वेबसाइट पर अपडेट के लिए देखें। फिर इसे अपने बिल्ड.ग्रेडल (प्रोजेक्ट) में इस तरह जोड़ें

 dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0-alpha4'   
          ....
    }

फिर ग्रेड फ़ाइल के साथ सिंक प्रोजेक्ट प्लस यह java.exe की वजह से कभी-कभी हो सकता है (मेरे मामले में) विंडोज़ में टास्क मैनेजर से सिर्फ java.exe को मारने के लिए मजबूर करें, फिर प्रोग्राम चलाएं


0

यह भी आज़मा सकते हैं:

android{
    .
    .
    // to avoid DexIndexOverflowException
    dexOptions {
       jumboMode true
    }
}

आशा है कि यह किसी की मदद करता है। धन्यवाद


0

**

एकता गेम डेवलपर्स के लिए

**

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

defaultConfig {
    minSdkVersion **MINSDKVERSION**
    targetSdkVersion **TARGETSDKVERSION**
    applicationId '**APPLICATIONID**'
    ndk {
        abiFilters **ABIFILTERS**
    }
    versionCode **VERSIONCODE**
    versionName '**VERSIONNAME**'
    multiDexEnabled true
}

-1

आप मल्टीडेक्स समर्थन प्राप्त करने के लिए एंड्रॉइड स्टूडियो पर "इंस्टेंट रन" सक्षम कर सकते हैं।


-2

यह करो, यह काम करता है:

defaultConfig {
    applicationId "com.example.maps"
    minSdkVersion 15
    targetSdkVersion 24
    versionCode 1
    versionName "1.0"
    multiDexEnabled true
}

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