2017-11-22 117 views
9

Mam bibliotekę używam do testów Espresso, które po dodaniu do mojego projektu nie jestem w stanie skompilować moich testów.com.android.dex.DexIndexOverflowException na Android Studio 3.0

Gradle generuje ten błąd

Caused by: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536 
    at com.android.dx.merge.DexMerger$8.updateIndex(DexMerger.java:565) 
    at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:276) 
    at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:574) 
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:166) 
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:198) 

co jest naprawdę dziwne, bo ja już multiDex włączona w moim projekcie

Mój projekt build.gradle

defaultConfig { 
      minSdkVersion 16 
      targetSdkVersion 21 
      versionName versionNameFromGitTagVia() 
      versionCode versionCodeFromJenkins() 
      multiDexEnabled true 

      testInstrumentationRunner "app.test.general.InstrumentationRunner" ... 
} 
dependencies { 
    ... 
    androidTestImplementation project(':test-utils') 
    ... 
    implementation 'com.android.support:multidex:1.0.2' 
} 

moja aplikacja Class

public class RiderApplication extends MultiDexApplication implements Application.ActivityLifecycleCallbacks, 
     GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { 
    .... 
} 

AndroidManifest

<application 
    android:name=".RiderApplication" 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:largeHeap="true" 
    android:theme="@style/MyAppTheme" 
    tools:replace="android:theme,android:icon"> 

Usuwanie biblioteki rozwiązuje problem

Wszelkie sugestie?

EDIT Próbowałem to naprawić na kilka sposobów, a ja odkryłem, że to tylko happends kiedy to biblioteki jako

androidTestImplementation 

ale gdy używany jako zwykły

implementation 

Błąd dex znika

Naprawdę dziwnie

EDIT

Zdarza się tylko z Gradle 3.0.1, jeśli wrócę do Gradle 2.3.3 problem ma bardziej

+0

Utwórz klasę "Aplikacja". sprawdź logikę https://stackoverflow.com/a/33430306/3395198 –

+0

Dzięki @IntelliJAmiya ale jak już wspomniałem moja aplikacja obsługuje już multidex – orelzion

+0

ma klasę Application? –

Odpowiedz

0

Cóż, to jest dziwny, ale to działo się wcześniej.

mam natknął this thread, zażyczyć zaproponował ten dodatek:

dexOptions { 
    jumboMode = true 

    // Avoid the OutOfMemoryError: GC overhead limit exceeded: 
    incremental true 
    javaMaxHeapSize "4g" 
} 

ten powinien obsłużyć kwestia liczby strun jest zbyt duża, w przeciwieństwie do wielu metod będących zbyt duża.

Więcej o trybie jumbo vs multidex tutaj: Android: Jumbo Mode vs Multidex

Miłego testowania.

+0

Dziękujemy! Wyglądało to obiecująco, ale niestety to też nie pomogło. Dodałem kilka ustaleń do pierwotnego pytania – orelzion

0

Po wielu godzinach testów w końcu udało mi się uruchomić.

Zmieniłem kilka rzeczy w projekcie, więc nie mogę powiedzieć, co było przyczyną problemu, ale dla większego dobra napiszę tutaj wszystko, co zrobiłem i mam nadzieję, że jeśli ktoś kiedykolwiek napotka przy takim problemie pomoże jej przynajmniej jedno rozwiązanie.

Więc zmieniłem minSdkVersion na 21. Tak, nie było to wymagane w Androidzie 2.3.3, ale najwyraźniej teraz, jeśli zamierzasz używać espresso. Ale nie martw się, twoja aplikacja może nadal obsługiwać starsze wersje, gdy nie są testowane.Aby skonfigurować w ten sposób Dodałem to do mojego build.gradle

def isTest = gradle.startParameter.taskNames.find { it.contains("AndroidTest") } 
     if (isTest != null) { 
      println("is test true") 
      minSdkVersion 21 
     } else { 
      println("is not test") 
      minSdkVersion 16 
     } 

Poza tym, ja zaktualizowanej uzależnienia multiDex od 1.0.1 do 1.0.2 i egzekwowane, że na wszystkich zależności.

Zaktualizowałem także bibliotekę guava do com.google.guava:guava:22.0-android, co doprowadziło do konfliktu zależności, który rozwiązałem, wymuszając inną bibliotekę (wszystkie strategie wymuszenia są zamieszczone poniżej).

Potem miałem konflikt zależności z espresso-web, który również musiałem wymusić.

To moja rozdzielczość strategia w tej chwili

configurations.all { 
     resolutionStrategy { 
      force 'com.android.support:multidex:1.0.2' 
      force 'com.google.guava:guava:22.0-android' 
      force 'com.google.code.findbugs:jsr305:2.0.1' 
      force 'com.android.support.test.espresso:espresso-web:3.0.1' 
     } 
    } 

mam nadzieję, że to pomoże każdemu, dziękuję bardzo za wszystkich ludzi, którzy starali się pomóc, to przyniósł wiele pomysłów, które pomogły mi się udało z ostatecznym rozstrzygnięciem