Android Studio - UNERWARTETE AUSNAHME AUF TOP-LEVEL:

82

Ich habe ein neues Projekt in Android Studio mit den neuen Projektvorlagen erstellt, die als Teil des Tools bereitgestellt werden. Der gesamte Code wurde von Studio generiert. Ich habe noch keine Änderungen vorgenommen.

Ich versuche, den Code auszuführen, aber die App schlägt mit den folgenden Fehlern fehl. Ich bin mir nicht sicher, wo das Problem liegt. Daher wird jede Hilfe geschätzt.

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

 FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Users\RichardKavanagh\AppData\Local\Android\android-sdk\build-tools\19.0.1\dx.bat --dex --output D:\Android\Projects\MyHealthRecord\app\build\libs\app-debug.dex D:\Android\Projects\MyHealthRecord\app\build\classes\debug D:\Android\Projects\MyHealthRecord\app\build\dependency-cache\debug D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\android-support-v7-appcompat-5a78dab7e2789bbe64f4bc80d106ca75c04dcf6f.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\classes-f9b947272e9f33ba50355b52d82755584f9c0c58.jar D:\Android\Projects\MyHealthRecord\app\build\pre-dexed\debug\support-v4-19.0.0-31a2c13df80d37d62ca50fec3bde6da0ca706223.jar
Error Code:
    2
Output:

    UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Landroid/support/v7/app/ActionBar$Callback;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
        at com.android.dx.command.dexer.Main.run(Main.java:230)
        at com.android.dx.command.dexer.Main.main(Main.java:199)
        at com.android.dx.command.Main.main(Main.java:103)



* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 12.948 secs
BENBUN Coder
quelle
Veröffentlichen Sie Ihre build.gradle.
Gabriele Mariotti
Versuchen Sie diese Lösung . Es hat bei mir funktioniert. Ich habe versucht, was pyus13 gesagt hat, aber das hat funktioniert.
Joshua G
Dies kann auch passieren, wenn Sie doppelte Abhängigkeiten in Ihren Bibliotheken haben. Um
Rohan Kandwal
Ich löste das gleiche Problem durch Entfernen der entsprechenden Bibliotheken, weil wir vergessen haben, dass vor neu durch Gradle-Abhängigkeiten hinzugefügt
Tom

Antworten:

117

Wie alle anderen hier gesagt haben, wird die Support-Bibliothek ( com.android.support) mehrmals in Ihr Projekt aufgenommen. Versuchen Sie, dies in Ihrem build.gradleStammverzeichnis hinzuzufügen , damit die Support-Bibliothek nicht über andere Projektabhängigkeiten exportiert wird.

configurations {
    all*.exclude group: 'com.android.support', module: 'support-v4'
}

Wenn in den folgenden Abhängigkeiten mehr als eine Unterstützungsbibliothek enthalten ist, möchten Sie möglicherweise eine davon entfernen:Geben Sie hier die Bildbeschreibung ein

iTapAndroid
quelle
1
Dies ist genau das, was dieses Problem
behoben hat
@iTapAndroid: Ich muss zu welcher build.gradleDatei hinzufügen ? Datei in Moduleoder Project(haben diese Zeile classpath 'com.android.tools.build:gradle:0.9.+')? Bitte sagen Sie mir, ich kann das nicht beheben.
Huy Tower
Sie möchten es in Ihre Modul-Gradle-Datei einfügen. Dies ist die Datei, in der Sie alle Ihre Abhängigkeiten hinzufügen.
iTapAndroid
@iTapAndroid Wenn mein Eclipse-Projekt kein build.gradle hat, was kann ich tun, um dies zu lösen?
Kill Console
4
Das funktioniert bei mir einfach nicht. Ich habe das gleiche Problem. Wenn ich den genannten Code hinzufüge, kann ich android.support.v4.app.ActionBarDrawerToggle nicht importieren.
NathofGod
18

Geben Sie hier die Bildbeschreibung ein

