Android Studio - NIEOCZEKIWANY WYJĄTEK NAJWYŻSZYM POZIOMIE:

82

Zbudowałem nowy projekt w Android Studio przy użyciu nowych szablonów projektów dostarczonych jako część narzędzia. Cały kod został wygenerowany przez Studio Nie wprowadziłem jeszcze żadnych poprawek.

Próbuję uruchomić kod, ale aplikacja kończy się niepowodzeniem z następującymi błędami, nie jestem pewien, na czym polega problem, więc każda pomoc jest mile widziana.

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
źródło
Opublikuj plik build.gradle.
Gabriele Mariotti
Wypróbuj to rozwiązanie , zadziałało dla mnie, próbowałem, co powiedział pyus13, ale zadziałało.
Joshua G
Może się to również zdarzyć, gdy masz zduplikowane zależności w swoich bibliotekach, aby rozwiązać ten problem, zobacz stackoverflow.com/a/30649660/1979347
Rohan Kandwal
rozwiązałem ten sam problem, usuwając odpowiednie biblioteki, ponieważ zapomnieliśmy, że dodano przed nowymi zależnościami przez gradle
tom nobleman

Odpowiedzi:

117

Jak wszyscy mówili tutaj, biblioteka wsparcia ( com.android.support) jest dołączana więcej niż raz do twojego projektu. Spróbuj dodać to na swoim build.gradlepoziomie głównym i powinno to wykluczyć bibliotekę wsparcia przed eksportowaniem przez inne zależności projektu.

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

Jeśli masz więcej niż jedną obsługę bibliotek uwzględnionych w takich zależnościach, możesz chcieć usunąć jedną z nich:wprowadź opis obrazu tutaj

iTapAndroid
źródło
1
właśnie to rozwiązało ten problem
andreimarinescu
@iTapAndroid: muszę dodać do którego build.gradlepliku? plik w Modulelub Project(masz ten wiersz classpath 'com.android.tools.build:gradle:0.9.+')? Proszę powiedz mi, nie mogę tego naprawić.
Huy Tower
Chciałbyś dodać go do pliku ocen modułu. Byłby to plik, do którego dodajesz wszystkie zależności.
iTapAndroid
@iTapAndroid Jeśli mój projekt eclipse nie ma pliku build.gradle, co mogę zrobić, aby rozwiązać ten problem?
Kill Console
4
To po prostu nie działa dla mnie. Mam ten sam problem. Po dodaniu wspomnianego kodu nie mogę zaimportować android.support.v4.app.ActionBarDrawerToggle;
NathofGod,
18

wprowadź opis obrazu tutaj

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

Występuje konflikt, jeśli masz jar wsparcia w folderze libs. Jeśli masz plik wsparcia w folderze libs projektu i zależność modułu została dodana do kompilacji „com.android.support:support-v4:13.0.+”, zostanie zgłoszony wyjątek UNEXPECTED_TOPLEVEL_DEPENDANCY. sprzeczna struktura folderów i build.gradle

varunarl
źródło
Świetny post, dziękuję. To, co mi zrobiło, to compile fileTree(dir: 'libs', include: ['*.jar'])część na twoim zrzucie ekranu. Skomentowałem wszystkie indywidualne zależności i podłączyłem je, a to rozwiązało mój problem.
user1003916
9

Ponieważ możesz dołączyć dwie takie same biblioteki do swojego projektu. sprawdź plik build.gradle.

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

jeśli twój plik zawiera kompilację 'com.android.support:appcompat-v7:+'i compile files('libs/android-support-v4.jar'), będzie miał ten problem. usuń to zdanie: kompiluj pliki ('libs / android-support-v4.jar')

Tak rozwiązuję ten problem.

buptcoder
źródło
8

Ten błąd występuje, gdy ta sama biblioteka / katalog jest uwzględniona więcej niż raz w zależnościach build.gradle. Ok, powiedzmy, że masz strukturę aplikacji, która wygląda następująco:

wprowadź opis obrazu tutaj

Masz więc główną „aplikację”, a następnie kilka podaplikacji / modułów / bibliotek. Biblioteki to: 1) gene_test_library, 2) genes_nine_old_androids_library i 3) swipe_list_view_library.

Nazywam się Gene, dlatego istnieją wszystkie te biblioteki „genów”.

W pliku build.gradle dla „aplikacji” mam:

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')
}

W pliku build.gradle dla gene_test_library nie mam nic:

dependencies {
}

Wewnątrz build.gradle dla gene_nine_old_androids_library mam:

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

Wewnątrz build.gradle dla swipe_list_view_library mam:

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

