Android Studio - НЕОПРЕДЕЛЕННЫЙ ТОП-УРОВЕННЫЙ ИСКЛЮЧИТЕЛЬ:

Я создал новый проект в 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

Ответ 1

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

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

Если в зависимостях, подобных этому, имеется более одной поддержки libs, вы можете удалить одну из них: enter image description here

Ответ 2

enter image description here

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

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

Ответ 3

Потому что вы можете включить в свой проект две одинаковые библиотеки. проверьте файл 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')

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

Ответ 4

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

enter image description here

Итак, у вас есть основное "приложение", а затем у вас есть куча суб-приложений/модулей/библиотек. Библиотеки: 1) gene_test_library, 2) genes_nine_old_androids_library и 3) swipe_list_view_library.

Меня зовут Gene, поэтому поэтому есть все эти "генные" библиотеки.

Внутри 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". Затем я получу ошибку "НЕОПРЕДЕЛЕННЫЙ ТОП-УРОВЕНЬ: ИСКЛЮЧЕНИЕ:". Почему это?

enter image description here

Ну, записывая//компилируемый проект (': libraries: 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')
}

Обратите внимание, как теперь "компилировать" com.android.support:appcompat-v7:21.0.0 "отображается 2x. Вот откуда исходит ошибка.

Ответ 5

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

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

    compile 'com.nineoldandroids: library: 2.4.0'

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

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

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

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

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

Тогда что вы должны делать?

  • Избегайте предела 65K - как?

    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"
}

Поместите в свою граду (андроид {...}).

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

Примечание. Моя библиотека не была скомпилирована дважды.

Ответ 9

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

enter image description here

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

sync button

Ответ 10

В моем случае ТОП-УРОВЕНЬ ИСКЛЮЧЕНИЯ выбрано из-за специального char в пути к проекту. Просто закрыл проект, изменил "á" на "a" и возобновил проект. Работает!

Ответ 11

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

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

В конце, потому что 2 часа назад проект скомпилирован без проблем, я просто сказал Android Studio, чтобы выполнить проект REBUILD, и ошибка исчезла.

Ответ 12

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

Странно, это произошло только тогда, когда я хотел создать release apk, а в debug apk все работало нормально.

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

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

Ответ 13

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}

Ответ 14

Я решил проблему с добавлением в build gradle:

   defaultConfig {
   multiDexEnabled true


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

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