dependencies {
    compile 'com.android.support:support-v4:19.1.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Dies tritt in Konflikt, wenn Sie das Support-JAR in Ihrem libs-Ordner haben. Wenn Sie das Support-JAR in Ihrem Projektbibliotheksordner haben und die Modulabhängigkeit zum Kompilieren von 'com.android.support:support-v4:13.0.+' hinzugefügt wurde, wird die UNEXPECTED_TOPLEVEL_DEPENDANCY-Ausnahme ausgelöst. widersprüchliche Ordnerstruktur und build.gradle

varunarl
quelle
Toller Beitrag, danke. Was es für mich getan hat, war der compile fileTree(dir: 'libs', include: ['*.jar'])Teil in Ihrem Screenshot. Alle einzelnen Abhängigkeiten auskommentiert und eingesteckt und mein Problem behoben.
user1003916
9

Weil Sie möglicherweise zwei gleiche Bibliotheken in Ihr Projekt aufnehmen. Überprüfen Sie Ihre build.gradle-Datei.

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile files('libs/android-support-v4.jar') 
 }

Wenn Ihre Datei compile 'com.android.support:appcompat-v7:+'und enthält, compile files('libs/android-support-v4.jar')treten diese Probleme auf. lösche diesen Satz: kompiliere Dateien ('libs / android-support-v4.jar')

So behebe ich dieses Problem.

Buptcoder
quelle
8

Der Fehler tritt auf, wenn Sie dieselbe Bibliothek / dasselbe Verzeichnis mehrmals in den Abhängigkeiten Ihres build.gradle enthalten haben. Angenommen, Sie haben eine App-Struktur, die folgendermaßen aussieht:

Geben Sie hier die Bildbeschreibung ein

Sie haben also die Haupt-App und dann eine Reihe von Unter-Apps / Modulen / Bibliotheken. Die Bibliotheken sind: 1) gene_test_library, 2) gene_nine_old_androids_library, & 3) swipe_list_view_library.

Mein Name ist Gene, deshalb gibt es all diese "Gen" -Bibliotheken.

In der build.gradle für "App" habe ich:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:21.0.0'

    compile project(':libraries:gene_test_library')
    //compile project(':libraries:genes_nine_old_androids_library')
    compile project(':libraries:swipe_list_view_library')
}

In der build.gradle für gene_test_library habe ich nichts:

dependencies {
}

In build.gradle für gene_nine_old_androids_library habe ich:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
}

In build.gradle für swipe_list_view_library habe ich:

dependencies {
    compile 'com.nineoldandroids:library:2.4.0+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.0'
}

Diese Codezeile "compile fileTree (dir: 'libs', include: ['* .jar'])" bedeutet nur "hey, suchen Sie im Ordner 'libs' in diesem Modul nach JAR-Dateien. Ich habe nichts im libs-Ordner eines der Module, so dass Sie diese Codezeile ignorieren können.

Nehmen wir also an, ich kommentiere das // Kompilierungsprojekt aus (': Bibliotheken: Gene_nine_old_androids_library') im build.gradle für das Modul "App". Dann würde ich den Fehler "UNEXPECTED TOP-LEVEL EXCEPTION:" erhalten. Warum ist das so?

Geben Sie hier die Bildbeschreibung ein

Das Schreiben eines // Kompilierungsprojekts (': Bibliotheken: Gene_nine_old_androids_library') in das build.gradle für "App" entspricht dem Erstellen der Build-Abhängigkeiten des Moduls "Genes_nine_old_androids_library". Wenn Sie also die Anweisung // compile project (': library: genet_nine_old_androids_library') auskommentieren, wird das Modul build.gradle für "app" zu:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:21.0.0'

    compile project(':libraries:gene_test_library')
    ***compile fileTree(dir: 'libs', include: ['*.jar'])***
    ***compile 'com.android.support:appcompat-v7:21.0.0'***
    compile project(':libraries:swipe_list_view_library')
}

Beachten Sie, wie jetzt "compile 'com.android.support:appcompat-v7:21.0.0'" 2x angezeigt wird. Von dort kommt der Fehler.

Gen
quelle
3
"Der Fehler tritt auf, wenn Sie dieselbe Bibliothek / dasselbe Verzeichnis mehr als einmal enthalten haben." Das hat mir den Tag gerettet.
Subin Sebastian
@Gene in appdir compile project(':libraries:swipe_list_view_library')und swipe_list_view_library enthalten auch appcompat-v7. Am Ende haben Sie also 2 appcompat-v7 kompiliert app. Warum wirft dieser nicht einen Fehler?
Azizbekian
Ähm ... Ich habe das vor Jahren geschrieben ... Ich denke, der Fehler, den es auslöst, ist UNERWARTETE AUSNAHME AUF TOP-LEVEL.
Gene
5