Ten wiersz kodu „compile fileTree (dir: 'libs', include: ['* .jar'])” oznacza po prostu „hej, zajrzyj do folderu„ libs ”wewnątrz tego modułu, aby znaleźć jakiekolwiek pliki jar. Nie mam nic w folderze libs żadnego z modułów, więc możesz zignorować ten wiersz kodu.

Powiedzmy więc, że odkomentuję // kompiluję projekt (': libraries: genes_nine_old_androids_library') W build.gradle dla modułu „app”. Wtedy otrzymywałbym błąd „NIEOCZEKIWANY WYJĄTEK NAJWYŻSZEGO POZIOMU:”. Dlaczego?

wprowadź opis obrazu tutaj

Cóż, napisanie // kompilacji projektu (': libraries: genes_nine_old_androids_library') wewnątrz build.gradle dla „app” jest tym samym, co pobranie i umieszczenie w nim zależności budowania modułu „genes_nine_old_androids_library”. Po odkomentowaniu instrukcji // compile project (': libraries: genes_nine_old_androids_library') polecenie build.gradle dla modułu „app” staje się:

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')
}

Zauważ, że teraz „kompiluj” com.android.support:appcompat-v7:21.0.0 ”pojawia się 2x. Stąd pochodzi błąd.

Gen
źródło
3
„Błąd występuje, gdy ta sama biblioteka / katalog jest dołączona więcej niż raz”. To uratowało mi dzień.
Subin Sebastian
@Gene, in appyou compile project(':libraries:swipe_list_view_library'), i swipe_list_view_library zawiera również appcompat-v7. W efekcie masz wkompilowane 2 appcompat-v7 app. Dlaczego ten jeden nie zgłasza błędu?
azizbekian
Um ... Napisałem to lata temu ... Myślę, że błąd, który rzuca, to NIEOCZEKIWANY WYJĄTEK NAJWYŻSZEGO POZIOMU.
Gene
5

Znalazłem 2 przyczyny tego problemu:

  1. Czasami jest to spowodowane wieloma dołączonymi bibliotekami. Na przykład dodajesz

    kompiluj „com.nineoldandroids: library: 2.4.0”

w swoim gradle i dodaj kolejną bibliotekę, która również używa „dziewięć starychandroidów” w swojej gradle!

  1. Jak podała oficjalna witryna programisty Androida :

Jeśli zbudowałeś aplikację na Androida i otrzymałeś ten błąd, to gratulacje, masz dużo kodu!

Więc dlaczego?

Specyfikacja Dalvik Executable ogranicza całkowitą liczbę metod, do których można odwoływać się w pojedynczym pliku DEX do 65 536, w tym metody platformy Android, metody biblioteczne i metody we własnym kodzie. Przekroczenie tego limitu wymaga skonfigurowania procesu kompilacji aplikacji w celu wygenerowania więcej niż jednego pliku DEX, znanego jako konfiguracja wieluidex.

Więc co powinieneś zrobić?

  • Unikanie 65K Limit - W jaki sposób?

    1. Przejrzyj zależności bezpośrednie i przechodnie aplikacji - upewnij się, że każda duża zależność biblioteki dołączona do aplikacji jest używana w sposób, który przeważa nad ilością kodu dodawanego do aplikacji. Typowym anty-wzorcem jest dołączanie bardzo dużej biblioteki, ponieważ użytecznych było kilka metod. Zmniejszenie zależności kodu aplikacji może często pomóc w uniknięciu limitu odwołań dex.
    2. Usuń nieużywany kod za pomocą ProGuard - Skonfiguruj ustawienia ProGuard dla swojej aplikacji, aby uruchomić ProGuard i upewnij się, że włączono zmniejszanie dla kompilacji wydań. Włączenie zmniejszania gwarantuje, że nie będziesz wysyłać nieużywanego kodu razem z pakietami APK.
  • Jak skonfigurować aplikację dla Multidex w Gradle ? 1. Zmień konfigurację kompilacji Gradle, aby włączyć multidex.

położyć

multiDexEnabled true

w sekcjach defaultConfig, buildType lub productFlavor pliku kompilacji Gradle.

2. W swoim manifeście dodaj klasę MultiDexApplication z biblioteki obsługującej multidex do elementu aplikacji.

<?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>

Uwaga: Jeśli Twoja aplikacja korzysta z rozszerzeń klasy Application, możesz zastąpić metodę attachBaseContext () i wywołać funkcję MultiDex.install (this), aby włączyć multidex. Więcej informacji można znaleźć w dokumentacji referencyjnej MultiDexApplication.


Również ten kod może ci pomóc:

dexOptions {
    javaMaxHeapSize "4g"
}

Umieść swoją gradle (android {...}).

Hamed Ghadirian
źródło
Jaki jest powód używania javaMaxHeapSize ?
IgorGanapolsky
4

