Errore: impossibile inserire le classi richieste in un singolo file dex. Provare a fornire un elenco di dex principale. # metodi: 72477> 65536


310

Voglio aggiungere servizi di localizzazione fusi ma mi mostra qualche errore. Aiutami.

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'

Risposte:


386

Nessuna delle risposte che ti hanno dato è stata esaustiva. Il problema risiede nel Multidex. Devi aggiungere la libreria nel livello dell'app:

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

Successivamente, aggiungi in defaultConfig del grado app:

multiDexEnabled true

La tua applicazione deve essere del tipo Multidex. Devi scriverla nel manifest:

android:name=".MyApplication"

"MyApplication" deve essere la classe Multidex o deve estenderla.


5
Quindi MyApplication extends android.support.multidex.MultiDexApplication?
divieto di geoingegneria il

2
Ho provato questa soluzione, ma finisco con questo nuovo problema: stackoverflow.com/questions/49518115/…
ban-geoengineering

22
Ecco la pagina ufficiale del documento Android che fornisce ulteriori spiegazioni sul perché ciò accada e su come creare un apk versione di rilascio migliore: developer.android.com/studio/build/multidex
Vrakfall

2
non è un buon metodo per risolvere il problema, meglio rimuovere il codice e le librerie inutilizzate, refactoring il codice del progetto
user25

5
non avere 80000 metodi sarebbe un'ottima soluzione se le librerie di Google non avessero 80000 metodi (il motivo per cui hanno aggiunto multidex era perché la loro libreria di servizi che volevano che tutti usassero avesse decine di migliaia di metodi).
Lassi Kinnunen,

195

Ho risolto il mio problema con la soluzione seguente:

Nel file di build Gradle, aggiungi dipendenza:

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

E poi nella sezione "defaultConfig", aggiungi:

multiDexEnabled true


8
Ha funzionato per me. Istruzioni dettagliate sulla configurazione qui: developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel

L'abilitazione del supporto multidex non è necessaria nella maggior parte delle applicazioni. Dovresti prendere in considerazione la rimozione delle librerie inutilizzate, consulta la mia risposta di seguito.
MG Developer

106

modifica l'app o il modulo build.gradle

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

Secondo la documentazione ufficiale

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. ART esegue la pre-compilazione al momento dell'installazione dell'app che esegue la scansione dei file classN.dex e li compila in un singolo file .oat per l'esecuzione dal dispositivo Android. Pertanto, se minSdkVersion è 21 o superiore, non è necessaria la libreria di supporto multidex.

Per ulteriori informazioni sul runtime di Android 5.0, leggi ART e Dalvik.

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


59

Cosa sono i file dex: i file delle app Android (APK) contengono file bytecode eseguibili sotto forma di file DEX (Dalvik Executable), che contengono il codice compilato utilizzato per eseguire l'app.

Motivo dell'eccezione: la specifica DEX limita il numero totale di metodi a cui è possibile fare riferimento all'interno di un singolo file DEX a 65.536 (limite di riferimento 64K), inclusi i metodi del framework Android, i metodi della libreria e i metodi nel proprio codice.

Passaggio 01. Aggiungere la seguente dipendenza come segue

Per utenti non Androidx,

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

Per gli utenti Androidx,

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

Step 02:

Dopo aver aggiunto i progetti di sincronizzazione e prima di eseguire il progetto, assicurati di creare un progetto prima dell'esecuzione. altrimenti, otterrai un'eccezione.


53

Puoi seguire questo .

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

Se minSdkVersion è impostato su 21 o versione successiva, tutto ciò che devi fare è impostare multiDexEnabled su true nel file build.gradle a livello di modulo, come mostrato qui:

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

34

quando si utilizzano le dipendenze, quindi i metodi sono aumentati! google ha una soluzione per questo. quello chiamato Multidex!

NOTA: assicurarsi che l'SDK minimo sia superiore a 14.

nel tuo build.gradle:

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



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

PER USO androidX:

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

Per ulteriori informazioni, visitare il link originale:

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


Ottima soluzione! risolto il mio problema
Vaibhav Herugu,

29

Ciao problema è qui rimuoverlo

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

perché?

Nota: non utilizzare l'obiettivo dei servizi di gioco combinati. Porta decine di librerie, gonfiando la tua applicazione. Invece, specifica solo le API dei servizi Google Play specifici utilizzate dalla tua app.

E usa quello che ti serve. https://developers.google.com/android/guides/setup

Come per il servizio di localizzazione

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

Per il cloud messaging

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

ora ora sto affrontando il problema il mio pulsante di esecuzione è disabilitato.
Muhammad Adil Sattar,

27

Se stai creando APK DEBUG , aggiungi:

debug {
            multiDexEnabled true
        }

dentro buildTypes

e se stai creando APK RELEASE , aggiungi il multiDexEnabled trueblocco di rilascio come-

release {
                ...
                multiDexEnabled true
                ...
        }

25

Per i progetti Flutter puoi anche risolvere questo problema

apri il tuo \ android \ app \ build.gradle

dovresti avere quanto segue:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

Se minSdkVersion è impostato su 21 o versione successiva, è sufficiente impostare multiDexEnabled su true in defaultConfig. Come questo

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

    }

}

se minSdkVersion è impostato su 20 o inferiore, aggiungere multiDexEnabled true a defaultConfig

E definire l'implementazione

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

Alla fine dovresti avere:

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

}

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

Per maggiori informazioni leggi questo: https://developer.android.com/studio/build/multidex


