Android Studio - НЕОЖИДАННОЕ ИСКЛЮЧЕНИЕ НА ВЕРХНЕМ УРОВНЕ:

82

Я создал новый проект в Android Studio, используя новые шаблоны проектов, предоставленные как часть инструмента. Весь код был сгенерирован Studio. Я еще не внес никаких изменений.

Я пытаюсь запустить код, но приложение не работает со следующими ошибками, я не уверен, в чем проблема, поэтому любая помощь приветствуется.

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
источник
Опубликуйте свой build.gradle.
Габриэле Мариотти
Попробуйте это решение , оно сработало для меня, я пробовал то, что сказал pyus13, но это сработало.
Джошуа Дж.
Это может также происходит , когда у вас есть повторяющиеся зависимости в библиотеках, чтобы решить эту см stackoverflow.com/a/30649660/1979347
Рохан Kandwal
Я решил ту же проблему, удалив соответствующие библиотеки, потому что мы забыли, что добавлено перед новыми зависимостями gradle
Tom

Ответы:

117

Как все здесь говорили, библиотека поддержки ( com.android.support) включается в ваш проект более одного раза. Попробуйте добавить это в свой build.gradleна корневом уровне, и это должно исключить экспорт библиотеки поддержки через другие зависимости проекта.

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

Если у вас есть несколько поддерживаемых библиотек, включенных в подобные зависимости, вы можете удалить одну из них:введите описание изображения здесь

iTapAndroid
источник
1
именно это и
решило
@iTapAndroid: в какой build.gradleфайл мне нужно добавить ? файл в Moduleили Project(есть эта строка classpath 'com.android.tools.build:gradle:0.9.+')? Подскажите пожалуйста, я не могу это исправить.
Huy Tower
Вы хотите добавить его в свой файл градиента модуля. Это будет файл, в который вы добавляете все свои зависимости.
iTapAndroid
@iTapAndroid Если в моем проекте eclipse нет build.gradle, что я могу сделать, чтобы решить эту проблему?
Kill Console
4
Это просто не работает для меня, у меня такая же проблема. Когда я добавляю упомянутый код, я не могу импортировать android.support.v4.app.ActionBarDrawerToggle;
NathofGod
18

введите описание изображения здесь

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

Это конфликтует, если у вас есть поддержка jar в папке libs. Если у вас есть поддержка jar в папке libs вашего проекта и у вас есть зависимость модуля, добавленная для компиляции com.android.support:support-v4:13.0.+, будет выброшено исключение UNEXPECTED_TOPLEVEL_DEPENDANCY. конфликтующая структура папок и build.gradle

Варунарл
источник
Отличный пост, спасибо. То, что это сделало для меня, было compile fileTree(dir: 'libs', include: ['*.jar'])частью вашего скриншота. Закомментировал все отдельные зависимости, подключил их и решил мою проблему.
user1003916
9

Потому что вы можете включить в свой проект две одинаковые библиотеки. проверьте свой файл build.gradle.

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

если ваш файл включает компиляцию 'com.android.support:appcompat-v7:+'и compile files('libs/android-support-v4.jar'), у него будут эти проблемы. удалите это предложение: скомпилировать файлы ('libs / android-support-v4.jar')

Вот как я исправляю эту проблему.

кодировщик
источник
8

Ошибка возникает, когда у вас есть одна и та же библиотека / каталог, включенный более одного раза в ваши зависимости build.gradle. Хорошо, допустим, у вас есть структура приложения, которая выглядит так:

введите описание изображения здесь

Итак, у вас есть основное «приложение», а затем у вас есть несколько дополнительных приложений / модулей / библиотек. Это следующие библиотеки: 1) gene_test_library, 2) genes_nine_old_androids_library и 3) swipe_list_view_library.

Меня зовут Джин, поэтому существуют все эти «генные» библиотеки.

Внутри build.gradle для «app» у меня есть:

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

Внутри build.gradle для gene_test_library у меня ничего нет:

dependencies {
}

Внутри build.gradle для gene_nine_old_androids_library у меня есть:

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

Внутри build.gradle для swipe_list_view_library у меня есть:

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

