应用程序太大? 无法执行dex:无法将新的索引合并到非超大的指令中

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

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

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

我想知道这个错误是什么意思(准确地说)。 我的应用程序很大,但我不认为它很大! 所以:

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

我已经知道在SO中的类似问题中提到的“巨型”启用标志,但是,我认为巨型模式不适用于我所针对的API级别(ICS)。

这与项目中包含的图书馆的方法数量有关。 例如,如果您在应用程序中进行跟踪,则Google Analytics只能使用大约7000种方法。 在我的一个项目中使用龙目(2MB的JAR)给了我这些问题。 解决了摆脱这个图书馆。

你的错误是在一个单一的dex文件中的string(方法,成员等)的数量。

你需要使用dex编译你的应用程序:

 dex.force.jumbo=true 

project.properties

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

另外,对于巨集,这是64K的另一个极限, 仅适用于单个dex中的方法 。 如果你将来得到这个限制,你将需要删除一些依赖项。

更新 :使用Gradle构build:在Gradle中,您还可以在build.gradle文件中启用jumboMode:

 dexOptions { jumboMode = true } 

检查: Android Build:Gradle中的Dex超大模式

同样,对于Gradle,您可以避免使用multidex构build方法64K限制 ,教程在这里: https : //developer.android.com/tools/building/multidex.html

对于gradle构build,只需将dexOptions添加到build.gradle以启用巨型模式:

 android { dexOptions { jumboMode = true } } 

记得在你的新build筑物之前运行“gradle clean”。

它看起来像是问题发生,因为在DEXing之前,项目和JAR文件中的所有类文件都打包在一起。 这可能并不完全正确,但在我们的项目中控制这一点的任何方式已被certificate是相当困难的。 即使删除最初导致这个问题的东西,清理和重build也不能以一致的方式解决我们的问题。

所以我们借此机会将我们的项目切换到Android Studio,并通过打开ProGuard进行debugging构build来解决问题。 更确切地说,我们只使用ProGuard处理链的缩小阶段。

Gradle使打开ProGuard进行debugging构build变得非常简单:

 buildTypes { debug { runProguard true proguardFile 'proguard-project-debug.txt' } } 

这里是我们使用的debuggingProGuardconfiguration:

 -keep class com.your.code.** # Use -keep to explicitly keep any other classes shrinking would remove -dontoptimize -dontobfuscate -ignorewarnings 

这确实增加了项目的构build时间,但好的一面是debugging器仍然工作。

我能想到的唯一更快的select是任何JAR文件都被手工剥离了未使用的类文件。 但是这样做不仅困难,而且稍后要使用稍大一点的图书馆也是不方便的。

我希望这可以帮助其他开发者解决这个问题。 也许在将来,Google可以改进默认进行这种修剪的编译器。 我们的APK DEX文件从8MB变为2.9MB。

较新的gradle(1.0.0+)版本

在较新版本的Android studio(1.0+)中,捆绑的Gradle得到了更新。 构build机制如何工作有一些变化,所以您的项目Gradle文件现在可以利用minifyEnabledshrinkResources参数。 当前版本是1.1.0。

跟上像Android这样的快速移动平台上的变化需要付出努力,但通常会获得新的function,工具和更快的构build时间。 因此,更新Android Studio和(仔细)更新您的项目是值得您投入的时间。

 buildTypes { debug { proguardFile 'proguard-project-debug.txt' minifyEnabled true shrinkResources true } }