Android Studio - BEKLENMEYEN ÜST DÜZEY İSTİSNA:


82

Aracın bir parçası olarak sağlanan yeni proje şablonlarını kullanarak Android Studio'da yeni bir proje oluşturdum. Kodun tamamı Studio tarafından oluşturuldu Henüz herhangi bir değişiklik yapmadım.

Kodu çalıştırmaya çalışıyorum, ancak uygulama aşağıdaki hatalarla başarısız oluyor, sorunun ne olduğundan emin değilim, bu yüzden herhangi bir yardım takdir ediliyor.

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

Build.gradle dosyanızı gönderin.
Gabriele Mariotti

Bu Çözümü Deneyin , Benim için çalıştı, pyus13'ün ne dediğini denedim ama bu işe yaradı.
Joshua G

Bu, kitaplıklarınızda yinelenen bağımlılıklar olduğunda da olabilir, sorunu çözmek için bkz. Stackoverflow.com/a/30649660/1979347
Rohan Kandwal

aynı sorunu ilgili kitaplıkları kaldırarak çözdüm, çünkü yeni bağımlılıklarla yeni eklenenleri unutmuştuk
tom

Yanıtlar:


117

Burada herkesin söylediği gibi, destek kitaplığı ( com.android.support) projenize birden fazla kez dahil ediliyor. Bunu build.gradlekök seviyenize eklemeyi deneyin ve destek kitaplığının diğer proje bağımlılıkları yoluyla dışa aktarılmasını engellemelidir.

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

Bunun gibi bağımlılıklarda birden fazla destek kitaplığınız varsa, bunlardan birini kaldırmak isteyebilirsiniz:görüntü açıklamasını buraya girin


1
tam da bu sorunu
çözen buydu

@iTapAndroid: Hangi build.gradledosyaya eklemem gerekiyor ? dosyasında Moduleveya Project(bu satırda var classpath 'com.android.tools.build:gradle:0.9.+'mı) Lütfen söyle bana, bunu düzeltemem.
Huy Tower

Bunu modül gradle dosyanıza eklemek istersiniz. Bu, tüm bağımlılıklarınızı eklediğiniz dosya olacaktır.
iTapAndroid

@iTapAndroid Eclipse projemde build.gradle yoksa bunu çözmek için ne yapabilirim?
Konsolu

4
Bu benim için çalışmıyor, aynı sorunu yaşıyorum. Bahsedilen kodu eklediğimde android.support.v4.app.ActionBarDrawerToggle'ı içe aktaramıyorum;
NathofGod

18

görüntü açıklamasını buraya girin

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

Kitaplıklar klasörünüzde destek kavanozunuz varsa bu durum çelişir. Proje kitaplıkları klasörünüzde destek kavanozunuz varsa ve 'com.android.support:support-v4:13.0.+' derlemek için modül bağımlılığı eklediyseniz, UNEXPECTED_TOPLEVEL_DEPENDANCY istisnası atılacaktır. çakışan klasör yapısı ve build.gradle


Harika gönderi, teşekkürler. Benim için ne yaptı compile fileTree(dir: 'libs', include: ['*.jar']), ekran görüntünüzdeki kısımdı. Tüm bireysel bağımlılıkları yorumladı ve bunu taktım ve sorunumu çözdü.
user1003916

9

Çünkü projenize iki aynı kitap ekleyebilirsiniz. build.gradle dosyanızı kontrol edin.

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

dosyanız derleme içeriyorsa 'com.android.support:appcompat-v7:+'ve compile files('libs/android-support-v4.jar')bu sorunları yaşayacaktır. bu cümleyi sil: dosyaları derle ('libs / android-support-v4.jar')

Bu sorunu bu şekilde çözüyorum.


8

Hata, build.gradle bağımlılıklarınızda aynı kitaplık / dizine birden çok kez sahipseniz oluşur. Tamam, diyelim ki şuna benzeyen bir Uygulama yapınız var:

görüntü açıklamasını buraya girin

Yani ana "uygulamanız" var ve ardından bir sürü alt uygulama / modül / kitaplık var. Kitaplıklar şunlardır: 1) gene_test_library, 2) genes_nine_old_androids_library ve 3) swipe_list_view_library.

Benim adım Gene, bu yüzden tüm bu "gen" kütüphaneleri var.

"Uygulama" için build.gradle içinde şunlar var:

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

Gene_test_library için build.gradle içinde hiçbir şeyim yok:

dependencies {
}

Gene_nine_old_androids_library için build.gradle içinde:

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

Swipe_list_view_library için build.gradle içinde şunlar var:

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

