Erreur: impossible de placer les classes demandées dans un seul fichier dex. Essayez de fournir une liste main-dex. # méthodes: 72477> 65536

310

Je veux ajouter des services de localisation fusionnés mais cela me montre une erreur. Aidez moi.

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'
Muhammad Adil Sattar
la source

Réponses:

386

Aucune des réponses qu'ils vous ont données n'était exhaustive. Le problème réside dans le Multidex. Vous devez ajouter la bibliothèque dans le gradle de l'application:

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

Après, ajoutez le defaultConfig du gradle d'application:

multiDexEnabled true

Votre application doit être de type Multidex. Vous devez l'écrire dans le manifeste:

android:name=".MyApplication"

"MyApplication" doit être soit la classe Multidex, soit il doit l'étendre.

AlexPad
la source
5
Alors MyApplication extends android.support.multidex.MultiDexApplication?
ban-geoengineering
2
J'ai essayé cette solution, mais je me retrouve avec ce nouveau problème: stackoverflow.com/questions/49518115/…
ban-geoengineering
22
Voici la page officielle de documentation Android fournissant plus d'explications sur les raisons pour lesquelles cela se produit et comment faire une meilleure version de version apk: developer.android.com/studio/build/multidex
Vrakfall
2
ce n'est pas une bonne méthode pour résoudre le problème, mieux vaut supprimer le code et les bibliothèques inutilisés, refactoriser le code de votre projet
user25
5
ne pas avoir 80000 méthodes serait une bonne solution si les bibliothèques googles n'avaient pas 80000 méthodes (toute la raison pour laquelle elles ont ajouté multidex était parce que leur propre bibliothèque de services qu'elles voulaient que tout le monde utilise avait des dizaines de milliers de méthodes).
Lassi Kinnunen
195

J'ai résolu mon problème avec la solution ci-dessous:

Dans le fichier de génération Gradle, ajoutez la dépendance:

implémentation 'com.android.support:multidex:1.0.3'

Et puis dans la section "defaultConfig", ajoutez:

multiDexEnabled true

Bofeng
la source
8
A travaillé pour moi. Instructions détaillées sur la configuration ici: developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel
L'activation de la prise en charge multidex n'est pas nécessaire dans la plupart des applications. Vous devriez envisager de supprimer les bibliothèques inutilisées, veuillez consulter ma réponse ci-dessous.
MG Developer
106

modifier votre application ou module build.gradle

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

Selon la documentation officielle

Prise en charge de Multidex pour Android 5.0 et supérieur

Android 5.0 (API niveau 21) et supérieur utilise un environnement d'exécution appelé ART qui prend en charge nativement le chargement de plusieurs fichiers DEX à partir de fichiers APK. ART effectue une pré-compilation au moment de l'installation de l'application qui analyse les fichiers classesN.dex et les compile en un seul fichier .oat pour exécution par l'appareil Android. Par conséquent, si votre minSdkVersion est 21 ou supérieur, vous n'avez pas besoin de la bibliothèque de support multidex.

Pour plus d'informations sur le runtime Android 5.0, lisez ART et Dalvik.

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

wdanxna
la source
59

Que sont les fichiers dex: les fichiers d' application Android (APK) contiennent des fichiers de bytecode exécutables sous forme de fichiers exécutables Dalvik (DEX), qui contiennent le code compilé utilisé pour exécuter votre application.

Raison de cette exception: la spécification DEX limite le nombre total de méthodes pouvant être référencées dans un seul fichier DEX à 65 536 (limite de référence de 64 Ko), y compris les méthodes de framework Android, les méthodes de bibliothèque et les méthodes de votre propre code.

Étape 01. Ajoutez la dépendance suivante comme suit

Pour les utilisateurs non Androidx,

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

Pour les utilisateurs d'Androidx,

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

Étape 02:

Après avoir ajouté ces projets de synchronisation et avant d'exécuter le projet, assurez-vous de créer un projet avant l'exécution. sinon, vous obtiendrez une exception.

gsm
la source
53

Vous pouvez suivre ceci .

Les versions de la plateforme antérieures à Android 5.0 (API niveau 21) utilisent le runtime Dalvik pour exécuter le code de l'application. Par défaut, Dalvik limite les applications à un seul fichier de bytecode classes.dex par APK. Afin de contourner cette limitation, vous pouvez ajouter la bibliothèque de support multidex à votre projet:

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

