DexIndexOverflowException-Problem nach dem Update auf die neueste Appcompat- und Support-Bibliothek

73

Ich verwende die folgenden Einstellungen durch gradle:

compileSdkVersion 21
ANDROID_BUILD_MIN_SDK_VERSION=14
ANDROID_BUILD_TARGET_SDK_VERSION=21
ANDROID_BUILD_TOOLS_VERSION=21.0.2
ANDROID_BUILD_SDK_VERSION=21

Ich habe auch die folgenden Einstellungen in meiner Gradle-Datei:

compile 'com.android.support:support-annotations:21.0.0'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.android.support:support-v4:21.0.0'

Ich bekomme immer den Fehler UNEXPECTED TOP LEVEL EXCEPTION.
Aber wenn ich das mache 21.0.0, 20.0.0funktioniert es gut ... aber ich kann auf keine der Android API 21-Optionen zugreifen. Gibt es etwas, was ich hier falsch mache? Wie kann ich es ohne diese Ausnahme kompilieren? Ich habe die Support-Gläser nirgendwo anders als in anderen Klassenprojekten (Facebook usw.).

Hier ist die vollständige Stapelverfolgung:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
    at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:502)
    at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:283)
    at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:491)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:168)
    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)
KVISH
quelle
Haben Sie alle Bibliotheken und Tools von SDK Manager heruntergeladen?
Gabriele Mariotti
Ja, ich aktualisiere einfach meine App von API 19 auf 21. Alle Bibliotheken aus der vorherigen Version und alle neuen Bibliotheken für 21.
KVISH
Duplicate stackoverflow.com/q/15209831
Alex Lipov

Antworten:

148

Diese Meldung klingt so, als wäre Ihr Projekt zu groß.

Sie haben zu viele Methoden. Es kann nur 65536 Methoden für Dex geben .

Seit dem Gradle-Plugin 0.14.0 und den Build Tools 21.1.0 können Sie die Multidex-Unterstützung verwenden .

Fügen Sie einfach diese Zeilen in das Feld ein build.gradle:

android {

    defaultConfig {
        ...

        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

Fügen Sie außerdem Manifestdie MultiDexApplicationKlasse aus der Multidex-Unterstützungsbibliothek zum Anwendungselement hinzu

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication"> 
        ...
    </application>
</manifest>

Wenn Sie eine eigene ApplicationKlasse verwenden, ändern Sie die übergeordnete Klasse von Applicationin MultiDexApplication.

Gabriele Mariotti
quelle
multi-dexwar der Grund dafür.
KVISH
6
Fügen Sie multiDexEnabled true zur defaultConfig Ihrer build.gradle-Datei hinzu
Elhanan Mishraky
Ich verwende keine Build-Gradle-Datei, um meine App zu erstellen. Wie auch immer, um dieses Problem zu lösen.
Ashokchakravarthi Nagarajan
Interessanterweise hat nur das Hinzufügen der Gradle-Konfiguration für mich funktioniert. War die Manifestkonfiguration optional?
Abhijit Gujar
1
Danke, es war sehr wichtig und hat mir sehr geholfen.
Weverton Peron
45

1) Fügen Sie der Anwendungsdatei build.gradle eine Abhängigkeit hinzu

compile 'com.android.support:multidex:1.0.2'

2) Wenn Sie die Anwendungsklasse nicht überschreiben, bearbeiten Sie Ihre Manifestdatei, um android: name im Tag wie folgt festzulegen:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>

Wenn Sie die Anwendungsklasse überschreiben, ändern Sie sie, um MultiDexApplication (falls möglich) wie folgt zu erweitern:

public class MyApplication extends MultiDexApplication { ... }

Wenn Sie die Anwendungsklasse überschreiben, die Basisklasse jedoch nicht geändert werden kann, können Sie stattdessen die Methode attachBaseContext () überschreiben und MultiDex.install (this) aufrufen, um Multidex zu aktivieren:

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

3) Fügen Sie defaultConfig unter build.gradle Multidex-Unterstützung hinzu

defaultConfig {
        ...
        minSdkVersion 16
        targetSdkVersion 26
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
...
George Hardcore
quelle
Perfekt! @georgehardcore
Benchuk
@georgehardcore: Ich habe den zweiten Punkt in meinem Android Eclipse-Projekt verwendet. Aber es zeigt immer noch den gleichen Fehler.
Nageswara Rao.CH
Versuchen Sie, die Google Play-Services-Bibliothek zu teilen, wenn Sie sie verwenden. Wenn Sie beispielsweise Analytics und gcm verwenden, schließen Sie sie einfach als separate Module mit dem Basismodul an: compile 'com.google.android.gms: play-services-base: 8.1.0' compile 'com.google.android.gms: Play-Dienste-Analytik: 8.1.0' Compile 'com.google.android.gms: Play-Dienste-gcm: 8.1.0'
georgehardcore
@georgehardcore Ich bin mir nicht sicher, ob Schritt 2 erforderlich wäre, da es mir bei meiner Bewerbung nicht geholfen hat. Also überspringe ich es und der Rest der Schritte hat super funktioniert!
Vu Nguyen
Für mich hat es funktioniert, aber ohne die Anwendungsklasse in MultiDexApplication im Manifest oder in der MyApplication-Klasse zu
ändern
3

Bevor Sie mit MultiDex herumspielen

Entweder ist die Lösung zu groß (verwenden Sie MultiDex) oder Sie kompilieren einige nicht benötigte Elemente und fügen sie in Ihr Projekt ein. Ich habe dieses Problem bei meinem kleinen Projekt. Folgendes habe ich getan, um das Problem zu beheben:

Ich habe dies entfernt von build.gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Und ich habe meinen Build-Ordner manuell aus dem Anwendungsstamm entfernt. Problem gelöst.

Andrei
quelle
2

Befolgen Sie diese Anleitung, um das 65K-Limit zu umgehen.

Ich habe dieses Problem in gradle gelöst, multiDexEnabled trueindem ich meine Anwendung mit eingestellt und erweitert habeclass MyApp extends MultiDexApplication

Iñaqui
quelle
0

Ich habe die Kompilierung filetree(include: ['*.jar'], dir: 'libs') in der build.gradleDatei einfach auskommentiert (wie oben vorgeschlagen) und das Projekt neu erstellt. Ohne Fehler kompiliert. Ich musste keine Ordner verschieben.

Earl Allen
quelle
1
Ignorieren Sie meinen Kommentar - nachfolgende Neuerstellungen erzeugten denselben ursprünglichen Fehler, selbst wenn ich den Erstellungsordner manuell löschte.
Earl Allen
0

Stellen Sie zunächst sicher, dass die Minimierung aktiviert ist in app/build.cradle:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.config
    }
    debug {
        signingConfig signingConfigs.config
    }
}

Wenn das Problem dadurch nicht behoben wird , aktivieren Sie den Multidex-Build für Ihre App.

Atomsymbol
quelle
0

Ich hatte dieses Problem, als ich das gesamte Paket der Google Play Services-APIs in meine App kompiliert hatte. Ich habe das Problem mithilfe einer selektiven API gelöst.

Ersetzen Sie beispielsweise die folgende Zeile in Ihrer build.gradle-Datei, um nur die APIs Google Fit und Android Wear einzuschließen:

compile 'com.google.android.gms:play-services:11.0.2'

mit diesen Zeilen:

compile 'com.google.android.gms:play-services-fitness:11.0.2'
compile 'com.google.android.gms:play-services-wearable:11.0.2'

Das Problem wird unter folgendem Link erläutert .

Gaurav Gupta
quelle