DexException: невозможно объединить новый индекс 65536 с инструкцией без jumbo

84

По какой-то неизвестной причине мое приложение внезапно перестает собираться из Android Studio.

Я продолжаю получать

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

Хотя это же приложение успешно построено из командной строки. Я проверил количество ссылок на методы, и оно намного ниже ужасных 64k.

Сейчас я использую AS 0.8.11.

Мартинас Юркус
источник

Ответы:

57

Попробуйте добавить эту строку в свой project.properties

dex.force.jumbo = правда

Которые увеличивают предел для строк в файлах dex. И ваш проект наверняка скомпилируется.

Примечание. Также с установкой jumbo устанавливается еще один предел в 64 КБ только для методов в одном dex. Если вы получите это ограничение в будущем, вам нужно будет удалить некоторые зависимости.

Обновление - Google Play Services 6.5 (12-08-14)

В версии 6.5 Google наконец-то разделил сервисы Google Play. Таким образом, теперь можно будет выборочно компилировать API в исполняемый файл.

Пример :

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

Информацию обо всех остальных API сервисов Google Play можно найти на этой странице на d.android.com.

Обновление (21-04-2015): https://developer.android.com/tools/building/multidex.html

Хареш Чхелана
источник
11
Добавление в project.propertiesне сработало, поэтому я обновил свой скрипт сборки gradle, как описано здесь: stackoverflow.com/questions/17320088/…
Мартинас Юркус
1
Я применил оба решения: добавил свойство dex.force.jumbo и dexOptions, но все равно получаю ту же ошибку. Другой вариант?
Хуан Саравиа
@ juancho, проверьте: developer.android.com/google/play-services/setup.html#split
Haresh Chhelana,
Спасибо @HareshChhelana. Почему-то заработало .. но особо ничего не делал. У меня есть коллеги, которые компилируют проект без этой опции, но теперь это работает для меня. Благодаря!
Хуан Саравиа,
1
я обнаружил, что вместо компиляции всех сервисов Google Play полезно использовать «базовый» пакет, чтобы оставаться ниже лимита в compile 'com.google.android.gms:play-services-base:7.3.0'
65K
245

Установите свойство jumboMode в build.gradle:

android {
    ...
    dexOptions {
        jumboMode true
    }

}

Я также нашел это полезным: Отображение количества методов dex по пакетам .

Lydia_schiff
источник
12
Благодаря! У меня тоже работает. Но что означает этот "jumboMode"?
yital9 06
3
@ yital9, вы можете узнать больше о режиме jumbo здесь: stackoverflow.com/a/30517283/4034572
Альберт Вила Кальво,
объясните, пожалуйста, причину этого блока
eC Droid
Я добавил только этот тип сборки внутри отладки, поскольку сборка выпуска идет нормально из-за proguard. После этой модификации отладочная сборка прошла нормально. Это нормально?
гранат
1
У меня это работает. Обратите внимание, что изменяемый build.gradle должен быть модулем, который генерирует исключение com.android.dex.Dexception.
Фрэнсис Бэкон
54

У меня это работает. Я получалcom.android.dex.DexIndexOverflowException: Cannot merge new index 66636 into a non-jumbo instruction!

android {
    ...
    dexOptions {
        jumboMode true
    }
}

Если это не работает, возможно, вы достигли предела ссылки на метод в dex, что является другой проблемой. Вам нужно использовать либо multidex, либо proGuard.

Sayooj
источник
Для меня это работа. Благодаря!!! но что такое jumboMode? Не могли бы вы мне объяснить? @Sayooj
DG
13

Это ошибка слияния, когда сливаемые файлы dex имеют более 65536 строк. Новый индекс не может поместиться в инструкции const-string, а слияние dex не поддерживает изменение инструкций, если они имеют разные размеры, поэтому его нельзя расширить до инструкции const-string / jumbo. Это было исправлено в jb-mr1, добавив новую опцию: --force-jumbo. Эту ошибку можно исправить, добавив "dex.force.jumbo=true"в project.properties.

goonerDroid
источник
1
@DeepakSharma Вы должны очистить свой проект после включения jumboMode
Лило
-1

С последней версией Android Studio и флагом "force jumbo", установленным в настройках компилятора Android Studio, эта проблема исчезает.

СамурайПесня
источник
3
Если возможно, опишите подробнее в своем ответе, пожалуйста.
shA.t