Достигнут лимит методов Dex в 65 000, но инструменты подсчета методов dex говорят, что их гораздо меньше

Мы долго боролись с ограничением в 65 000 методов и уже сделали большую часть оптимизации. Теперь я пытаюсь добавить плагин 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) говорит, что у нас всего 56 тысяч методов.

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

Библиотека Jacoco состоит всего из 1309 методов (подсчитанных с помощью того же инструмента dex-method-count), поэтому мы должны быть намного меньше предела в 65 КБ.

Любые идеи? Кто-нибудь еще заметил, что инструмент dex-method-count занижает количество методов?


person odiggity    schedule 11.12.2014    source источник
comment
Я не уверен, но на основе трассировки стека кажется, что это может быть проблема со строкой, а не с методом. Формат dex, конечно, поддерживает строки > 64k, но похоже, что вы, возможно, столкнулись с крайним случаем в dx, связанным со слиянием файлов dex с большими строками. Это всего лишь предположение - я на самом деле не смотрел в источнике dx местоположение из вашей трассировки стека.   -  person JesusFreke    schedule 11.12.2014
comment
Ах, вот оно. Спасибо!! Я опубликую ответ, но мне просто нужно было включить jumboMode.   -  person odiggity    schedule 11.12.2014


Ответы (1)


Благодаря @JesusFreke за указание на это, оказалось, что ограничение было в слишком большом количестве строк, а не в количестве методов. Чтобы увеличить количество строк до 2^32 (вместо 2^16 по умолчанию), включите jumboMode в файле build.gradle.

dexOptions {
        jumboMode = true
    }

Для получения дополнительной информации об ограничении строк см. этот пост count' означает в файле Dex Android?

person odiggity    schedule 11.12.2014
comment
В Android Studio вам может потребоваться очистить проект после включения jumboMode. - person shadowhorst; 25.02.2015