Bu kod satırı "compile fileTree (dir: 'libs', include: ['* .jar'])" sadece "hey, herhangi bir jar dosyası için bu modüldeki 'libs' klasörünün içine bakın. Herhangi bir modülün libs klasöründe hiçbir şey yok, bu yüzden bu kod satırını göz ardı edebilirsiniz.

Öyleyse, "app" modülü için build.gradle'da // derleme projesini (': libraries: genes_nine_old_androids_library') açıkladığımı varsayalım. Sonra "BEKLENMEYEN ÜST DÜZEY İSTİSNA:" hatası alacağım. Neden?

görüntü açıklamasını buraya girin

"App" için build.gradle içinde // derleme projesi (': libraries: genes_nine_old_androids_library') yazmak, "genes_nine_old_androids_library" modülünün yapı bağımlılıklarını alıp oraya koymakla aynıdır. Dolayısıyla, derleme projesi // (': libraries: genes_nine_old_androids_library') ifadesinin yorumunu kaldırarak, "uygulama" modülü için build.gradle şu hale gelir:

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

Şimdi "compile 'com.android.support:appcompat-v7:21.0.0"' ın 2x göründüğüne dikkat edin. Hatanın geldiği yer burasıdır.


3
"Hata, aynı kitaplığı / dizini birden fazla eklediğinizde ortaya çıkar." Bu günümü kurtardı.
Subin Sebastian

@Gene, in appyou compile project(':libraries:swipe_list_view_library')ve swipe_list_view_library ayrıca appcompat-v7'yi de içerir. Böylece, 2 appcompat-v7'nin derlenmiş halini elde edersiniz app. Bu neden hata vermiyor?
azizbekian

Um ... Bunu yıllar önce yazdım ... Sanırım yaptığı hata BEKLENMEYEN ÜST DÜZEY İSTİSNA.
Gene

5

Bu sorun için 2 neden buldum:

  1. Bazen birden çok dahil kitaplıktan kaynaklanır. Örneğin eklersiniz

    'com.nineoldandroids: kitaplık: 2.4.0' derleyin

gradle'ınıza ekleyin ve gradle'ında "nineoldandroids" kullandığı başka bir kitaplık ekleyin!

  1. As Android Geliştirici Resmi internet sitesinde yaptığı açıklamada

Bir Android uygulaması oluşturduysanız ve bu hatayı aldıysanız, tebrikler, çok sayıda kodunuz var!

Peki neden?

Dalvik Yürütülebilir özelliği, Android çerçeve yöntemleri, kitaplık yöntemleri ve kendi kodunuzdaki yöntemler dahil olmak üzere tek bir DEX dosyasında başvurulabilecek toplam yöntem sayısını 65.536 ile sınırlar. Bu sınırı aşmak, uygulama oluşturma sürecinizi multidex yapılandırması olarak bilinen birden fazla DEX dosyası oluşturacak şekilde yapılandırmanızı gerektirir.

O zaman ne yapmalısın?

  • 65K Sınırından Kaçınmak - Nasıl?

    1. Uygulamanızın doğrudan ve geçişli bağımlılıklarını gözden geçirin - Uygulamanıza dahil ettiğiniz tüm büyük kitaplık bağımlılıklarının, uygulamaya eklenen kod miktarından daha ağır basacak şekilde kullanıldığından emin olun. Yaygın bir anti-model, çok büyük bir kitaplık eklemektir çünkü birkaç yardımcı yöntem yararlıydı. Uygulama kodu bağımlılıklarınızı azaltmak, genellikle dex referans sınırından kaçınmanıza yardımcı olabilir.
    2. Kullanılmayan kodu ProGuard ile kaldırın - Uygulamanızın ProGuard'ı çalıştırmak için ProGuard ayarlarını yapılandırın ve sürüm derlemeleri için küçültmeyi etkinleştirdiğinizden emin olun. Küçültmeyi etkinleştirmek, kullanılmayan kodları APK'larınızla birlikte göndermemenizi sağlar.
  • Uygulamanızı Gradle ile Multidex için Yapılandırma - Nasıl? 1. Multidex'i etkinleştirmek için Gradle derleme yapılandırmanızı değiştirin.

koymak

multiDexEnabled true

Gradle derleme dosyanızın defaultConfig, buildType veya productFlavor bölümlerinde.

2. Bildirinizde, MultiDexApplication sınıfını multidex destek kitaplığından uygulama öğesine ekleyin.

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

Not: Uygulamanız Uygulama sınıfını kullanıyorsa, attachBaseContext () yöntemini geçersiz kılabilir ve multidex'i etkinleştirmek için MultiDex.install (bu) öğesini çağırabilirsiniz. Daha fazla bilgi için MultiDexApplication başvuru belgelerine bakın.


Ayrıca bu kod size yardımcı olabilir:

dexOptions {
    javaMaxHeapSize "4g"
}