Ich habe 2 Gründe für dieses Problem gefunden:

  1. Manchmal liegt es an mehreren enthaltenen Bibliotheken. Zum Beispiel fügen Sie hinzu

    kompiliere 'com.nineoldandroids: library: 2.4.0'

in Ihrem Gradle und fügen Sie eine weitere Bibliothek hinzu, die auch "Nineoldandroids" in ihrem Gradle verwendet!

  1. Wie die offizielle Website des Android-Entwicklers sagte:

Wenn Sie eine Android-App erstellt und diesen Fehler erhalten haben, dann herzlichen Glückwunsch, Sie haben viel Code!

Warum also?

Die Dalvik Executable-Spezifikation begrenzt die Gesamtzahl der Methoden, auf die in einer einzelnen DEX-Datei verwiesen werden kann, auf 65.536, einschließlich Android-Framework-Methoden, Bibliotheksmethoden und Methoden in Ihrem eigenen Code. Um diese Grenze zu überschreiten, müssen Sie Ihren App-Erstellungsprozess so konfigurieren, dass mehr als eine DEX-Datei generiert wird, die als Multidex-Konfiguration bezeichnet wird.

Was solltest du dann tun?

  • 65K-Limit vermeiden - wie?

    1. Überprüfen der direkten und transitiven Abhängigkeiten Ihrer App - Stellen Sie sicher, dass alle großen Bibliotheksabhängigkeiten, die Sie in Ihre App aufnehmen, so verwendet werden, dass die Menge an Code, die der Anwendung hinzugefügt wird, überwiegt. Ein übliches Anti-Pattern besteht darin, eine sehr große Bibliothek einzuschließen, da einige Dienstprogrammmethoden nützlich waren. Das Reduzieren Ihrer App-Code-Abhängigkeiten kann Ihnen häufig dabei helfen, das Dex-Referenzlimit zu umgehen.
    2. Nicht verwendeten Code mit ProGuard entfernen - Konfigurieren Sie die ProGuard-Einstellungen für Ihre App, um ProGuard auszuführen, und stellen Sie sicher, dass das Verkleinern für Release-Builds aktiviert ist. Durch Aktivieren der Verkleinerung wird sichergestellt, dass Sie nicht verwendeten Code nicht mit Ihren APKs versenden.
  • Konfigurieren Ihrer App für Multidex mit Gradle - wie? 1.Ändern Sie Ihre Gradle-Build-Konfiguration, um Multidex zu aktivieren.

stellen

multiDexEnabled true

in den Abschnitten defaultConfig, buildType oder productFlavor Ihrer Gradle-Builddatei.

2. Fügen Sie in Ihrem Manifest die MultiDexApplication-Klasse 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>

Hinweis: Wenn Ihre App die Anwendungsklasse erweitert, können Sie die Methode attachBaseContext () überschreiben und MultiDex.install (this) aufrufen, um Multidex zu aktivieren. Weitere Informationen finden Sie in der MultiDexApplication-Referenzdokumentation.


Auch dieser Code kann Ihnen helfen:

dexOptions {
    javaMaxHeapSize "4g"
}

Gib deinen Gradle ein (android {...}).

Hamed Ghadirian
quelle
Was ist der Grund für die Verwendung von javaMaxHeapSize ?
IgorGanapolsky
4

Hallo zusammen, ich hatte das gleiche Problem, das durch eine doppelte Support-Version 4-Datei verursacht wurde, die ich beim Versuch, Parse zu integrieren, aufgenommen hatte. Die zusätzliche Aufnahme aus dem libs-Verzeichnis wurde gelöscht und funktioniert jetzt einwandfrei!

Doug Ray
quelle
Mit dem Maven-Repository musste ich sowohl "compile 'com.android.support:appcompat-v7:23.0.1'" als auch "compile 'com.android.support:support-v4:23.+'" aus dem Abhängigkeitsblock entfernen.
Mahya
3

