Ich habe schon verschiedene Versionen der Dex-Erros gesehen, aber diese ist neu. Reinigen / Neustarten usw. wird nicht helfen. Bibliotheksprojekte scheinen intakt zu sein und die Abhängigkeit scheint korrekt verknüpft zu sein.
Unable to execute dex: method ID not in [0, 0xffff]: 65536
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
oder
Cannot merge new index 65950 into a non-jumbo instruction
oder
java.util.concurrent.ExecutionException: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
tl; dr : Die offizielle Lösung von Google ist endlich da!
http://developer.android.com/tools/building/multidex.html
Nur ein kleiner Tipp, Sie müssen dies wahrscheinlich tun, um zu verhindern, dass beim Dexen nicht genügend Speicherplatz zur Verfügung steht.
dexOptions {
javaMaxHeapSize "4g"
}
Es gibt auch einen Jumbo-Modus, der dies weniger zuverlässig beheben kann:
dexOptions {
jumboMode true
}
Update: Wenn Ihre App fett ist und Sie zu viele Methoden in Ihrer Haupt-App haben, müssen Sie Ihre App möglicherweise gemäß den Anforderungen neu organisieren
http://blog.osom.info/2014/12/too-many-methods-in-main-dex.html
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
dass Sie diese Funktion nicht aufrufen, wenn sie nicht verfügbar ist?Antworten:
Update 3 (03.11.2014)
Google hat endlich die offizielle Beschreibung veröffentlicht .
Update 2 (31.10.2014) Das
Gradle-Plugin v0.14.0 für Android bietet Unterstützung für Multi-Dex. Zum Aktivieren müssen Sie es nur in build.gradle deklarieren :
Wenn Ihre Anwendung Android vor 5.0 unterstützt ( dh wenn Sie
minSdkVersion
20 Jahre oder jünger sind ), müssen Sie die Anwendung ClassLoader auch dynamisch patchen , damit Klassen aus sekundären Dexes geladen werden können. Glücklicherweise gibt es eine Bibliothek , die das für Sie erledigt. Fügen Sie es den Abhängigkeiten Ihrer App hinzu:Sie müssen den ClassLoader-Patchcode so schnell wie möglich aufrufen.
MultiDexApplication
In der Dokumentation der Klasse werden drei Möglichkeiten vorgeschlagen (wählen Sie eine davon aus , eine, die für Sie am bequemsten ist):1 - Deklarieren Sie die
MultiDexApplication
Klasse als Anwendung in Ihrer AndroidManifest.xml :2 - Lassen Sie Ihre
Application
Klasse die MultiDexApplication- Klasse erweitern:3 - Aufruf
MultiDex#install
von IhrerApplication#attachBaseContext
Methode:Update 1 (17.10.2014):
Wie erwartet wird die Multidex-Unterstützung in Version 21 der Android Support Library ausgeliefert. Sie finden die Datei android-support-multidex.jar im Ordner / sdk / extras / android / support / multidex / library / libs.
Multi-Dex-Unterstützung löst dieses Problem. Mit dx 1.8 können bereits mehrere Dex-Dateien generiert werden.
Android L wird Multi-Dex nativ unterstützen, und die nächste Überarbeitung der Support-Bibliothek wird ältere Versionen zurück zu API 4 abdecken.
Es wurde in dieser Android Developers Backstage-Podcast-Episode von Anwar Ghuloum angegeben. Ich habe ein Transkript (und eine allgemeine Multi-Dex-Erklärung) des relevanten Teils veröffentlicht.
quelle
java.lang.ClassNotFoundException: Didn't find class "org.qtproject.qt5.android.QtActivityDelegate" on path: DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
. Es stellte sich heraus, dass mein Fehler darin bestand, dass ich die zusätzlichen Schritte für die Android-Unterstützung vor 5.0 nicht angewendet habe. Nachdem dies gesagt wurde, löste Option 3 es und ich hatte keineClassNotFoundException
Probleme mehr . Danke, @Alex Lipov!Wie bereits erwähnt, haben Sie zu viele Methoden (mehr als 65 KB) in Ihrem Projekt und Ihren Bibliotheken.
Verhindern Sie das Problem: Reduzieren Sie die Anzahl der Methoden mit Play Services 6.5+ und support-v4 24.2+
Da die Google Play-Dienste mit ihren über 20.000 Methoden häufig einer der Hauptverdächtigen bei der "Verschwendung" von Methoden sind . Mit Google Play-Diensten Version 6.5 oder höher können Sie Google Play-Dienste mithilfe einer Reihe kleinerer Client-Bibliotheken in Ihre Anwendung aufnehmen. Wenn Sie beispielsweise nur GCM und Karten benötigen, können Sie nur diese Abhängigkeiten verwenden:
Die vollständige Liste der Unterbibliotheken und ihrer Verantwortlichkeiten finden Sie im offiziellen Google-Dokument .
Update : Seit Support Library v4 v24.2.0 wurde es in folgende Module aufgeteilt:
Beachten Sie jedoch, dass bei Verwendung
support-fragment
Abhängigkeiten zu allen anderen Modulen bestehen (dh wenn Sie diese verwenden,android.support.v4.app.Fragment
gibt es keinen Vorteil).Hier finden Sie die offiziellen Versionshinweise für support-v4 lib
Aktivieren Sie MultiDexing
Seit Lollipop (auch bekannt als Build Tools 21+) ist es sehr einfach zu handhaben. Der Ansatz besteht darin, das Problem mit 65.000 Methoden pro Dex-Datei zu umgehen, um mehrere Dex-Dateien für Ihre App zu erstellen. Fügen Sie Ihrer Gradle-Build-Datei Folgendes hinzu ( dies stammt aus dem offiziellen Google-Dokument für Anwendungen mit mehr als 65.000 Methoden ):
Der zweite Schritt besteht darin, entweder Ihre Anwendungsklasse vorzubereiten oder, wenn Sie die Anwendung nicht erweitern, Folgendes
MultiDexApplication
in Ihrem Android-Manifest zu verwenden:Fügen Sie dies entweder Ihrer Application.java hinzu
oder verwenden Sie die bereitgestellte Anwendung aus der mutlidex lib
Verhindern Sie OutOfMemory mit MultiDex
Als weiterer Tipp: Wenn Sie
OutOfMemory
während der Erstellungsphase auf Ausnahmen stoßen, können Sie den Heap mit vergrößerndas würde den Heap auf 4 Gigabyte setzen.
In dieser Frage finden Sie weitere Informationen zum Problem mit dem Dex-Heapspeicher.
Analysieren Sie die Ursache des Problems
Um die Quelle der Methoden zu analysieren, kann das Gradle-Plugin https://github.com/KeepSafe/dexcount-gradle-plugin in Kombination mit dem von gradle bereitgestellten Abhängigkeitsbaum mit z
In dieser Antwort und Frage finden Sie weitere Informationen zur Anzahl der Methoden in Android
quelle
Ihr Projekt ist zu groß. Sie haben zu viele Methoden. Es können nur 65536 Methoden pro Anwendung vorhanden sein. siehe hier https://code.google.com/p/android/issues/detail?id=7147#c6
quelle
Der folgende Code hilft, wenn Sie Gradle verwenden. Ermöglicht das einfache Entfernen nicht benötigter Google-Dienste (vorausgesetzt, Sie verwenden sie), um den Schwellenwert von 65.000 wieder zu unterschreiten. Alle Gutschriften für diesen Beitrag: https://gist.github.com/dmarcato/d7c91b94214acd936e42
Edit 2014-10-22 : Es gab viele interessante Diskussionen über das Wesentliche, auf das oben Bezug genommen wurde. TLDR? Schauen Sie sich diese an: https://gist.github.com/Takhion/10a37046b9e6d259bb31
Fügen Sie diesen Code am Ende Ihrer build.gradle-Datei ein und passen Sie die Liste der nicht benötigten Google-Dienste an:
quelle
clean
jedes Mal eine Aktion durchführen, wenn ich mit den Ausschlüssen Affen machte (wir verwenden Analysen).Ich habe ein Beispielprojekt freigegeben, das dieses Problem mithilfe des Build-Skripts custom_rules.xml und einiger Codezeilen löst.
Ich habe es in meinem eigenen Projekt verwendet und es läuft einwandfrei auf 1M + Geräten (von Android-8 bis zum neuesten Android-19). Ich hoffe es hilft.
https://github.com/mmin18/Dex65536
quelle
Konfrontierte das gleiche Problem und löste es, indem ich meine build.gradle-Datei im Abschnitt Abhängigkeiten bearbeitete und entfernte:
Und ersetzen durch:
quelle
Versuchen Sie, den folgenden Code in build.gradle hinzuzufügen, es hat bei mir funktioniert -
quelle
Die perfekte Lösung hierfür wäre die Zusammenarbeit mit Proguard. wie Aleb im Kommentar erwähnt. Dadurch wird die Größe der Dex-Datei um die Hälfte verringert.
quelle
Sie können Probleme (Dex-Dateireferenzen) mit Android Studio analysieren:
Build -> APK analysieren ..
Klicken Sie im Ergebnisbereich auf die Datei classes.dex
Und du wirst sehen:
quelle
Gradle + Proguard-Lösung:
quelle
Entfernen Sie eine JAR-Datei aus dem Libs-Ordner und kopieren Sie sie in einen anderen Ordner. Gehen Sie zu _Project Properties> Java Build Path auswählen, Libraries auswählen, Select External Jar hinzufügen, Wählen Sie die entfernte JAR-Datei zu Ihrem Projekt aus. Klicken Sie auf Speichern. Dies wird unter Referenziert hinzugefügt Bibliothek statt Libs-Ordner. Bereinigen Sie nun Ihr Projekt und führen Sie es aus. Sie müssen keinen Code für MultDex hinzufügen. Es hat einfach bei mir funktioniert.
quelle
Ich hatte heute das gleiche Problem, für das, was funktioniert hat, unten steht
Für ANDROID STUDIO ... Sofortlauf aktivieren
Unter Datei-> Einstellungen-> Erstellen, Ausführen, Bereitstellen-> Sofortausführung-> Aktivieren Sie Sofortausführung für Hot-Swap aktivieren ...
Ich hoffe es hilft
quelle