【问题标题】:Hitting 65k Dex method limit but dex-method-count tools says there is much fewer达到 65k 的 Dex 方法限制,但 dex-method-count 工具显示更少
【发布时间】:2014-12-11 16:14:41
【问题描述】:

长期以来,我们一直在与 65k 方法限制作斗争,并且已经完成了大部分优化。现在我正在尝试添加 Jacoco 插件,但又遇到了 dex 限制错误:

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-method-count 工具(在此处找到 https://github.com/mihaip/dex-method-counts)时,它说我们只有 56k 方法。

Read in 56024 method IDs.
<root>: 56024
    : 4
    android: 10877
        accessibilityservice: 6
        ...

Jacoco 库只有 1309 个方法(使用相同的 dex-method-count 工具计算),所以我们应该远远低于 65k 的限制。

有什么想法吗?有没有人注意到 dex-method-count 工具少报了方法的数量?

【问题讨论】:

  • 我不肯定,但根据堆栈跟踪,这似乎是字符串问题,而不是方法问题。 dex 格式当然支持大于 64k 的字符串,但看起来您可能遇到了 dx 中的边缘情况,与将 dex 文件与巨型字符串合并有关。这只是一个猜测——我实际上并没有在堆栈跟踪的位置查看 dx 源。
  • 啊,就是这样。谢谢!!我会发布答案,但我只需要启用 jumboMode。

标签: android dex dex-limit


【解决方案1】:

感谢@JesusFreke 指出,原来限制是字符串的数量太大,而不是方法的数量。要将字符串数量增加到 2^32(而不是默认的 2^16),请在 build.gradle 文件中启用 jumboMode。

dexOptions {
        jumboMode = true
    }

有关字符串限制的更多信息,请参阅此帖子What does 'String count' mean in Dex file Android?

【讨论】:

  • 在 Android Studio 中,您可能需要在启用 jumboMode 后清理您的项目。
猜你喜欢
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多