Приложение слишком большое? Невозможно выполнить dex: Невозможно объединить новый индекс в не-гигантскую инструкцию
Я получаю следующую ошибку при компиляции приложения:
[2014-05-07 21:48:42 - Dex Loader] Unable to execute dex: Cannot merge new index 65536 into a non-jumbo instruction!
Я нахожусь в момент, когда я объявляю новый метод где-нибудь в моем пакете, я получаю эту ошибку. Если я не, приложение компилируется.
Я хотел бы знать, что именно (и точно) означает эта ошибка. Мое приложение большое, но я не думаю, что оно такое большое! Так:
- Ошибка означает, что у меня слишком много методов? общественности? статические? пакет? Члены?
- Это связано с методами / членами моего корневого пакета или также с включенными библиотеками JAR?
- Есть ли способ получить больше отладочной информации об этом?
Я уже знаю об этом флаге включения "jumbo", который рассматривается в аналогичных вопросах здесь, в SO, однако я думаю, что jumbo mode недоступен на уровне API, на который я нацеливаюсь (ICS).
5 ответов
Это связано с количеством методов библиотек, включенных в проект. Например, если у вас есть отслеживание в вашем приложении, просто Google Analytics составляет ~7000 методов. В одном из моих проектов использование Lombok (2 МБ JAR) дало мне эти проблемы. Решил избавиться от этой библиотеки.
Ваша ошибка связана с количеством строк (методов, членов и т. Д.) В одном файле dex.
Вам нужно скомпилировать ваше приложение, используя Jumbo в Dex с:
dex.force.jumbo=true
в project.properties
Это увеличивает предел для строк в файлах dex. И ваш проект, вероятно, скомпилируется.
Также с установленным jumbo, это еще одно ограничение 64K только для методов в одном dex. Если вы получите этот предел в будущем, вам нужно будет удалить некоторые зависимости.
ОБНОВЛЕНИЕ: для сборки с Gradle: В Gradle вы можете включить jumboMode также в файле build.gradle с помощью:
dexOptions {
jumboMode = true
}
Проверка: Android Сборка: Dex Jumbo Mode в Gradle
Также с Gradle вы можете обойти ограничение в 64 КБ для методов, использующих мультидексную сборку, учебное руководство здесь: https://developer.android.com/tools/building/multidex.html
Для сборки gradle просто добавьте dexOptions в build.gradle, чтобы включить режим jumbo:
android {
dexOptions {
jumboMode = true
}
}
Не забудьте запустить "gradle clean" перед вашим новым зданием.
Похоже, проблема возникает из-за того, что все файлы классов из вашего проекта и JAR-файлы упакованы вместе перед DEXing. Возможно, это не совсем верно, но любой способ контролировать это в нашем проекте оказался довольно сложным. Даже удаление вещей, которые первоначально вызывали эту проблему, очистка и восстановление не решали проблему для нас последовательно.
Поэтому мы воспользовались этой возможностью, чтобы переключить наш проект на Android Studio, и сумели решить эту проблему, включив ProGuard для отладочных сборок. Точнее, мы используем только фазу сжатия технологической цепочки ProGuard.
Gradle позволяет легко включить ProGuard для отладочных сборок:
buildTypes {
debug {
runProguard true
proguardFile 'proguard-project-debug.txt'
}
}
А вот отладочный конфиг ProGuard, который мы используем:
-keep class com.your.code.**
# Use -keep to explicitly keep any other classes shrinking would remove
-dontoptimize
-dontobfuscate
-ignorewarnings
Это увеличивает время сборки проекта, но хорошая сторона в том, что отладчик все еще работает.
Единственная более быстрая альтернатива, о которой я могу подумать, это то, что любые файлы JAR вручную удаляются из неиспользуемых файлов классов. Но это не только трудно сделать, это также неудобно, когда вы хотите использовать чуть большую часть библиотеки позже.
Я надеюсь, что это помогает другим разработчикам, борющимся с этой проблемой. И, возможно, в будущем Google может улучшить компилятор, который делает это сокращение по умолчанию. Размер файла APK DEX увеличился с 8 МБ до 2,9 МБ.
Более новые версии Gradle (1.0.0+)
В более новых версиях Android студии (1.0+) обновленный Gradle обновился. Были внесены некоторые изменения в работу механизма сборки, поэтому в файле Gradle проекта теперь можно использовать параметры minifyEnabled и shrinkResources. Текущая версия 1.1.0.
Чтобы идти в ногу с изменениями на быстро движущейся платформе, такой как Android, требуются усилия, но она часто вознаграждается новыми функциями, инструментами и более быстрым временем сборки. Поэтому обновление Android Studio и (осторожно) обновление ваших проектов стоит потраченного времени.
buildTypes {
debug {
proguardFile 'proguard-project-debug.txt'
minifyEnabled true
shrinkResources true
}
}
Несколько интересных наблюдений. Та же ошибка может появиться, если у вас есть проект с несколькими вкусами. Это сбивает с толку. Оказалось, что я попытался запустить приложение с общей командой: gradlew installDebug
, Когда я изменил командную строку, чтобы эта проблема исчезла Не забудьте заменить партию Flavor на настоящую.
gradlew installFlavorDebug