Fehler: Angeforderte Klassen können nicht in eine einzelne Dex-Datei eingefügt werden. Versuchen Sie, eine Haupt-Dex-Liste bereitzustellen. # Methoden: 72477> 65536

309

Ich möchte fusionierte Ortungsdienste hinzufügen, aber es zeigt mir einen Fehler. Hilf mir.

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
quelle

Antworten:

385

Keine der Antworten, die sie Ihnen gaben, war erschöpfend. Das Problem liegt im Multidex. Sie müssen die Bibliothek im App-Gradle hinzufügen:

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

Fügen Sie anschließend die defaultConfig des App-Gradles hinzu:

multiDexEnabled true

Ihre Anwendung muss vom Typ Multidex sein. Sie müssen sie in das Manifest schreiben:

android:name=".MyApplication"

"MyApplication" muss entweder die Multidex-Klasse sein oder sie muss erweitert werden.

AlexPad
quelle
5
Also MyApplication extends android.support.multidex.MultiDexApplication?
Ban-Geoengineering
2
Ich habe diese Lösung ausprobiert, aber am Ende habe ich dieses neue Problem: stackoverflow.com/questions/49518115/…
Ban-Geoengineering
22
Hier ist die offizielle Android-Dokumentseite mit weiteren Erklärungen, warum dies passiert und wie man eine bessere Release-Version apk macht: developer.android.com/studio/build/multidex
Vrakfall
2
Es ist keine gute Methode, um das Problem zu lösen, besser nicht verwendeten Code und Bibliotheken zu entfernen, Ihren Projektcode
umzugestalten
5
80000-Methoden nicht zu haben, wäre eine gute Lösung, wenn Google-Bibliotheken keine 80000-Methoden hätten (der ganze Grund, warum sie Multidex hinzufügten, war, dass ihre eigene Service-Bibliothek, die jeder verwenden sollte, Zehntausende von Methoden hatte).
Lassi Kinnunen
195

Ich habe mein Problem mit der folgenden Lösung behoben:

Fügen Sie in der Gradle-Builddatei die Abhängigkeit hinzu:

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

Fügen Sie dann im Abschnitt "defaultConfig" Folgendes hinzu:

multiDexEnabled true

Bofeng
quelle
8
Hat für mich gearbeitet. Detaillierte Anweisungen zur Konfiguration hier: developer.android.com/studio/build/multidex#mdex-gradle
Alex Burdusel
Das Aktivieren der Multidex-Unterstützung ist in den meisten Anwendungen nicht erforderlich. Sie sollten in Betracht ziehen, die nicht verwendeten Bibliotheken zu entfernen. Siehe meine Antwort unten.
MG Developer
106

Ändern Sie die Ihrer App oder Ihres Moduls build.gradle

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

Laut offizieller Dokumentation

Multidex-Unterstützung für Android 5.0 und höher

Android 5.0 (API Level 21) und höher verwendet eine Laufzeit namens ART, die das Laden mehrerer DEX-Dateien aus APK-Dateien nativ unterstützt. ART führt zur App-Installationszeit eine Vorkompilierung durch, die nach classesN.dex-Dateien sucht und diese zur Ausführung durch das Android-Gerät in eine einzige .oat-Datei kompiliert. Wenn Ihre minSdkVersion 21 oder höher ist, benötigen Sie daher keine Multidex-Unterstützungsbibliothek.

Weitere Informationen zur Laufzeit von Android 5.0 finden Sie unter ART und Dalvik.

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

wdanxna
quelle
59

Was sind Dex-Dateien: APK- Dateien ( Android App) enthalten ausführbare Bytecode-Dateien in Form von DEX-Dateien (Dalvik Executable), die den kompilierten Code enthalten, der zum Ausführen Ihrer App verwendet wird.

Grund für diese Ausnahme: Die DEX-Spezifikation begrenzt die Gesamtzahl der Methoden, auf die in einer einzelnen DEX-Datei verwiesen werden kann, auf 65.536 (64-KB-Referenzlimit) - einschließlich Android-Framework-Methoden, Bibliotheksmethoden und Methoden in Ihrem eigenen Code.

Schritt 01. Fügen Sie die folgende Abhängigkeit wie folgt hinzu

Für Nicht-Androidx-Benutzer

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

Für Androidx-Benutzer

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

Schritt 02:

Stellen Sie nach dem Hinzufügen dieser Synchronisierungsprojekte und vor dem Ausführen des Projekts sicher, dass Sie vor dem Ausführen ein Projekt erstellen. Andernfalls erhalten Sie eine Ausnahme.

gsm
quelle
53

Sie können folgen dieser .

Versionen der Plattform vor Android 5.0 (API-Level 21) verwenden die Dalvik-Laufzeit zum Ausführen von App-Code. Standardmäßig beschränkt Dalvik Apps auf eine einzelne Klassen.dex-Bytecode-Datei pro APK. Um diese Einschränkung zu umgehen, können Sie Ihrem Projekt die Multidex-Unterstützungsbibliothek hinzufügen:

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

