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

Опубликуйте свой 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'
}

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


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

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

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

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


2

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

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

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

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


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.
Бишну Дудхрадж
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.