Si votre minSdkVersion est défini sur 21 ou supérieur, tout ce que vous devez faire est de définir multiDexEnabled sur true dans votre fichier build.gradle au niveau du module, comme indiqué ici:

android {
    defaultConfig {
        ...
        minSdkVersion 21 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}
rize
la source
34

lorsque vous utilisez des dépendances, vos méthodes ont donc augmenté! Google a une solution pour cela. qui a appelé Multidex!

REMARQUE: assurez-vous que le SDK minimum est supérieur à 14.

dans votre build.gradle:

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



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

POUR UTILISATION androidX:

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

Pour plus d'informations, veuillez consulter le lien d'origine:

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

sana ebadi
la source
Excellente solution! résolu mon problème
Vaibhav Herugu
29

Salut, le problème est ici, supprimez-le

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

Pourquoi?

Remarque: N'utilisez pas l'objectif de services de jeux combinés. Il apporte des dizaines de bibliothèques, gonflant votre application. À la place, spécifiez uniquement les API de services Google Play spécifiques que votre application utilise.

Et utilisez ce dont vous avez besoin. https://developers.google.com/android/guides/setup

Comme pour le service de localisation

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

Pour la messagerie cloud

com.google.android.gms:play-services-gcm:11.8.0
Pankaj Kant Patel
la source
yup maintenant, je suis confronté à un problème, mon bouton d'exécution a désactivé.
Muhammad Adil Sattar
27

Si vous construisez DEBUG APK , ajoutez simplement:

debug {
            multiDexEnabled true
        }

à l'intérieur buildTypes

et si vous construisez RELEASE APK , ajoutez un multiDexEnabled truebloc de version

release {
                ...
                multiDexEnabled true
                ...
        }
Raj Yadav
la source
25

Pour les projets Flutter, vous pouvez également résoudre ce problème

ouvrez votre \ android \ app \ build.gradle

vous devriez avoir les éléments suivants:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

Si votre minSdkVersion est défini sur 21 ou supérieur, tout ce que vous devez faire est de définir multiDexEnabled sur true dans le defaultConfig. Comme ça

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

    }

}

si votre minSdkVersion est défini sur 20 ou moins, ajoutez multiDexEnabled true à defaultConfig

Et définir l'implémentation

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

À la fin, vous devriez avoir:

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

}

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

Pour plus d'informations, lisez ceci: https://developer.android.com/studio/build/multidex

Richardd
la source
1
hhahaha! Je suis heureux que cela vous ait aidé!
Richardd
18

Procédez simplement comme suit:

build.gradle

(module:app)


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

Et ajoutez la dépendance ci-dessous dans votre build.gradlefichier de niveau d'application

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
} 
Saif Khan
la source
13
multiDexEnabled true

Veuillez essayer d'ajouter ceci dans votre application defaultConfig {}. Cela m'aide à résoudre le problème

user2173696
la source
12

Dans le fichier de génération Gradle, ajoutez la dépendance:

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

ou

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

ou

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

Et puis dans la section "defaultConfig", ajoutez:

multiDexEnabled true

Sous targetSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

Maintenant, si vous rencontrez cette erreur

Erreur: échec de la résolution: fichier ouvert multi-instrumentation

Vous devez changer votre gradle en 3.0.1

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

Et mettez le code suivant dans le fichier gradle-wrapper.properties

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

finalement

ajouter la classe Applition dans le projet et l'introduire dans le AndroidManifest qui s'étend de MultiDexApplication

public class App extends MultiDexApplication {

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

}

Exécutez d'abord le projet pour créer une erreur, puis nettoyez le projet

Enfin, relancez le projet et profitez-en

younes
la source
J'ai encore "Échec de la résolution: instrumentation
multidex
11

Si vous utilisez minifyEnabled avec Proguard, vous n'aurez probablement pas besoin d'activer le multi-dex. Je suis d'accord avec MG Developer que vous devriez essayer d'éviter le multi-dex si possible. Ma solution était d'activer le multi-dex uniquement pour les versions de débogage. minifyEnabled résout le problème des versions de version

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
    }
}
Ernie Thomason
la source
quels sont les inconvénients de l'utilisation du multidex si nous le devons?
isJulian00
1
Très bonne question, à laquelle je n'ai pas vraiment de réponse. Lisez ce qui suit si vous ne l'avez pas fait: sur developer.android.com/studio/build/multidex#mdex-gradle Il semble que pour l'API> = 21, il n'y ait pas beaucoup de problème. Pour <21, il semble qu'Android doive faire un jeu de jambes sophistiqué qui pourrait potentiellement avoir des problèmes. Étant donné que de nombreuses personnes ont besoin d'activer cela, je suppose qu'Android le fait fonctionner correctement, donc je ne m'inquiéterais pas trop. J'aime juste être conservateur dans la mesure du possible.
Ernie Thomason
10

