Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hitting 65k Dex method limit but dex-method-count tools says there is much fewer

We've struggled with the 65k method limit for a long time and have done most of the optimizations already. Now I'm trying to add the Jacoco plugin and I'm getting the dex limit error again:

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)

However when I run the dex-method-count tool (found here https://github.com/mihaip/dex-method-counts) it says we are only at 56k methods.

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

The Jacoco library is only 1309 methods (counted using the same dex-method-count tool) so we should be well under 65k limit.

Any ideas? Anyone else noticed the dex-method-count tool underreporting the number of methods?

like image 563
odiggity Avatar asked Dec 11 '14 16:12

odiggity


1 Answers

Thanks to @JesusFreke for pointing it out, it turns out the limit was in the number of strings being too large, not the number of methods. To increase the number of strings to 2^32 (instead of default 2^16) enable jumboMode in your build.gradle file.

dexOptions {
        jumboMode = true
    }

For more info on the string limit see this post What does 'String count' mean in Dex file Android?

like image 106
odiggity Avatar answered Oct 27 '22 00:10

odiggity