应用太大了?无法执行dex:无法将新索引合并到非jumbo指令中

时间:2014-05-07 19:59:03

标签: android linker-errors dex

编译应用程序时出现以下错误:

[2014-05-07 21:48:42 - Dex Loader] Unable to execute dex: Cannot merge new index 65536 into a non-jumbo instruction!

我在如果我在我的包中的任何地方声明一个新方法,我得到了这个错误。如果我不这样做,应用程序就会编译。

我想知道这个错误的确切含义(并准确无误)。我的应用程序很大,但我认为它不那么大!所以:

  • 错误是否意味着我有太多方法?上市?静态的?包?成员?
  • 它与我的root包的方法/成员有关,还是与包含的JAR库有关?
  • 有没有办法获得更多关于此的调试信息?

我已经知道了这个" jumbo"在SO中的类似问题中启用了标记,但是,我认为jumbo模式不适用于API级别的目标(ICS)。

5 个答案:

答案 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