DexException: nie można scalić nowego indeksu 65536 z instrukcją inną niż jumbo

84

Z jakiegoś nieznanego powodu moja aplikacja nagle nie chce się skompilować z Android Studio.

Wciąż dostaję

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

Chociaż ta sama aplikacja jest pomyślnie budowana z wiersza poleceń. Sprawdziłem liczbę odwołań do metod i jest znacznie poniżej przerażającego 64 tys.

Teraz używam AS 0.8.11.

Martynas Jurkus
źródło

Odpowiedzi:

57

Spróbuj dodać tę linię do swojego project.properties

dex.force.jumbo = true

Który zwiększa limit dla ciągów znaków w plikach dex. Twój projekt prawdopodobnie się skompiluje.

Uwaga: również w przypadku zestawu jumbo jest to kolejny limit 64 KB tylko dla metod w pojedynczym dex. Jeśli w przyszłości uzyskasz ten limit, będziesz musiał usunąć niektóre zależności.

Aktualizacja - Usługi Google Play 6.5 (12-08-14)

W wersji 6.5 firma Google ostatecznie uwolniła usługi Google Play. Od teraz możliwe będzie selektywne kompilowanie interfejsów API do pliku wykonywalnego.

Przykład:

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

W przypadku wszystkich innych poszczególnych interfejsów API usług Google Play sprawdź tę stronę w witrynie d.android.com.

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

Haresh Chhelana
źródło
11
Dodawanie do project.propertiesnie zadziałało, więc zaktualizowałem skrypt kompilacji Gradle zgodnie z opisem tutaj: stackoverflow.com/questions/17320088/…
Martynas Jurkus
1
Zrobiłem oba rozwiązania: dodanie właściwości dex.force.jumbo i dexOptions, ale nadal otrzymuję ten sam błąd. Inna opcja?
Juan Saravia,
Dzięki @HareshChhelana. Z jakiegoś powodu zaczęło działać ... ale tak naprawdę nie zrobiłem nic specjalnego. Mam kilku współpracowników, którzy kompilują projekt bez tej opcji, ale teraz działa dla mnie. Dzięki!
Juan Saravia,
1
Zamiast kompilować wszystkie usługi Google Play, compile 'com.google.android.gms:play-services-base:7.3.0'
uznałem
245

Ustaw właściwość jumboMode w build.gradle:

android {
    ...
    dexOptions {
        jumboMode true
    }

}

Znalazłem również to przydatne: Wyświetlanie liczby metod dex według pakietu .

lydia_schiff
źródło
12
Dzięki! Na mnie też działa. Ale co oznacza to „jumboMode”?
yital9
3
@ yital9 możesz dowiedzieć się więcej o trybie jumbo tutaj: stackoverflow.com/a/30517283/4034572
Albert Vila Calvo
proszę wyjaśnić przyczynę tego bloku
eC Droid
Dodałem ten sam typ kompilacji do debugowania, ponieważ kompilacja wydania działa dobrze, z powodu proguard. Po tej modyfikacji kompilacja debugowania przebiegła pomyślnie. Czy to w porządku?
granat
1
To działa dla mnie. Należy pamiętać, że plik build.gradle, który ma zostać zmieniony, powinien być modułem, który zgłasza com.android.dex.DexException.
Francis Bacon,
54

To działa dla mnie. Dostawałemcom.android.dex.DexIndexOverflowException: Cannot merge new index 66636 into a non-jumbo instruction!

android {
    ...
    dexOptions {
        jumboMode true
    }
}

Jeśli to nie działa, być może osiągnąłeś limit odwołań do metody w dex, co jest innym problemem. Musisz użyć multidex lub proGuard.

Sayooj
źródło
To dla mnie praca. Dzięki!!! ale co to jest „jumboMode”? Czy możesz mi wyjaśnić? @Sayooj
DG
13

Jest to błąd w łączeniu, gdy scalane pliki dex mają więcej niż 65536 ciągów. Nowy indeks nie mieści się w instrukcji const-string, a łączenie dex nie obsługuje zmiany instrukcji, jeśli mają one różne rozmiary, więc nie można go rozszerzyć do instrukcji const-string / jumbo. jb-mr1 poprzez dodanie nowej opcji: --force-jumbo. Ten błąd można naprawić, dodając "dex.force.jumbo=true"do project.properties.

goonerDroid
źródło
1
@DeepakSharma Musisz wyczyścić swój projekt po włączeniu jumboMode
Lilo
-1

Z najnowszym Android Studio i flagą „force jumbo” zaznaczoną w ustawieniach kompilatora Android Studio ten problem znika.

SamuraiSong
źródło
3
Jeśli to możliwe, dodaj trochę szczegółów w swojej odpowiedzi, proszę.
shA.t