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

由于某些未知的原因,我的应用程序突然不能从Android Studio构build。

我一直在得到

> 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! 

而相同的应用程序是从命令行成功构build的。 我已经检查了方法引用计数,它低于可怕的64K。

我现在正在使用AS 0.8.11。

尝试在你的project.properties中添加这一行

dex.force.jumbo =真

其中增加了dex文件中string的限制。 而你的项目可能会编译。

注意:对于巨集,对于单个dex中的方法来说,也是64K的另一个限制。 如果你将来得到这个限制,你将需要删除一些依赖项。

更新 – Google Play Services 6.5(12-08-14)

随着版本6.5谷歌终于把Google Play服务解绑。 所以从现在开始,可以select性地将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

在build.gradle中设置jumboMode属性:

 android { ... dexOptions { jumboMode true } } 

我也发现这有用: 显示dex方法按包计数 。

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

 android { ... dexOptions { jumboMode true } } 

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

当合并的dex文件有超过65536个string时,这是合并中的一个错误。 新的索引不能放入常量string指令中,而且dex合并器不支持更改指令,如果它们大小不同,所以不能将其扩展为const-string / jumbo指令。 jb-mr1通过添加一个新的选项:–force-jumbo。这个bug可以通过在project.properties中添加"dex.force.jumbo=true"来解决。

在Android Studio编译器设置中检查到最新的Android Studio和标志“force jumbo”,这个问题就消失了。