Cześć wszystkim, miałem ten sam problem, który był spowodowany przez zduplikowany plik wsparcia w wersji 4, który dołączyłem, próbując zintegrować parsowanie. Usunięto dodatkowe włączenie z katalogu libs i teraz działa dobrze!

Doug Ray
źródło
używając repozytorium Maven musiałem usunąć zarówno „compile” com.android.support:appcompat-v7:23.0.1 ”, jak i„ compile ”com.android.support:support-v4:23.+” z bloku zależności.
Mahya
3

Dzieje się tak, gdy biblioteka jest kompilowana dwukrotnie (tj. Jest dodawana dwukrotnie). Może to być biblioteka pomocnicza lub inna, nie ma to znaczenia.
Typowym przypadkiem jest dodanie instrukcji kompilacji biblioteki, która jest już w Twoim libs/katalogu. Wszystkie *.jarpliki są kompilowane automatycznie. Zatem dodanie instrukcji kompilacji powoduje błąd. Usunięcie tego oświadczenia może rozwiązać ten problem. Jeśli to nie dotyczy, mamy już kilka niesamowitych odpowiedzi.

sahil shekhawat
źródło
3

To może być najgłupsza odpowiedź, ale to zadziałało:

  • Usunąłem i dodałem wszystkie biblioteki z mojego projektu ręcznie. (Jedna po drugiej) I voila, zadziałało.
  • Kompiluj -> Przebuduj projekt

Uwaga: żadna moja biblioteka nie została skompilowana dwukrotnie.

amalBit
źródło
2

Upewnij się, że pobrałeś repozytorium pomocy technicznej, aby użyć zależności biblioteki wsparcia w pliku build.gradle.

wprowadź opis obrazu tutaj

Jeśli te wszystkie są już zainstalowane, zsynchronizuj swój projekt z Gradle, używając dostępnego przycisku.

przycisk synchronizacji

pyus13
źródło
0

W moim przypadku WYJĄTEK TOP LEVEL został rzucony z powodu specjalnego znaku na ścieżce projektu. Po prostu zamknąłem projekt, zmieniono „á” na „a” i ponownie otworzyłem projekt. Pracuje!

Eneas Gesing
źródło
0

Nagle, bez większych zmian w moim projekcie, również dostałem ten błąd.

Wszystkie powyższe nie działały dla mnie, ponieważ potrzebowałem zarówno obsługi bibliotek V4, jak i V7.

Na koniec, ponieważ 2 godziny temu projekt skompilował się bez problemów, po prostu kazałem Android Studio ODBUDOWAĆ projekt i błąd zniknął.

Zvi
źródło
0

Miałem podobny problem, gdy próbowałem zbudować podpisany apk dla mojej aplikacji.

Dziwne, stało się to tylko wtedy, gdy chciałem zbudować apk wydania , podczas gdy w apk debugowania wszystko działało OK.

Wreszcie, patrząc na ten wątek, sprawdziłem, czy w build.gradle nie ma obsługi duplikatów bibliotek i usunąłem wszelkie duplikaty, ale to nie wystarczyło.

Musiałem zrobić czysty projekt i dopiero wtedy wreszcie udało mi się go uruchomić.

Moti Bartov
źródło
0

Wiem, że problem został rozwiązany, ale może się to powtórzyć, a moje rozwiązanie było trochę inne niż te, które znalazłem. W moim przypadku rozwiązanie nie było związane z włączeniem dwóch różnych bibliotek do mojego projektu. Zobacz kod poniżej:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Ten kod generował ten błąd „Nieoczekiwany wyjątek najwyższego poziomu”. Naprawiam kod wprowadzając następujące zmiany:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
Álisson Morais
źródło
Co wersja Java ma wspólnego z DexMerger ?
Igor Ganapolsky
0

Rozwiązałem problem dodając te w build gradle:

   defaultConfig {
   multiDexEnabled true


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

innym rozwiązaniem może być usunięcie niepotrzebnych bibliotek

Bishnu Dudhraj
źródło
Dlaczego włączyłeś multidex?
Igor Ganapolsky
1
@IgorGanapolsky, ponieważ rozwiązuje problemy, takie jak powyżej, dotyczące wielu dołączonych bibliotek. W Android Studio: specyfikacja Dalvik Executable ogranicza całkowitą liczbę metod, do których można się odwołać w pojedynczym pliku DEX do 65 536, w tym metody platformy Android, metody biblioteczne i metody w Twoim własnym kodzie. Przekroczenie tego limitu wymaga skonfigurowania procesu kompilacji aplikacji w celu wygenerowania więcej niż jednego pliku DEX, znanego jako konfiguracja multidex.
Bishnu Dudhraj