DexException: Der neue Index 65536 kann nicht mit einer Nicht-Jumbo-Anweisung zusammengeführt werden

84

Aus einem unbekannten Grund wird meine App plötzlich nicht mehr aus Android Studio erstellt.

Ich bekomme immer

> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    /home/martynas/android-sdk/build-tools/19.1.0/dx --dex --num-threads=4 --output
...
...
...
Error Code:
2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Cannot merge new index 65536 into a non-jumbo instruction!

Während die gleiche Anwendung erfolgreich über die Befehlszeile erstellt wird. Ich habe die Anzahl der Methodenreferenzen überprüft und sie liegen weit unter den gefürchteten 64 KB.

Ich verwende jetzt AS 0.8.11.

Martynas Jurkus
quelle

Antworten:

56

Versuchen Sie, diese Zeile zu Ihren project.properties hinzuzufügen

dex.force.jumbo = true

Womit das Limit für Strings in Dex-Dateien erhöht wird. Und Ihr Projekt wird wahrscheinlich kompiliert.

Hinweis: Auch mit Jumbo-Set ist das eine weitere Grenze von 64 KB nur für Methoden in einem einzelnen Dex. Wenn Sie dieses Limit in Zukunft erhalten, müssen Sie einige Abhängigkeiten entfernen.

Update - Google Play Services 6.5 (14.08.14)

Mit Version 6.5 hat Google die Google Play Services endgültig entbündelt. Von nun an können Sie die APIs selektiv in Ihre ausführbare Datei kompilieren.

Beispiel:

compile 'com.google.android.gms:play-services-maps:6.5.+'
compile 'com.google.android.gms:play-services-ads:6.5.+'

Alle anderen einzelnen Google Play Services-APIs finden Sie auf dieser Seite auf d.android.com.

Update (21-04-2015): https://developer.android.com/tools/building/multidex.html

Haresh Chhelana
quelle
11
Das Hinzufügen zu project.propertieshat nicht funktioniert, daher habe ich mein Gradle-Build-Skript wie hier beschrieben aktualisiert: stackoverflow.com/questions/17320088/…
Martynas Jurkus
1
Ich habe beide Lösungen durchgeführt: Hinzufügen der Eigenschaft dex.force.jumbo und dexOptions, aber ich erhalte immer noch den gleichen Fehler. Andere Option?
Juan Saravia
@ juancho, Überprüfen Sie: developer.android.com/google/play-services/setup.html#split
Haresh Chhelana
Danke @HareshChhelana. Aus irgendeinem Grund fing es an zu funktionieren ... aber ich habe wirklich nichts Besonderes gemacht. Ich habe einige Mitarbeiter, die das Projekt ohne diese Optionen kompilieren, aber jetzt funktioniert es für mich. Vielen Dank!
Juan Saravia
1
Anstatt die gesamten Google Play-Dienste zu kompilieren, fand ich es nützlich, das ' compile 'com.google.android.gms:play-services-base:7.3.0'
Basis'
245

Legen Sie die Eigenschaft jumboMode in build.gradle fest:

android {
    ...
    dexOptions {
        jumboMode true
    }

}

Ich fand das auch nützlich: Anzeigen der Anzahl der Dex-Methoden nach Paket .

lydia_schiff
quelle
12
Vielen Dank! Das funktioniert auch bei mir. Aber was bedeutet dieser "JumboMode"?
Yital9
3
@ yital9 Sie können mehr über den Jumbo-Modus hier erfahren: stackoverflow.com/a/30517283/4034572
Albert Vila Calvo
Bitte erklären Sie den Grund für diesen Block
eC Droid
Ich habe diesen Inside-Debug-Build-Typ alleine hinzugefügt, da der Release-Build aufgrund von Proguard gut funktioniert. Der Debug-Build lief nach dieser Änderung einwandfrei. Ist das in Ordnung?
Granat
1
Das funktioniert bei mir. Beachten Sie, dass das zu ändernde build.gradle das Modul sein sollte, das com.android.dex.DexException auslöst.
Francis Bacon
54

Das funktioniert bei mir. Ich wurdecom.android.dex.DexIndexOverflowException: Cannot merge new index 66636 into a non-jumbo instruction!

android {
    ...
    dexOptions {
        jumboMode true
    }
}

Wenn dies nicht funktioniert, haben Sie möglicherweise das Referenzlimit für Methoden in dex erreicht, was ein anderes Problem darstellt. Sie müssen entweder Multidex oder ProGuard verwenden.

Sayooj
quelle
Es ist Arbeit für mich. Vielen Dank!!! aber was ist 'jumboMode'? Kannst du mir bitte erklären? @ Sayooj
DG
13

Dies ist ein Fehler bei der Zusammenführung, wenn die zusammengeführten Dex-Dateien mehr als 65536 Zeichenfolgen enthalten. Der neue Index kann nicht in eine const-string-Anweisung passen, und die Dex-Fusion unterstützt keine Änderungsanweisungen, wenn sie unterschiedliche Größen haben. Daher kann er nicht zu einer const-string / jumbo-Anweisung erweitert werden. Dies wurde behoben jb-mr1 durch Hinzufügen einer neuen Option: --force-jumbo. Dieser Fehler kann durch Hinzufügen "dex.force.jumbo=true"zu project.properties behoben werden .

goonerDroid
quelle
1
@DeepakSharma Sie müssen Ihr Projekt bereinigen, nachdem Sie jumboMode
Lilo
-1

Wenn das neueste Android Studio und das Flag "Force Jumbo" in den Einstellungen des Android Studio-Compilers aktiviert sind, verschwindet dieses Problem.

SamuraiSong
quelle
3
Wenn es möglich ist, fügen Sie Ihrer Antwort einige Details hinzu, bitte.
shA.t