Dies geschieht, wenn eine Bibliothek zweimal kompiliert wird (dh zweimal hinzugefügt wird). Es kann eine Support-Bibliothek oder eine andere sein, es spielt keine Rolle.
Der häufigste Fall ist, dass Sie eine Kompilierungsanweisung einer Bibliothek hinzugefügt haben, die sich bereits in Ihrem libs/Verzeichnis befindet. Alle *.jarDateien werden automatisch kompiliert. Das Hinzufügen einer Kompilierungsanweisung verursacht daher den Fehler. Das Entfernen dieser Anweisung kann dieses Problem beheben. Wenn dies nicht zutrifft, haben wir bereits einige großartige Antworten.

sahil shekhawat
quelle
3

Dies mag die dümmste Antwort sein, aber das hat bei mir funktioniert:

  • Ich habe alle Bibliotheken in meinem Projekt manuell entfernt und hinzugefügt. (Nacheinander) Und voila, es hat funktioniert.
  • Erstellen -> Projekt neu erstellen

Hinweis: Keine meiner Bibliotheken wurde zweimal kompiliert.

amalBit
quelle
2

Stellen Sie sicher, dass Sie das Support Repository heruntergeladen haben, um die Abhängigkeit der Supportbibliothek in build.gradle zu verwenden.

Geben Sie hier die Bildbeschreibung ein

Wenn diese alle bereits installiert sind, synchronisieren Sie Ihr Projekt einmal mit gradle über die verfügbare Schaltfläche.

Sync-Taste

pyus13
quelle
0

In meinem Fall wurde TOP LEVEL EXCEPTION aufgrund eines speziellen Zeichens im Projektpfad ausgelöst. Schließen Sie einfach das Projekt, ändern Sie "á" in "a" und öffnen Sie das Projekt erneut. Funktioniert!

Eneas Gesing
quelle
0

Plötzlich, ohne größere Änderungen in meinem Projekt, bekam auch ich diesen Fehler.

All das hat bei mir nicht funktioniert, da ich sowohl die Support-Bibliotheken V4 als auch V7 brauchte.

Am Ende, weil das Projekt vor 2 Stunden ohne Probleme kompiliert wurde, habe ich Android Studio einfach angewiesen, das Projekt neu zu erstellen, und der Fehler war verschwunden.

Zvi
quelle
0

Ich hatte ein ähnliches Problem, als ich versuchte, eine signierte apk für meine App zu erstellen.

Seltsamerweise passierte es nur, wenn ich eine Release- Apk erstellen wollte , während bei Debug- Apk alles in Ordnung war.

Als ich mir diesen Thread angesehen habe, habe ich in build.gradle nach Duplikaten der Unterstützungsbibliothek gesucht und alle Duplikate entfernt, aber das war nicht genug.

Ich musste ein sauberes Projekt machen und erst dann habe ich es endlich zum Laufen gebracht.

Moti Bartov
quelle
0

Ich weiß, dass das Problem beantwortet wurde, aber dies konnte erneut passieren und meine Lösung war etwas anders als die, die ich gefunden habe. In meinem Fall bezog sich die Lösung nicht darauf, zwei verschiedene Bibliotheken in mein Projekt aufzunehmen. Siehe Code unten:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Dieser Code gab den Fehler "Unerwartete Ausnahme der obersten Ebene" aus. Ich behebe den Code und nehme die folgenden Änderungen vor:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
Álisson Morais
quelle
Was hat die Java-Version mit DexMerger zu tun ?
IgorGanapolsky
0

Ich habe mein Problem mit dem Hinzufügen dieser in Build Gradle gelöst:

   defaultConfig {
   multiDexEnabled true


 dependencies {
 compile 'com.android.support:multidex:1.0.0'

Eine andere Lösung kann darin bestehen, unnötige Bibliotheken zu entfernen

Bishnu Dudhraj
quelle
Warum haben Sie Multidex aktiviert?
IgorGanapolsky
1
@IgorGanapolsky ist, weil die Probleme wie oben von mehreren enthaltenen Bibliotheken zu lösen. In Android Studio: Die Dalvik Executable-Spezifikation begrenzt die Gesamtzahl der Methoden, auf die in einer einzelnen DEX-Datei verwiesen werden kann, auf 65.536, einschließlich Android-Framework-Methoden, Bibliotheksmethoden und Methoden in Ihrem eigenen Code. Um diese Grenze zu überschreiten, müssen Sie Ihren App-Erstellungsprozess so konfigurieren, dass mehr als eine DEX-Datei generiert wird, die als Multidex-Konfiguration bezeichnet wird.
Bishnu Dudhraj