编译应用程序时出现以下错误:
[2014-05-07 21:48:42 - Dex Loader] Unable to execute dex: Cannot merge new index 65536 into a non-jumbo instruction!
我在如果我在我的包中的任何地方声明一个新方法,我得到了这个错误。如果我不这样做,应用程序就会编译。
我想知道这个错误的确切含义(并准确无误)。我的应用程序很大,但我认为它不那么大!所以:
我已经知道了这个" jumbo"在SO中的类似问题中启用了标记,但是,我认为jumbo模式不适用于API级别的目标(ICS)。
答案 0 :(得分:52)
您的错误是指单个dex文件中的字符串数量(方法,成员等)。
您需要在dex中使用jumbo编译应用程序:
dex.force.jumbo=true
project.properties
中的
这会增加dex文件中字符串的限制。你的项目可能会编译。
同样使用jumbo set,只有单个dex中 64K的另一个限制。如果将来获得此限制,则需要删除一些依赖项。
更新 :用于 Gradle 的构建: 在Gradle中,您还可以在build.gradle文件中启用jumboMode:
dexOptions {
jumboMode = true
}
检查: Android Build: Dex Jumbo Mode in Gradle
使用Gradle,你可以使用multidex build避免 64K方法限制,这里的教程: https://developer.android.com/tools/building/multidex.html
答案 1 :(得分:24)
对于gradle构建,只需将dexOptions添加到build.gradle中以启用jumbo模式:
android {
dexOptions {
jumboMode = true
}
}
记得跑步" gradle clean"在你的新建筑之前。
答案 2 :(得分:11)
它与项目中包含的库的方法数量有关。例如,如果您在应用中进行了跟踪,那么Google Analytics就是大约7000种方法。 在我的一个项目中使用Lombok(2MB的JAR)给了我这些问题。解决了摆脱这个库。
答案 3 :(得分:7)
看起来问题出现是因为项目和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文件从8MB变为2.9MB。
较新的gradle(1.0.0+)版本
在较新版本的Android studio(1.0+)中,捆绑的Gradle已更新。关于构建机制如何工作有一些变化,因此您的项目Gradle文件现在可以利用 minifyEnabled 和 shrinkResources 参数。当前版本是1.1.0。
跟上像Android这样的快速移动平台上的变化需要付出努力,但它通常会获得新功能,工具和更快的构建时间。因此,更新Android Studio并(仔细)更新您的项目是值得您投入的时间。
buildTypes {
debug {
proguardFile 'proguard-project-debug.txt'
minifyEnabled true
shrinkResources true
}
}
答案 4 :(得分:0)
一些有趣的观察。如果您有多风味项目,可能会出现相同的错误。这令人困惑。原来我尝试使用通用命令运行app:gradlew installDebug
。当我改变命令行看起来像这个问题消失了。不要忘记用实际的部分替换Flavor部分。
gradlew installFlavorDebug