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

Ви хочете додати його у файл модуля gradle. Це буде файл, до якого ви додаєте всі свої залежності.
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'])
}

Це стає конфліктним, якщо у вас є папка підтримки у вашій папці 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”. Тоді я отримаю помилку "НЕОЧІКОВАНЕ ВИКЛИЧЕННЯ НА ВЕРХНІМ РІВНІ:". Чому так?

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

Що ж, написання проекту // компіляції (': libraries: genes_nine_old_androids_library') всередині build.gradle для "app" - це те саме, що взяти залежності збірки модуля "genes_nine_old_androids_library" і помістити його туди. Отже, коментуючи заяву про проект // compile (': libraries: genes_nine_old_androids_library'), модуль build.gradle для додатка стає:

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'” відображається удвічі. Ось звідки і помилка.


3
"Помилка виникає, коли одна і та ж бібліотека / каталог включені більше одного разу." Це врятувало мій день.
Субін Себастьян

@Gene, in appyou compile project(':libraries:swipe_list_view_library'), і swipe_list_view_library також включає appcompat-v7. Отже, у вас вийде 2 appcompat-v7, скомпільований app. Чому ця помилка не кидає?
azizbekian

Гм ... Я писав це кілька років тому ... Я думаю, що помилка, яку він видає, - НЕОЧІКУВАНЕ ВИКЛЮЧЕННЯ НА ВЕРХНІМ РІВНІ.
Gene

5

Я знайшов 2 причини цієї проблеми:

  1. Іноді це через безліч включених бібліотек. Наприклад, ви додаєте

    компілювати 'com.nineoldandroids: бібліотека: 2.4.0'

у вашій gradle та додайте ще одну бібліотеку, яка також використовує "nineoldandroids" у своїй gradle!

  1. Як зазначено на офіційному веб-сайті розробника Android :

Якщо ви створили додаток для Android і отримали цю помилку, то вітаємо, у вас багато коду!

Так чому?

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

Тоді що робити?

  • Як уникнути обмеження 65K - як?

    1. Перегляньте прямі та перехідні залежності вашого додатка - переконайтеся, що будь-яка велика бібліотечна залежність, яку ви включаєте у свою програму, використовується таким чином, щоб вона перевищувала кількість коду, доданого до програми. Поширеним анти-шаблоном є включення дуже великої бібліотеки, оскільки кілька корисних методів були корисними. Зменшення залежностей коду програми часто може допомогти вам уникнути обмежень на посилання dex.
    2. Видаліть невикористаний код за допомогою ProGuard - Налаштуйте параметри ProGuard для своєї програми для запуску ProGuard і переконайтеся, що у вас увімкнено скорочення для збірок випусків. Увімкнення скорочення гарантує, що ви не будете доставляти невикористаний код разом із файлами .apk.
  • Налаштування програми для Multidex за допомогою Gradle - Як? 1. Змініть конфігурацію збірки Gradle, щоб увімкнути мультидекс.

поставити

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 (андроїд {...}).


Яка причина використовувати 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

У моєму випадку ВИКЛЮЧЕННЯ ВЕРХНЬОГО РІВНЯ було скинуто через спеціальний символ у шляху проекту. Просто закрив проект, змінив "á" на "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

Я вирішив свою проблему, додавши їх у build gradle:

   defaultConfig {
   multiDexEnabled true


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

іншим рішенням може бути видалення непотрібних бібліотек


Чому ви увімкнули мультидекс?
Ігор Ганапольський

1
@IgorGanapolsky це тому, що для вирішення таких проблем, як вище, з кількома включеними бібліотеками. В андроїд-студії: специфікація Dalvik Executable обмежує загальну кількість методів, на які можна посилатися в одному файлі DEX, до 65 536, включаючи методи фреймворку Android, методи бібліотеки та методи у власному коді. Щоб подолати цю межу, потрібно налаштувати процес збірки додатків, щоб генерувати більше одного файлу DEX, відомого як конфігурація багатовимірного коду.
Bishnu Dudhraj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.