Il numero di riferimenti a metodi in un file .dex non può superare 64k API 17


154

Sto creando un'app con SugarORM Library ma quando provo a creare il progetto per API 17 (non ho verificato la presenza di altri), viene visualizzato l'errore di compilazione.

    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

Ma quando creo questo progetto per Android v5.0 o versioni successive, funziona benissimo. Se rimuovo la dipendenza del grado SugarORM, funziona bene per entrambi i dispositivi v4.2.2 e v5.0.



prova a usare proguard questo link android-arsenal.com/details/1/337 specifica usando SugarORM con proguard
Shaan_B

19
Ho appena ottenuto questo dopo l'aggiornamento a API 23. È semplicemente impossibile essere produttivi con Android. Ogni SDK rompe le cose. Ogni aggiornamento di AS rompe le cose. Messaggi di errore inutilizzabili. AS rotto. Immondizia, immondizia, immondizia.
RunLoop,

1
@RunLoop non perdere la speranza .... Ho scoperto che Android è la migliore piattaforma mai sviluppata .... Moch Flessibile e potente .... Dato che ti sporcherai le mani nel codice .... Andrà bene .... Ogni messaggio di errore è utile. Ma ho bisogno di capire i messaggi
Sandeep Singh Rana,

2
@Balaj Khan One or more of the answers is exemplary and worthy of an additional bounty.Just to the point and accurate answer.Suggerisco la risposta migliore (e accettata)!
Jon Goodwin,

Risposte:


331

Hai troppi metodi. Ci possono essere solo 65536 metodi per dex .

Come suggerito, puoi utilizzare il supporto multidex .

Aggiungi queste righe nel 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
}

Inoltre, Manifestaggiungi la MultiDexApplicationclasse dalla libreria di supporto multidex all'elemento application

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

Se si utilizza la propria Applicationclasse, cambiare la classe genitore da Applicationa MultiDexApplication.
Se non riesci a farlo, nella tua classe Application sovrascrivi il attachBaseContextmetodo con:

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

Un'altra soluzione è provare a rimuovere il codice inutilizzato con ProGuard : configura le impostazioni ProGuard affinché l'app esegua ProGuard e assicurati di aver attivato la riduzione per le build di rilascio.


1
@Override protetto void attachBaseContext (Context newBase) {super.attachBaseContext (newBase); MultiDex.install (questo); } ha anche la precedenza
Sandeep Singh Rana,

1
Cmd-clic su MultiDexApplication, vedo che il file .class decompilato esegue già esattamente l'override attachBaseContext () che descrivi. Quindi non sarà necessario sovrascriverlo di nuovo, immagino ..
Mete

4
E se non avessi troppi metodi. Non ho molti metodi sulla mia app. Credo che non lo raggiunga nemmeno.
Neon Warge,

6
Ho fatto solo queste due parti: "multiDexEnabled true" e compilato "com.android.support:multidex:1.0.0", nel mio file build.grandle. Non ho dovuto modificare nulla nel mio file manifest né fare le altre cose che hai menzionato sulla sostituzione di attachBaseContext, ecc. Ma la tua soluzione ha risolto il problema per me! Grazie.
Jaime Montoya,

2
@NeonWarge Probabilmente a causa delle tue dipendenze. Forse hai incluso l'intero Google Play Services? Controlla questa risposta per i dettagli
mr5

132

In 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
    }

Inserisci questo nel tuo defaultConfig:

multiDexEnabled true 

per me funziona


3
Questo è per Lollipop o superiore, non è vero?
Vic Torious,

1
La compilazione ha esito positivo, ma l'app si arresta in modo anomalo dopo l'avvio.
Vasanth

18

Ho ricevuto questo messaggio di errore perché durante la codifica del mio progetto di aggiornamento automatico compilare la versione nel mio build.gradlefile:

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' }

Risolvilo correggendo la versione:

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
Sto creando un'app semplice, che ha funzionato bene fino a quando non ho provato a seguire il tutorial di Google Map Objects. All'improvviso non sono stato più in grado di compilare. Questa soluzione ha risolto questo problema per me. Come mai l'hai risolto?
maccaroo,

4
Questo metodo fortunatamente ha funzionato perché le nuove librerie di compilazione hanno troppi metodi (supera 65536), mentre le vecchie librerie no. Quindi è solo una soluzione rapida, prima o poi dovresti risolvere aggiungendo il supporto multidex come la risposta accettata.
Quan Nguyen,

15

Questo è ciò che ha funzionato per me:

Questo accade perché ci sono troppi metodi inutilizzati. La maggior parte di questi metodi proviene da librerie incluse in build.gradle

Usa minimizza e riduci le risorse per risolvere questo problema con Gradle e ripulisci il tuo codice allo stesso tempo.

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

13

Cambia il livello dell'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
    }

ha funzionato per me.


sì, è un vecchio problema, ma per le ultime versioni dell'API abbiamo bisogno solo multiDexEnableddell'opzione, senza dipendenze o modifiche al file manifest
Hpsaturn