Gradle'ınızı yerleştirin (android {...}).


JavaMaxHeapSize kullanmanın nedeni nedir ?
IgorGanapolsky

4

Merhabalar, entegre etmeye çalışırken dahil ettiğim yinelenen bir destek sürüm 4 dosyasından kaynaklanan aynı sorunu yaşadım. Ekstra dahil etme libs dizininden silindi ve şimdi sorunsuz çalışıyor!


Maven deposunu kullanarak, bağımlılıklar bloğundan hem "compile" com.android.support:appcompat-v7:23.0.1 "hem de" compile "com.android.support:support-v4:23.+" 'yi kaldırmak zorunda kaldım.
Mahya

3

Bu, bir kitaplık iki kez derlendiğinde (yani iki kez eklendiğinde) olur. Destek kitaplığı veya başka herhangi bir şey olabilir, önemli değil.
Yaygın durum, zaten libs/dizininizde bulunan bir kitaplığın derleme deyimini eklemiş olmanızdır . Tüm *.jardosyalar otomatik olarak derlenir. Bu nedenle, bir derleme ifadesi eklemek hataya neden oluyor. Bu ifadenin kaldırılması bu sorunu çözebilir. Bu geçerli değilse, o zaman zaten bazı harika cevaplarımız var.


3

Bu en aptalca cevap olabilir ama bu benim için çalıştı:

  • Projemdeki tüm kütüphaneleri manuel olarak kaldırdım ve ekledim. (Birbiri ardına) Ve işte işe yaradı.
  • Build -> Rebuild projesi

Not: Hiçbir kütüphanem iki kez derlenmedi.


2

Build.gradle'da destek kitaplığı bağımlılığını kullanmak için Support Repository'yi indirdiğinizden emin olun.

görüntü açıklamasını buraya girin

Bunların hepsi zaten yüklüyse, mevcut düğmeyi kullanarak projenizi gradle ile senkronize edin.

senkronizasyon düğmesi


0

Benim durumumda ÜST SEVİYE İSTİSNASI, proje yolundaki özel bir karakter nedeniyle atıldı. Projeyi henüz kapattım, "á" "a" olarak değiştirildi ve projeyi yeniden açtı. İşler!


0

Birdenbire, projemde büyük bir değişiklik olmadan ben de bu hatayı aldım.

Hem destek kitaplıkları V4 hem de V7'ye ihtiyacım olduğu için yukarıdakilerin hepsi benim için işe yaramadı.

Sonunda, 2 saat önce proje sorunsuz derlendiğinden, Android Studio'ya projeyi YENİDEN YAPILMASINI söyledim ve hata ortadan kalktı.


0

Uygulamam için imzalı bir apk oluşturmaya çalışırken benzer bir sorun yaşadım.

Garip, yalnızca hata ayıklama sırasında bir sürüm apk oluşturmak istediğimde oldu apk'sinde her şey yolunda gitti.

Son olarak, bu iş parçacığına baktığımda, build.gradle'daki destek kitaplığı kopyalarını kontrol ettim ve kopyaları kaldırdım ama bu yeterli değildi ..

Temiz bir proje yapmak zorundaydım ve ancak o zaman sonunda işe koyuldum.


0

Sorunun cevaplandığını biliyorum, ancak bu tekrar olabilir ve benim çözümüm bulduğumlardan biraz farklıydı. Benim durumumda çözüm, projeme iki farklı kitaplık eklemekle ilgili değildi. Aşağıdaki koda bakın:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Bu kod, "Beklenmeyen Üst Düzey İstisna" hatasını veriyordu. Aşağıdaki değişiklikleri yaparak kodu düzeltirim:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Java sürümünün DexMerger ile ne ilgisi var ?
IgorGanapolsky

0

Bunları derleme gradle'a ekleyerek sorunumu çözdüm:

   defaultConfig {
   multiDexEnabled true


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

başka bir çözüm, gereksiz kitaplıkları kaldırmak olabilir


Multidex'i neden etkinleştirdiniz?
IgorGanapolsky

1
@IgorGanapolsky, çoklu dahil kitaplıkların yukarıdaki gibi sorunları çözmek için. Android stüdyosunda: Dalvik Yürütülebilir özelliği, tek bir DEX dosyasında başvurulabilecek toplam yöntem sayısını, Android çerçeve yöntemleri, kitaplık yöntemleri ve kendi kodunuzdaki yöntemler dahil olmak üzere 65.536 ile sınırlar. Bu sınırı aşmak, uygulama oluşturma sürecinizi multidex yapılandırması olarak bilinen birden fazla DEX dosyası oluşturacak şekilde yapılandırmanızı gerektirir.
Bishnu Dudhraj
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.