1
hhahaha! Sono felice che ti abbia aiutato!
Richardd,

18

Basta fare quanto segue:

build.gradle

(module:app)


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

E aggiungi la dipendenza seguente nel build.gradlefile a livello di app

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

13
multiDexEnabled true

Prova ad aggiungere questo nella tua app defaultConfig {}. Questo mi aiuta a risolvere il problema


12

Nel file di build Gradle, aggiungi dipendenza:

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

o

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

o

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

E poi nella sezione "defaultConfig", aggiungi:

multiDexEnabled true

Sotto targetSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

Ora se riscontri questo errore

Errore: impossibile risolvere: Multidex-instrumentation Open File

Devi cambiare il tuo grado in 3.0.1

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

E inserisci il seguente codice nel file gradle-wrapper.properties

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

Finalmente

aggiungi l'appliance di classe al progetto e presentala al AndroidManifest che si estende da MultiDexApplication

public class App extends MultiDexApplication {

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

}

Eseguire prima il progetto per creare un errore, quindi pulire il progetto

Infine, rilancia il progetto e divertiti


Ho ancora "Impossibile risolvere: strumentazione
multidex

11

Se stai usando minifyEnabled con Proguard, probabilmente non dovrai abilitare multi-dex. Sono d'accordo con MG Developer che dovresti cercare di evitare multi-dex, se possibile. La mia soluzione era abilitare il multi-dex solo per build di debug. minifyEnabled risolve il problema per i build di rilascio

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

quali sono alcuni degli svantaggi dell'utilizzo di multidex se dobbiamo?
isJulian00

1
Ottima domanda, a cui non ho davvero una risposta. Leggi quanto segue se non l'hai fatto: su developer.android.com/studio/build/multidex#mdex-gradle Sembra che per API> = 21, non ci siano molti problemi. Per <21, sembra che Android debba fare qualche lavoro di fantasia che potrebbe potenzialmente avere problemi. Dato che molte persone hanno bisogno di accenderlo, suppongo che Android abbia funzionato bene, quindi non mi preoccuperei troppo. Mi piace essere conservatore, ove possibile.
Ernie Thomason,

10

Non ho idea del perché, forse è perché sviluppo in Kotlin ma per correggere questo errore devo finalmente creare una classe che si estende in MultiDexApplicationquesto modo:

class MyApplication : MultiDexApplication() {
}

e nel mio Manifest.xmldevo impostare

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

per non confondere nessuno, faccio anche:

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

per androidx, questo funziona anche per me:

implementation 'androidx.multidex:multidex:2.0.0'

...

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

Non funziona per me


ricordati di ripulire e ricostruire il progetto dopo aver impostato multiDexEnabled su true. Questo mi ha risolto.
pseudozach,

la modifica dell'attributo del nome dell'applicazione nel manifest non ha funzionato neanche per me, ma l'abilitazione di multiDex nel file di build gradle e l'aggiunta dell'implementazione hanno funzionato. Sembra che sia facoltativo cambiare ora il tag manifest?
Cody,

9

Hai troppi metodi contano. Il file dex Android ha un limite di 65536 metodi che puoi avere.

Per cominciare, se non hai bisogno di tutte le API dei servizi di Google Play e solo della posizione, sostituiscile

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

con

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

È possibile fare riferimento a questa pagina per modi per evitarlo o, se necessario, per consentire di più: https://developer.android.com/studio/build/multidex.html


sì, ma non è quel vero problema. Penso di aggiungere le stesse dipendenze. Uno per Firebase e un altro per la posizione Controlla sotto due linee.
Muhammad Adil Sattar,

6

Tutto quello che dovevo fare era impostare la versione minima dell'SDK su 21 in File> Struttura del progetto> App> Flavours


6

aggiungi il tuo file 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

Ho riscontrato questo errore due volte e la soluzione per questo è; Controlla il file di valutazione dell'app per vedere l'SDk di destinazione, se è 20 o superiore, aggiungi solo una riga alla tuadefaultconfig { multiDexEnabled true }

Altrimenti, se targetSDK è inferiore a 20, aggiungi la linea alla configurazione predefinita e aggiungi anche una dipendenza

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

Controlla questo link per ulteriori informazioni.

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


5

L'uso del supporto multidex dovrebbe essere l'ultima risorsa. Per impostazione predefinita, la build gradle raccoglierà un sacco di dipendenze transitive per il tuo APK. Come raccomandato in Google Developers Docs , prova innanzitutto a rimuovere dipendenze non necessarie dal tuo progetto.

Utilizzando la riga di comando, accedi a Root di progetti Android. È possibile ottenere l'albero delle dipendenze di compilazione come segue.

gradlew app:dependencies --configuration debugCompileClasspath

È possibile ottenere un elenco completo dell'albero delle dipendenze

gradlew app:dependencies

inserisci qui la descrizione dell'immagine

Quindi rimuovere le dipendenze non necessarie o transitive dall'app build.gradle. Ad esempio, se la tua app utilizza una dipendenza chiamata "com.google.api-client", puoi escludere le librerie / i moduli che non ti servono.

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

Quindi in Android Studio seleziona Genera> Analizza APK ... Seleziona il file APK di rilascio / debug per vedere i contenuti. Questo ti darà i metodi e i riferimenti contano come segue.

Analizza APK


1
quali sono alcuni degli svantaggi dell'utilizzo del multidex se dobbiamo
isJulian00

2

In build: app

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
    }

questo è bastato anche a me.
nyxee,

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.