Je ne sais pas pourquoi, c'est peut-être parce que je développe dans Kotlin mais pour corriger cette erreur, je dois enfin créer une classe qui s'étend MultiDexApplicationcomme ceci:

class MyApplication : MultiDexApplication() {
}

et dans mon Manifest.xmlje dois mettre

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

pour ne confondre personne, je fais aussi:

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

pour androidx, cela fonctionne aussi pour moi:

implementation 'androidx.multidex:multidex:2.0.0'

...

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

ne fonctionne pas pour moi

Boe-Dev
la source
n'oubliez pas de nettoyer le projet et de le reconstruire après avoir défini multiDexEnabled sur true. Cela m'a arrangé.
pseudozach
la modification de l'attribut de nom d'application dans le manifeste n'a pas fonctionné pour moi non plus, mais l'activation de multiDex dans le fichier de construction gradle et l'ajout de l'implémentation ont fonctionné. Il semble qu'il soit facultatif de changer la balise de nom du manifeste maintenant?
Cody
9

Vous avez trop de méthodes. Le fichier Android dex a une limite de 65536 méthodes que vous êtes autorisé à avoir.

Pour commencer, si vous n'avez pas besoin de toutes les API des services Google Play et seulement de l'emplacement, remplacez

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

avec

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

Vous pouvez vous référer à cette page pour savoir comment l'éviter ou si nécessaire pour en autoriser davantage: https://developer.android.com/studio/build/multidex.html

Raz
la source
yup mais ce n'est pas ce vrai problème. Je pense que j'ajoute les mêmes dépendances. Un pour Firebase et un autre pour l'emplacement Vérifiez ci-dessous deux lignes.
Muhammad Adil Sattar
6

Tout ce que j'avais à faire était de définir la version minimale du SDK sur 21 dans Fichier> Structure du projet> Application> Saveurs

Will Buffington
la source
6

ajoutez votre fichier 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'
    }
UN Allemand
la source
5

J'ai rencontré cette erreur deux fois et la solution est; Vérifiez votre fichier de notes d'application pour voir votre SDk cible, s'il est supérieur ou égal à 20, ajoutez simplement une ligne à votredefaultconfig { multiDexEnabled true }

Sinon, si votre targetSDK est inférieur à 20, ajoutez la ligne à votre defaultConfig et ajoutez également une dépendance

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

Consultez ce lien pour en savoir plus.

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

Mpwanyi Samuel
la source
5

L'utilisation du support multidex devrait être le dernier recours. Par défaut, Gradle Build collectera une tonne de dépendances transitives pour votre APK. Tel que recommandé dans Google Developers Docs , essayez d'abord de supprimer les dépendances inutiles de votre projet.

À l'aide de la ligne de commande, accédez à la racine des projets Android. Vous pouvez obtenir l'arbre de dépendance de compilation comme suit.

gradlew app:dependencies --configuration debugCompileClasspath

Vous pouvez obtenir la liste complète de l'arborescence des dépendances

gradlew app:dependencies

entrez la description de l'image ici

Supprimez ensuite les dépendances inutiles ou transitives de votre application build.gradle. Par exemple, si votre application utilise une dépendance appelée «com.google.api-client», vous pouvez exclure les bibliothèques / modules dont vous n'avez pas besoin.

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

Ensuite, dans Android Studio Sélectionnez Build> Analyze APK ... Sélectionnez le fichier APK de libération / débogage pour voir le contenu. Cela vous donnera les méthodes et les références qui comptent comme suit.

Analyser APK

Développeur MG
la source
1
quels sont les inconvénients de l'utilisation du multidex si nous devons le faire
isJulian00
2

Dans la version: 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'
Sebastián Giraldo
la source
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
    }
Mohamed Slimane
la source
cela me suffisait aussi.
nyxee
1

L'erreur est due au nombre de dépendances de classe que vous avez dans votre fichier Gradle d'application. Si les classes dépassent 72 400, vous souhaiterez peut-être utiliser multidex comme solution pour mieux gérer l'indexation des fichiers. Pour en savoir plus à partir d'ici: https://developer.android.com/studio/build/multidex

Mpwanyi Samuel
la source