2014-12-11 22 views
7

Od dłuższego czasu zmagaliśmy się z ograniczeniem metody 65k i już zrobiliśmy większość optymalizacji. Teraz próbuję dodać wtyczkę Jacoco a ja ponownie uzyskiwanie błąd limitu Dex:Osiągnięcie limitu metody 65x Dex, ale narzędzia do liczenia metod dex mówią, że jest znacznie mniej

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) 

Jednak kiedy uruchomić narzędzie Dex-metoda-count (znaleźć tutaj https://github.com/mihaip/dex-method-counts) mówi, jesteśmy dopiero na Metody 56k.

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

Biblioteka Jacoco zaledwie 1309 metody (liczone przy użyciu tego samego narzędzia dek-metody zliczania), więc powinny również być poniżej 65k granicy.

Wszelkie pomysły? Ktoś jeszcze zauważył narzędzie do liczenia metod dex, które zaniżało liczbę metod?

+0

Nie jestem pewien, ale na podstawie śladu stosu, wydaje się, że to może być problem ciąg, a nie problem metoda. Format dex obsługuje łańcuchy> 64k oczywiście, ale wygląda na to, że mogłeś trafić w skrzynkę krawędzi w dx, związaną z łączeniem plików dex z ciągami jumbo. To tylko przypuszczenie - nie szukałem w źródle dx w miejscu z twojego śladu stosu. – JesusFreke

+0

Ah, to wszystko. Dziękuję Ci!! Napiszę odpowiedź, ale musiałem tylko włączyć JumboMode. – odiggity

Odpowiedz

7

Dzięki @JesusFreke za wskazanie, okazało się, że limit dotyczy liczby łańcuchów będących zbyt dużych, a nie liczby metod. Aby zwiększyć liczbę łańcuchów do 2^32 (zamiast domyślnych 2^16) włącz tryb jumboMode w pliku build.gradle.

dexOptions { 
     jumboMode = true 
    } 

Aby uzyskać więcej informacji na temat limitu strun zobaczyć ten post What does 'String count' mean in Dex file Android?

+1

W Android Studio może być konieczne wyczyszczenie projektu po włączeniu trybu jumboMode. – shadowhorst

Powiązane problemy