Android 达到了65k Dex方法的极限,但Dex方法计数工具表示数量要少得多
长期以来,我们一直在努力克服65k方法的限制,并且已经完成了大部分优化。现在我正在尝试添加Jacoco插件,并且再次出现dex limit错误:Android 达到了65k Dex方法的极限,但Dex方法计数工具表示数量要少得多,android,dex,dex-limit,Android,Dex,Dex Limit,长期以来,我们一直在努力克服65k方法的限制,并且已经完成了大部分优化。现在我正在尝试添加Jacoco插件,并且再次出现dex limit错误: Error:Execution failed for task ‘:MyProject:dexExternalBetaDebug'. > com.android.ide.common.internal.LoggedErrorException: Failed to run command: /Users/orrieshannon/Code
Error:Execution failed for task ‘:MyProject:dexExternalBetaDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/Users/orrieshannon/Code/sdk/sdk/build-tools/21.1.1/dx --dex --no-optimize --output /Me/MyProject/build/intermediates/dex/externalBeta/debug --input-list=/Me/MyProject/build/intermediates/tmp/dex/externalBeta/debug/inputList.txt
Error Code:
2
Output:
objc[80218]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: Cannot merge new index 66105 into a non-jumbo instruction!
at com.android.dx.merge.InstructionTransformer.jumboCheck(InstructionTransformer.java:109)
at com.android.dx.merge.InstructionTransformer.access$800(InstructionTransformer.java:26)
at com.android.dx.merge.InstructionTransformer$StringVisitor.visit(InstructionTransformer.java:72)
at com.android.dx.io.CodeReader.callVisit(CodeReader.java:114)
at com.android.dx.io.CodeReader.visitAll(CodeReader.java:89)
at com.android.dx.merge.InstructionTransformer.transform(InstructionTransformer.java:49)
at com.android.dx.merge.DexMerger.transformCode(DexMerger.java:842)
at com.android.dx.merge.DexMerger.transformMethods(DexMerger.java:813)
at com.android.dx.merge.DexMerger.transformClassData(DexMerger.java:786)
at com.android.dx.merge.DexMerger.transformClassDef(DexMerger.java:682)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:542)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:302)
at com.android.dx.command.dexer.Main.run(Main.java:245)
at com.android.dx.command.dexer.Main.main(Main.java:214)
at com.android.dx.command.Main.main(Main.java:106)
然而,当我运行dex方法计数工具(在这里找到)时,它说我们只有56k个方法
Read in 56024 method IDs.
<root>: 56024
: 4
android: 10877
accessibilityservice: 6
...
读入56024方法ID。
: 56024
: 4
安卓系统:10877
可访问性服务:6
...
Jacoco库只有1309个方法(使用相同的dex方法计数工具进行计数),因此我们应该在65k限制下
有什么想法吗?还有人注意到dex method count工具低估了方法的数量吗?多亏@JesusFreke指出了这一点,结果证明限制在于字符串的数量太大,而不是方法的数量。要将字符串数增加到2^32(而不是默认的2^16),请在build.gradle文件中启用jumboMode
dexOptions {
jumboMode = true
}
有关字符串限制的更多信息,请参阅本文我不是肯定的,但根据堆栈跟踪,这可能是字符串问题,而不是方法问题。当然,dex格式支持大于64k的字符串,但看起来您可能遇到了dx中的边缘情况,这与将dex文件与巨型字符串合并有关。这只是一个猜测——我还没有从堆栈跟踪中查看dx源的位置。啊,就是这样。非常感谢。我将发布一个答案,但我只是需要启用jumboMode。在Android Studio中,启用jumboMode后,您可能需要清理您的项目。