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

85

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

245

12
谢谢!这对我也有用。但是"jumboMode"是什么意思呢? - yital9
3
@yital9,您可以在这里了解更多有关Jumbo模式的信息:http://stackoverflow.com/a/30517283/4034572 - Albert Vila Calvo
请解释此代码块的原因。 - eC Droid
我只在调试版本中添加了这个,因为发布版本由于Proguard的原因没有问题。在进行了这个修改后,调试版本运行良好。这样可以吗? - garnet
这个文件 build.gradle 在哪里?在 platform 目录里面吗?因为我正在 Ionic 项目上。但是我不想弄乱 platform 目录,还有其他什么办法吗? - Francisco Souza
1
这对我有效。请注意,需要更改的build.gradle应该是引发com.android.dex.DexException的模块。 - Francis Bacon

57

尝试在您的project.properties文件中添加这行:

dex.force.jumbo=true

它会增加dex文件中字符串的限制,您的项目可能编译成功。

注意:同时设置jumbo后,单个dex文件中方法的限制也仅为64K。如果将来遇到此限制,则需要删除某些依赖项。

更新-Google Play服务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,请查看d.android.com上的此页面。

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


11
将内容添加到project.properties没有生效,所以我按照这里描述的方式更新了我的gradle构建脚本:https://dev59.com/cGQm5IYBdhLWcg3w0Bq5 - Martynas Jurkus
1
我尝试了两种解决方案:添加dex.force.jumbo属性和dexOptions,但仍然收到相同的错误。还有其他选项吗? - Juan Saravia
@juancho,请查看:https://developer.android.com/google/play-services/setup.html#split - Haresh Chhelana
感谢@HareshChhelana。出于某种原因,它开始工作了...但我真的没有做什么特别的事情。我有一些同事在没有这些选项的情况下编译项目,但现在它对我起作用了。谢谢! - Juan Saravia
1
不需要编译整个Google Play服务,我发现使用“base”包很有用,以保持在65K dex限制以下: compile 'com.google.android.gms:play-services-base:7.3.0' - kip2
“compile”配置现已弃用,应该替换为“implementation”或“api”。 - A.A

54

这对我起作用了。我一直在遇到com.android.dex.DexIndexOverflowException: Cannot merge new index 66636 into a non-jumbo instruction!

android {
    ...
    dexOptions {
        jumboMode true
    }
}

如果这不起作用,可能是你达到了dex方法引用限制,这是一个不同的问题。你需要使用multidex或proGuard。


这对我有用。谢谢!!! 但是'jumboMode'是什么?你能解释一下吗?@Sayooj - D G

13

当正在合并的DEX文件包含超过65536个字符串时,这是合并器中存在的一个错误。 新索引无法适应const-string指令,并且dex合并器不支持更改指令(如果它们具有不同的大小),因此不能扩展为const-string / jumbo指令。这在jb-mr1中通过添加一个新选项来解决:--force-jumbo。可以通过将"dex.force.jumbo=true"添加到project.properties中来修复此错误。


1
@DeepakSharma 在启用 jumboMode 后,你必须清理你的项目。 - Lilo

-1

使用最新版本的Android Studio并在Android Studio编译器设置中选中“force jumbo”标志,该问题将消失。


3
如果可能的话,请在您的回答中添加一些细节。 - shA.t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接