Wenn Ihre minSdkVersion auf 21 oder höher festgelegt ist, müssen Sie multiDexEnabled in Ihrer build.gradle-Datei auf Modulebene nur auf true setzen, wie hier gezeigt:

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

Wenn Sie Abhängigkeiten verwenden, haben sich Ihre Methoden erhöht! Google hat eine Lösung dafür. das heißt Multidex!

HINWEIS: Stellen Sie sicher, dass das minimale SDK über 14 liegt.

in Ihrem build.gradle:

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



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

FÜR androidX GEBRAUCH:

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

Weitere Informationen finden Sie unter dem ursprünglichen Link:

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

Sana Ebadi
quelle
Tolle Lösung! mein Problem
behoben
29

Hallo Problem ist hier entfernen

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

Warum?

Hinweis: Verwenden Sie nicht das kombinierte Ziel für Spieldienste. Es bringt Dutzende von Bibliotheken und bläht Ihre Anwendung auf. Geben Sie stattdessen nur die spezifischen Google Play-Dienst-APIs an, die Ihre App verwendet.

Und nutzen Sie, was Sie brauchen. https://developers.google.com/android/guides/setup

Wie für den Ortungsservice

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

Für Cloud Messaging

com.google.android.gms:play-services-gcm:11.8.0
Pankaj Kant Patel
quelle
yup jetzt habe ich ein Problem mit meiner Run-Taste deaktiviert.
Muhammad Adil Sattar
27

Wenn Sie DEBUG APK erstellen , fügen Sie einfach hinzu:

debug {
            multiDexEnabled true
        }

Innerhalb buildTypes

und wenn Sie RELEASE APKmultiDexEnabled true erstellen , fügen Sie im Release-Block as-

release {
                ...
                multiDexEnabled true
                ...
        }
Raj Yadav
quelle
25

Bei Flatterprojekten können Sie dieses Problem auch lösen

Öffne dein \ android \ app \ build.gradle

Sie sollten Folgendes haben:

android {
    defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 28

    }

}

Wenn Ihre minSdkVersion auf 21 oder höher festgelegt ist, müssen Sie multiDexEnabled in der defaultConfig nur auf true setzen. So was

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

    }

}

Wenn Ihre minSdkVersion auf 20 oder niedriger eingestellt ist, fügen Sie multiDexEnabled true zur defaultConfig hinzu

Und definieren Sie die Implementierung

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

Am Ende sollten Sie haben:

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

}

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

Weitere Informationen finden Sie unter: https://developer.android.com/studio/build/multidex

Richardd
quelle
1
hhahaha! Ich bin froh, dass es dir geholfen hat!
Richardd
18

Gehen Sie einfach wie folgt vor:

build.gradle

(module:app)


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

Fügen Sie in Ihrer build.gradleDatei auf App-Ebene die folgenden Abhängigkeiten hinzu

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

Bitte versuchen Sie dies in Ihrer App defaultConfig {} hinzuzufügen. Dies hilft mir, das Problem zu lösen

user2173696
quelle
12

Fügen Sie in der Gradle-Builddatei die Abhängigkeit hinzu:

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

oder

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

oder

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

Fügen Sie dann im Abschnitt "defaultConfig" Folgendes hinzu:

multiDexEnabled true

Unter targetSdkVersion

   minSdkVersion 17
    targetSdkVersion 27
    multiDexEnabled true

Nun, wenn Sie auf diesen Fehler stoßen

Fehler: Fehler beim Auflösen: Multidex-Instrumentierung Datei öffnen

Sie müssen Ihren Gradle auf 3.0.1 ändern

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

Und fügen Sie den folgenden Code in die Datei gradle-wrapper.properties ein

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

Schließlich

Klasse Applition in Projekt hinzufügen und in das AndroidManifest einführen, das von MultiDexApplication erweitert wird

public class App extends MultiDexApplication {

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

}}

Führen Sie das Projekt zuerst aus, um einen Fehler zu erstellen, und bereinigen Sie dann das Projekt

Starten Sie das Projekt schließlich neu und genießen Sie es

younes
quelle
Ich habe immer noch "Fehler beim Auflösen: Multidex-Instrumentierung"
Makalele
11

Wenn Sie minifyEnabled mit Proguard verwenden, müssen Sie Multi-Dex wahrscheinlich nicht aktivieren. Ich stimme MG Developer zu, dass Sie versuchen sollten, Multi-Dex nach Möglichkeit zu vermeiden. Meine Lösung bestand darin, Multi-Dex nur für Debug-Builds zu aktivieren. minifyEnabled löst das Problem bei Release-Builds

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
quelle
Was sind einige der Nachteile der Verwendung von Multidex, wenn wir müssen?
isJulian00
1
Sehr gute Frage, auf die ich keine Antwort habe. Lesen Sie Folgendes, wenn Sie dies nicht getan haben: at developer.android.com/studio/build/multidex#mdex-gradle Für API> = 21 scheint es kein großes Problem zu geben. Für <21 scheint Android einige ausgefallene Schritte zu machen, die möglicherweise Probleme haben könnten. Da viele Leute dies einschalten müssen, gehe ich davon aus, dass Android gut funktioniert, sodass ich mir darüber keine Sorgen machen würde. Ich mag es einfach, wenn möglich konservativ zu sein.
Ernie Thomason
10