Эта строка кода «compile fileTree (dir: 'libs', include: ['* .jar'])» просто означает «эй, загляните в папку 'libs' внутри этого модуля, чтобы найти любые файлы jar. У меня ничего нет в папке libs ни одного из модулей, поэтому вы можете игнорировать эту строку кода.

Итак, допустим, я раскомментирую // компилируйте проект (': libraries: genes_nine_old_androids_library') в build.gradle для модуля «app». Тогда я получал бы ошибку «НЕОЖИДАННОЕ ИСКЛЮЧЕНИЕ ВЕРХНЕГО УРОВНЯ:». Это почему?

введите описание изображения здесь

Ну, написание // компиляции проекта (': библиотеки: genes_nine_old_androids_library') внутри build.gradle для «app» - это то же самое, что взять зависимости сборки модуля «genes_nine_old_androids_library» и поместить его туда. Итак, раскомментируя оператор // compile project (': libraries: genes_nine_old_androids_library'), build.gradle для модуля «app» становится следующим:

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

Обратите внимание, что теперь «compile 'com.android.support:appcompat-v7:21.0.0'» отображается вдвое. Вот откуда взялась ошибка.

Ген
источник
3
«Ошибка возникает, когда одна и та же библиотека / каталог включается более одного раза». Это спасло мне день.
Субин Себастьян
@Gene, in appyou compile project(':libraries:swipe_list_view_library'), и swipe_list_view_library также включает appcompat-v7. Итак, в итоге у вас скомпилировано 2 appcompat-v7 app. Почему эта одна ошибка не выдает?
azizbekian 01
Гм ... Я написал это много лет назад ... Я думаю, что выдает ошибку НЕОЖИДАННОЕ ИСКЛЮЧЕНИЕ ВЕРХНЕГО УРОВНЯ.
Джин
5

Я нашел 2 причины этой проблемы:

  1. Иногда это из-за нескольких включенных библиотек. Например, вы добавляете

    скомпилировать 'com.nineoldandroids: library: 2.4.0'

в вашем gradle и добавьте еще одну библиотеку, которая также использует "nineoldandroids" в своем gradle!

  1. Как говорится на официальном сайте разработчиков Android :

Если вы создали приложение для Android и получили эту ошибку, поздравляем, у вас много кода!

Итак, почему?

Спецификация исполняемого файла Dalvik ограничивает общее количество методов, на которые можно ссылаться в одном файле DEX, до 65 536, включая методы платформы Android, методы библиотеки и методы в вашем собственном коде. Чтобы преодолеть этот предел, необходимо настроить процесс сборки приложения для создания более одного файла DEX, известного как конфигурация multidex.

Тогда что делать?

  • Как обойти ограничение в 65 КБ ?

    1. Проверьте прямые и транзитивные зависимости вашего приложения - убедитесь, что любая большая библиотека, которую вы включаете в свое приложение, используется способом, который превышает объем кода, добавляемого в приложение. Обычный анти-шаблон - это включение очень большой библиотеки, потому что несколько служебных методов были полезны. Уменьшение зависимостей кода вашего приложения часто может помочь вам избежать ограничения ссылки dex.
    2. Удалите неиспользуемый код с помощью ProGuard - настройте параметры ProGuard для своего приложения для запуска ProGuard и убедитесь, что у вас включено сжатие для сборок выпуска. Включение сжатия гарантирует, что вы не отправите неиспользуемый код вместе с APK.
  • Настройка приложения для работы с Multidex с помощью Gradle - как? 1. Измените конфигурацию сборки Gradle, чтобы включить multidex.

положить

multiDexEnabled true

в разделах defaultConfig, buildType или productFlavor вашего файла сборки Gradle.

2. В своем манифесте добавьте класс MultiDexApplication из библиотеки поддержки multidex в элемент приложения.

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

Примечание. Если ваше приложение использует расширяет класс Application, вы можете переопределить метод attachBaseContext () и вызвать MultiDex.install (this), чтобы включить multidex. Для получения дополнительной информации см. Справочную документацию MultiDexApplication.


Также этот код может помочь вам:

dexOptions {
    javaMaxHeapSize "4g"
}

Добавьте свой gradle (android {...}).

Хамед Гадирян
источник
В чем причина использования javaMaxHeapSize ?
Игорь Ганапольский
4

Привет всем, у меня была та же проблема, которая была вызвана дублированием файла поддержки версии 4, который я включил при попытке интегрировать синтаксический анализ. Удалено лишнее включение из каталога libs, и теперь все работает нормально!

Дуг Рэй
источник
используя репозиторий Maven, мне пришлось удалить как "compile 'com.android.support:appcompat-v7:23.0.1'", так и "compile 'com.android.support:support-v4:23.+'" из блока зависимостей.
Mahya
3

Это происходит, когда библиотека компилируется дважды (т. Е. Добавляется дважды). Это может быть библиотека поддержки или любая другая, неважно.
Как правило, вы добавили оператор компиляции библиотеки, которая уже находится в вашем libs/каталоге. Все *.jarфайлы компилируются автоматически. Таким образом, добавление оператора компиляции вызывает ошибку. Удаление этого утверждения может решить эту проблему. Если это неприменимо, то у нас уже есть отличные ответы.

сахил шехават
источник
3

Это может быть самый глупый ответ, но у меня это сработало:

  • Я удалил и добавил все библиотеки в свой проект вручную (одну за другой) И вуаля, это сработало.
  • Сборка -> Перестроить проект

Примечание: ни одна из моих библиотек не компилировалась дважды.

amalBit
источник
2

Убедитесь, что вы скачали репозиторий поддержки, чтобы использовать зависимость библиотеки поддержки в build.gradle.

введите описание изображения здесь

Если все они уже установлены, синхронизируйте свой проект с gradle один раз, используя доступную кнопку.

кнопка синхронизации

Pyus13
источник
0

В моем случае исключение TOP LEVEL EXCEPTION было выбрано из-за специального символа в пути к проекту. Просто закрыл проект, изменил «á» на «a» и снова открыл проект. Работает!

Энеас Гесинг
источник
0

Внезапно, без каких-либо серьезных изменений в моем проекте, я тоже получил эту ошибку.

Все вышеперечисленное у меня не сработало, так как мне были нужны обе библиотеки поддержки V4 и V7.

В конце, поскольку 2 часа назад проект скомпилировался без проблем, я просто сказал Android Studio ПЕРЕСТРОИТЬ проект, и ошибка исчезла.

Цви
источник
0

У меня была аналогичная проблема, когда я пытался создать подписанный apk для своего приложения.

Странно, это случилось только тогда, когда я хотел собрать релизный apk, а на отладочном apk все работало нормально.

Наконец, просмотрев эту ветку, я проверил наличие дубликатов библиотеки поддержки в build.gradle и удалил все дубликаты, но этого было недостаточно ..

Мне нужно было сделать чистый проект, и только тогда он наконец заработал.

Моти Бартов
источник
0

Я знаю, что проблема была решена, но это могло произойти снова, и мое решение немного отличалось от тех, которые я нашел. В моем случае решение не было связано с включением в мой проект двух разных библиотек. Смотрите код ниже:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

Этот код выдавал ошибку «Неожиданное исключение верхнего уровня». Исправляю код, внося следующие изменения:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
Алиссон Мораис
источник
Какое отношение имеет версия Java к DexMerger ?
Игорь Ганапольский
0

Я решил свою проблему, добавив их в Gradle сборки:

   defaultConfig {
   multiDexEnabled true


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

другим решением может быть удаление ненужных библиотек

Бишну Дудхрадж
источник
Почему вы включили мультидекс?
IgorGanapolsky
1
@IgorGanapolsky - это потому, что для решения подобных проблем с несколькими включенными библиотеками. В студии android: спецификация исполняемого файла Dalvik ограничивает общее количество методов, на которые можно ссылаться в одном файле DEX, до 65 536, включая методы платформы Android, методы библиотеки и методы в вашем собственном коде. Чтобы преодолеть этот предел, необходимо настроить процесс сборки приложения для создания более одного файла DEX, известного как конфигурация multidex.
Бишну Дудхрадж