应用程序太大? 无法执行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文件现在可以利用minifyEnabled和shrinkResources参数。 当前版本是1.1.0。
跟上像Android这样的快速移动平台上的变化需要付出努力,但通常会获得新的function,工具和更快的构build时间。 因此,更新Android Studio和(仔细)更新您的项目是值得您投入的时间。
buildTypes { debug { proguardFile 'proguard-project-debug.txt' minifyEnabled true shrinkResources true } }