DexException:无法将新索引65536合并到非jumbo指令中

时间:2014-09-29 06:25:32

标签: android android-studio android-gradle

由于某些未知原因,我的应用程序突然无法从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。

5 个答案:

答案 0 :(得分:240)

在build.gradle中设置jumboMode属性:

android {
    ...
    dexOptions {
        jumboMode true
    }

}

我还发现这很有用:Showing dex method count by package

答案 1 :(得分:53)

尝试在project.properties

上添加此行

dex.force.jumbo =真

增加dex文件中字符串的限制。你的项目可能会编译。

注意:同样使用jumbo set,只有单个dex中的方法的另一个限制是64K。如果将来获得此限制,则需要删除一些依赖项。

更新 - 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.+'

对于所有其他单独的Google Play服务API,请检查此page on d.android.com.

更新(2015年4月21日): https://developer.android.com/tools/building/multidex.html

答案 2 :(得分:53)

这对我有用。我得到了com.android.dex.DexIndexOverflowException: Cannot merge new index 66636 into a non-jumbo instruction!

android {
    ...
    dexOptions {
        jumboMode true
    }
}

如果这不起作用,您可能已达到dex中的方法参考限制,这是一个不同的问题。您需要使用multidex或proGuard。

答案 3 :(得分:12)

当合并的dex文件超过65536个字符串时,这是合并中的错误。新索引不适合const-string指令,如果指令大小不同,则dex merger不支持更改指令,因此无法扩展为const-string / jumbo通过添加一个新选项修复了jb-mr1: - force-jumbo。这个bug可以通过将"dex.force.jumbo=true"添加到project.properties来修复。

答案 4 :(得分:-1)

使用最新的Android Studio和旗帜"强制jumbo"检查Android Studio编译器设置,此问题消失。