Ich habe keine Ahnung warum, vielleicht liegt es daran, dass ich in Kotlin entwickle, aber um diesen Fehler zu beheben, muss ich endlich eine Klasse erstellen, die sich MultiDexApplicationwie folgt erstreckt :

class MyApplication : MultiDexApplication() {
}

und in meinem muss Manifest.xmlich setzen

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

um niemanden zu verwirren, mache ich auch:

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

für androidx funktioniert das auch bei mir:

implementation 'androidx.multidex:multidex:2.0.0'

...

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

funktioniert bei mir nicht

Boe-Dev
quelle
Denken Sie daran, das Projekt zu bereinigen und neu zu erstellen, nachdem Sie multiDexEnabled auf true gesetzt haben. Das hat es für mich behoben.
Pseudozach
Das Ändern des Anwendungsnamenattributs im Manifest hat auch bei mir nicht funktioniert, aber das Aktivieren von multiDex in der Gradle-Build-Datei und das Hinzufügen der Implementierung hat funktioniert. Es scheint, dass es optional ist, das Manifest-Namensschild jetzt zu ändern?
Cody
9

Sie haben zu viele Methoden zählen. Die Android-Dex-Datei hat ein Limit von 65536 Methoden, die Sie haben dürfen.

Für den Anfang, wenn Sie nicht die gesamte Google Play Services-API und nur den Speicherort benötigen, ersetzen Sie diese

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

mit

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

Auf dieser Seite finden Sie Möglichkeiten, dies zu vermeiden oder bei Bedarf weitere Informationen zuzulassen: https://developer.android.com/studio/build/multidex.html

Raz
quelle
Ja, aber es ist nicht das wirkliche Problem. Ich denke, ich füge die gleichen Abhängigkeiten hinzu. Eine für Firebase und eine für den Standort. Überprüfen Sie unten zwei Zeilen.
Muhammad Adil Sattar
6

Ich musste lediglich die Mindest-SDK-Version unter Datei> Projektstruktur> App> Flavours auf 21 setzen

Will Buffington
quelle
6

füge deine Datei android / app / build.gradle hinzu

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

Ich bin zweimal auf diesen Fehler gestoßen und die Lösung dafür ist; Überprüfen Sie Ihre App-Gradle-Datei, um Ihr Ziel-SDk zu sehen. Wenn es 20 oder höher ist, fügen Sie einfach eine Zeile zu Ihrem hinzudefaultconfig { multiDexEnabled true }

Andernfalls, wenn Ihr targetSDK kleiner als 20 ist, fügen Sie die Zeile zu Ihrer defaultConfig hinzu und fügen Sie auch eine Abhängigkeit hinzu

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

Überprüfen Sie diesen Link für mehr.

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

Mpwanyi Samuel
quelle
5

Die Verwendung von Multidex-Unterstützung sollte der letzte Ausweg sein. Standardmäßig sammelt gradle build eine Menge transitiver Abhängigkeiten für Ihre APK. Versuchen Sie zunächst, wie in Google Developers Docs empfohlen , unnötige Abhängigkeiten aus Ihrem Projekt zu entfernen.

Navigieren Sie über die Befehlszeile zu Android Projects Root. Sie können den Kompilierungsabhängigkeitsbaum wie folgt abrufen.

gradlew app:dependencies --configuration debugCompileClasspath

Sie können eine vollständige Liste des Abhängigkeitsbaums erhalten

gradlew app:dependencies

Geben Sie hier die Bildbeschreibung ein

Entfernen Sie dann die unnötigen oder transitiven Abhängigkeiten aus Ihrer App build.gradle. Wenn Ihre App beispielsweise die Abhängigkeit "com.google.api-client" verwendet, können Sie die nicht benötigten Bibliotheken / Module ausschließen.

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

Wählen Sie dann in Android Studio Build> APK analysieren ... Wählen Sie die Release / Debug-APK-Datei aus, um den Inhalt anzuzeigen. Dadurch erhalten Sie die folgenden Methoden und Referenzen.

APK analysieren

MG Entwickler
quelle
1
Was sind einige der Nachteile der Verwendung von Multidex, wenn wir müssen
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'
Sebastián Giraldo
quelle
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
quelle
das war auch für mich genug.
Nyxee
1

Der Fehler wird durch die Anzahl der Klassenabhängigkeiten in Ihrer App Gradle-Datei verursacht. Wenn die Klassen 72.400 überschreiten, möchten Sie möglicherweise Multidex als Lösung verwenden, um die Dateiindizierung besser zu handhaben. Weitere Informationen finden Sie hier: https://developer.android.com/studio/build/multidex

Mpwanyi Samuel
quelle