11

Questo errore può verificarsi anche quando carichi tutte le API di Google Play Services quando usi solo afew.

Come affermato da google: "Nelle versioni dei servizi di Google Play precedenti alla 6.5, dovevi compilare l'intero pacchetto di API nella tua app. In alcuni casi, ciò rendeva più difficile mantenere il numero di metodi nella tua app (incluso API framework, metodi di libreria e codice personale) al di sotto del limite 65.536.

Dalla versione 6.5, puoi invece compilare selettivamente le API del servizio Google Play nella tua app. "

Ad esempio, quando la tua app richiede play-services-maps, play-services-location. Devi aggiungere solo le due API nel tuo file build.gradle a livello di app come mostrato di seguito:

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

Invece di:

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

Per la documentazione completa e l'elenco delle API dei servizi di Google Play, fai clic qui


9

Quando i riferimenti dell'app superano 65.536 metodi, si verifica un errore di build che indica che l'app ha raggiunto il limite dell'architettura di build Android

Supporto Multidex prima di Android 5.0

Le versioni della piattaforma precedenti ad Android 5.0 (livello API 21) utilizzano il runtime Dalvik per eseguire il codice dell'app. Per impostazione predefinita, Dalvik limita le app a un singolo file bytecode classes.dex per APK. Per aggirare questa limitazione, è possibile aggiungere la libreria di supporto multidex al progetto:

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

Supporto Multidex per Android 5.0 e versioni successive

Android 5.0 (livello API 21) e versioni successive utilizza un runtime chiamato ART che supporta nativamente il caricamento di più file DEX da file APK. Pertanto, se minSdkVersion è 21 o superiore, non è necessaria la libreria di supporto multidex .

Evita il limite di 64 KB

  • Rimuovi il codice inutilizzato con ProGuard - Abilita la riduzione del codice

Configura multidex in app per

Se minSdkVersion è impostato su 21 o versioni successive, è sufficiente impostare multiDexEnabled su true nel file build.gradle a livello di modulo

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

se minSdkVersion è impostato su 20 o meno, è necessario utilizzare la libreria di supporto multidex

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

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

Sostituisci la classe Application, modificala per estendere MultiDexApplication (se possibile) come segue:

public class MyApplication extends MultiDexApplication { ... }

aggiungi al file manifest

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

Ho riscontrato lo stesso problema e per il supporto multidex devi tenere presente la versione minSdk della tua applicazione. Se stai usando minSdkVersion 21 o versioni successive, scrivi multiDexEnabled true in questo modo

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

Funziona per me e se stai usando minSdkVersion sotto 21 (sotto lolipop ) allora devi fare due cose extra semplici

1. Per prima cosa aggiungi questa dipendenza

compilare "com.android.support:multidex:1.0.1"

nel tuo build.gradle.

2. L' ultimo e il secondo ne aggiungono uno nella riga sottostante all'applicazione in manifest

android: name = "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>

Bingo quindi funzionerà anche nella versione inferiore .. :) Buona codifica


1

Solo un commento secondario, prima di aggiungere il supporto per multidex: assicurati di non aggiungere dipendenze non necessarie.

Ad esempio nella guida ufficiale all'analisi di Facebook

Dichiarano chiaramente che è necessario aggiungere la seguente dipendenza:

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

che è in realtà l' intero FacebookSDK, quindi se hai bisogno ad esempio solo di Analytics devi sostituirlo con:

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

Opzioni SDK parziali di Facebook


Completamente d'accordo. Nel mio caso, ad esempio, avevo solo bisogno del pulsante "accedi con Facebook" e utilizzavo l'intero sdk di Facebook. L'ho sostituito con facebook-coree facebook-logine l'errore è andato.
cleybertandre,

0

Per me l'aggiornamento Gradle funziona. Cerca l'aggiornamento sul sito Web Android, quindi aggiungilo nel tuo build.gradle (progetto) in questo modo

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

quindi sincronizzare il progetto con il file gradle, inoltre a volte potrebbe accadere a causa di java.exe (nel mio caso) forzare l'uccisione di java.exe dal task manager in Windows, quindi eseguire nuovamente il programma


0

Puoi anche provare questo:

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

Spero che aiuti qualcuno. Grazie


0

**

Per gli sviluppatori di giochi Unity

**

Se qualcuno viene qui perché questo errore è apparso nel suo progetto Unity, vai su File-> Impostazioni di costruzione -> Impostazioni giocatore -> Giocatore. vai su Impostazioni pubblicazione e nella scheda Genera, abilita "Modello gradle Launcher personalizzato". un percorso verrà mostrato sotto quel testo. vai al percorso e aggiungi multiDexEnabled true in questo modo:

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

-1

puoi abilitare "Instant Run" su Android Studio per ottenere il supporto multidex.


-2

Fallo, funziona:

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

2
Per favore, spiega la tua risposta. Le risposte di solo codice sono sconsigliate su SO. Grazie.
Gennadii Saprykin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.