Кілька файлів dex визначають Landroid / підтримку / v4 / сервіс доступності / доступністьServiceInfoCompat


212

Якщо я запускаю gradle assembleDebugз командного рядка, я раптом отримую цю помилку:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.util.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionImpl;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:592)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:550)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:531)
    at com.android.dx.merge.DexMerger.mergeDexBuffers(DexMerger.java:168)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:186)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:300)
    at com.android.dx.command.dexer.Main.run(Main.java:232)
    at com.android.dx.command.dexer.Main.main(Main.java:174)
    at com.android.dx.command.Main.main(Main.java:91)

Якщо я прихоплюю за v4, я бачу два файли всередині моєї папки збірки.

Binary file build/pre-dexed/debug/support-v4-19.0.0-2ba5fdd60a6c3836b3104a863fe42897da1fa9d1.jar matches
Binary file build/pre-dexed/debug/support-v4-r7-227d905d79b23b20866531d4f700446c040a2ccb.jar matches

Мій файл gradle включає лише цю бібліотеку підтримки:

compile 'com.android.support:support-v13:19.0.0'

Я наткнувся на те, як бібліотека r7 якось включена. Я бігав, gradle cleanі це завжди з’являється там, коли я повторно збираюDebug.

Якщо я збираюсь за r7 всередині каталогу збирання, я бачу це у файлі:

Binary file build/exploded-bundles/ComGoogleAndroidGmsPlayServices4030.aar/classes.jar matches

Якщо я не включаю v13, то інші речі не збираються.

Але чи не включає v13 бібліотеку підтримки v4?

Це несумісність між пакетом AAR служб ігор та бібліотекою v13?

Я схопив файл gradle з gradleplease.appspot.com.

Видалення ігрових служб це не виправить; така ж помилка.

Мої залежності всередині build.gradle:

 dependencies {


 // Google Play Services
//compile 'com.google.android.gms:play-services:4.0.30'

// Support Libraries
//compile 'com.android.support:support-v4:19.0.0'
///compile 'com.android.support:appcompat-v7:19.0.0'
//compile 'com.android.support:gridlayout-v7:19.0.0'
compile 'com.android.support:support-v13:19.0.0'
compile 'org.eclipse.mylyn.github:org.eclipse.egit.github.core:2.1.5'
compile 'commons-codec:commons-codec:1.9'
compile 'com.madgag:markdownj-core:0.4.1'
compile 'com.wu-man:android-oauth-client:0.0.2'
compile 'com.google.http-client:google-http-client-jackson2:1.17.0-rc'
compile 'org.apache.commons:commons-lang3:3.2'
compile 'com.google.code.gson:gson:2.2.4'
}

1
Я спробував усі рішення, і сталося, що всі вони не спрацювали. Тоді я щойно створив новий проект з такою ж назвою та скопіював усі файли зі старого проекту. І це чудово працює зараз. Сподіваюся, це допомагає.
Sam003

У мене виникла ця проблема з компонентом в support-v13. Після багато налагодження та спроб усіх відповідей безрезультатно, я виявив, що це було введено, коли я спробував інтегрувати kotlin у проект, який був захоплюючим проектом Java. Я видалив стандартну бібліотеку kotlin та інші бібліотеки kotlin, і все було добре. Я б все ще намагався виправити проблему з kotlin, але поки що я повинен працювати. Будь-яка інформація теж допоможе, дуже люблю котлін.
clementiano

Відповіді:


304

Запустіть gradle -q dependencies(або gradle -q :projectName:dependencies), щоб створити звіт про залежність. Ви повинні побачити, звідки r7це походження, наприклад:

compile - Classpath for compiling the main sources.
+--- com.commonsware.cwac:camera-v9:0.5.4
|    +--- com.actionbarsherlock:actionbarsherlock:4.4.0
|    |    \--- com.google.android:support-v4:r7
|    +--- com.commonsware.cwac:camera:0.5.4
|    \--- com.android.support:support-v4:18.0.+ -> 18.0.0
\--- com.android.support:support-v4:18.0.+ -> 18.0.0

Потім використовуйте excludeдирективу, щоб заблокувати цю залежність. У моєму випадку він надходить з моєї бібліотеки CWAC-камер, і тому я використовую:

dependencies {
    compile('com.commonsware.cwac:camera-v9:0.5.4') {
      exclude module: 'support-v4'
    }

    compile 'com.android.support:support-v4:18.0.+'
}

(де друге compileтвердження вказує, яку версію ви насправді хочете)

Це повинно прояснити питання, оскільки ви побачите, чи будете ви знову запускати звіт про залежність:

compile - Classpath for compiling the main sources.
+--- com.commonsware.cwac:camera-v9:0.5.4
|    +--- com.actionbarsherlock:actionbarsherlock:4.4.0
|    \--- com.commonsware.cwac:camera:0.5.4
\--- com.android.support:support-v4:18.0.+ -> 18.0.0

3
Чи існує метод перевірки / виключення модулів із залежностей .jar у Maven? gradle dependenciesЗдається, не повідомляють про залежності, додані зcompile files('libs/example.jar')
грудня

3
Скажімо, у мене є дві libs/*.jarзалежності, що мають спільний модуль, і жодна з них не є артефактом. Будь-який спосіб провести подібну перевірку залежності / виключення класу?
dbro

2
@dbro: Не те, що мені відомо, але, знову ж таки, я не досліджував цей момент. IMHO, без манжети, один або обидва з цих файлів JAR відчуваються неправильно упакованими, оскільки спільний модуль слід враховувати у власний JAR.
CommonsWare

12
./gradlew -q: projectName: На мене працювали залежності
Defuera

15
Швидкий наконечник для тих , хто exlucing модуля з модуля залежності: Ви повинні перетворити compile project(':foo')INTO compile(project(':foo')) { exclude module: 'support-v4' }. Зверніть увагу на дужки.
espinchi

122

Я вирішив подібну помилку, додавши наступний фрагмент коду в моє build.gradle файл всередині андроїда блоку.

android {
    dexOptions {
        preDexLibraries = false
    }
}

4
Працювали для мене! Чи є якісь нижчі сторони робити це так?
Баррі Галіцький

@BarrieGalitzky Я досі не стикався з жодними питаннями
mike.tihonchik

3
Дякую людині, це прекрасно працювало для вирішення питання! У всякому разі, я думаю, що це має деякі побічні ефекти .. Завдання assembleDebug стало в 3 рази повільніше!
Маріно

dexOptions не знайдено.
Олівер Діксон

10
Додавши це, я отримав помилку "Переклад був перерваний". Здогадайтесь, я спробую спробувати метод CommonsWare.
DroidHeaven

36

Оскільки картина варта тисячі слів

Щоб легше і швидше виконати це завдання з початківцями, як я. це скріншоти, на яких показана відповідь, опублікована @ edsappfactory.com, яка працювала на мене:

Спочатку відкрийте подання Gradle праворуч від Androidstudio, у пункті додатка перейдіть, Tasksа Androidпотім натисніть правою кнопкою миші androidDependenciesта виберіть Run:

крок 1

По-друге, ви побачите щось подібне:

Крок 2

Основна причина, яку я розмістив у цьому, що нелегко було знати, де виконати gradleзавдання чи команди, розміщені вище. Тож саме тут і їх виправдати.

Так, для виконання команди gradle:

Перший:

перший

Друге:

другий

Легко, як це є.

Це воно.

Дякую.


33

Також зауважте, що ви можете бачити свої андроїд-залежності, перейшовши на перегляд Android Studio Gradle та вибравши цільове значення "androidDependitions".

Ще одна порада: у мене виникла ця проблема, поки я не видалив вкладку підтримки v4 із папки libs як у проекті, так і у моїх пов'язаних проектах / модулях бібліотеки.


3
Більш конкретна інструкція? Не вдається знайти "андроїдзалежності". Thx
CopperCash

Перейдіть до подання Gradle, потім знайдіть заголовок Усі завдання, розгорніть назви свого додатка, а потім перейдіть на ": app", там ви знайдете "androidDependitions".
AutoM8R

2
Де вигляд Gradle?
Paul Beusterien

4
@PaulBeusterien Якщо ви дивитесь у крайній правий бік вікна, є бічна вкладка з позначкою Gradle. Клацніть його, щоб відкрити закріплене подання. Залежності для androidDependitions - це насправді завдання, що належить до найвищого рівня
JCricket

дякую, чоловіче, я розмістив скріншоти, в яких пояснював свою відповідь, щоб зробити це простіше.
MBH

11

Я почав отримувати цю помилку під час оновлення до ButterKnife 8.5.1. Жодна з інших відповідей тут не працювала на мене.

Я gradle -q :app:dependenciesбачив дерево, а потім переглядав файли jar, поки не знайшов конфлікт. Конфлікт полягав у тому, що залежність від "живіт" com.android.support:support-compat:25.1.0містить версію класу доступності, а com.android.support:support-v4:23.1.1також містить клас.

Я вирішив це, змінивши свою залежність від цього:

compile 'com.jakewharton:butterknife:8.5.1'

до цього:

compile('com.jakewharton:butterknife:8.5.1') {
    exclude module: 'support-compat'
}

Схоже, це поки не впливає на роботу ButterKnife.

Редагувати: Є кращим рішенням, яке було оновити мої бібліотеки підтримки для Android, щоб вони відповідали ButterKnife:

compile('com.android.support:appcompat-v7:25.2.0')
compile('com.android.support:design:25.2.0')
compile 'com.jakewharton:butterknife:8.5.1'

тримати версію підтримки такою ж, як просте рішення, і виключення модуля не працює для мене.
Джей

Я вирішив і з другим рішенням! Той самий конфлікт, але з версією Butter Knife версії 8.8.1 Приклад: реалізація ('com.jakewharton: butterknife: 8.8.1') {виключити модуль: 'support-compat'} annotationProcessor 'com.jakewharton: butterknife-компілятор: 8.8.1'
GFPF

9

Якщо хтось дізнається, що відповідь від CommonsWare не вдалося застосувати до проекту бібліотеки Android, ось фрагмент виправити

компілювати (проект (': yourAndroidLibrary')) {виключити модуль: 'support-v13'}

Ви знайдете проблеми

Знайдено непідтримуваний метод Gradle DSL: 'виключити ()'

якщо ви використовуєте проект компіляції (': yourAndroidLibrary') {виключити модуль: 'support-v13'}

Відмінності - це браслет "(" і ")" перед "проектом" .


Дякую, бракувало подвійних дужок!
Марко

8
exclude module: 'support-v4'

Я не працював би для мене із залежністю від проекту, єдиний спосіб, коли я міг би змусити його працювати, був за допомогою наступного синтаксису:

configurations {
    dependencies {
        compile(project(':Android-SDK')) {
            compile.exclude module: 'support-v4'
        }
    }
}

Де: Android-SDK - назва вашого проекту.


8

У мене була така ж проблема, і здається, що в моєму додатку було занадто багато методів через бібліотеки: http://developer.android.com/tools/building/multidex.html

Вирішили це за допомогою:

android {
   defaultConfig {
   ...
   multiDexEnabled = true
   }
}

Більше тут Помилка: Не вдалося виконати для завдання ': app: dexDebug'. > commamand закінчено з нульовим значенням виходу 2


1
Мультидексінг може зробити швидше запуск вашої програми повільніше, використовуйте її лише в тому випадку, якщо вам це потрібно.
Джеймс Гудвін

6

У мене була така ж помилка, але це було тому, що я нещодавно змінив з використання v4 на v13. Тож все, що я мав зробити, це очистити проект.


1
Якщо відбулася та сама помилка після оновлення intellij, очищення проекту вирішило проблему.
Влад Спріс

5

У мене була така ж помилка у спадковому проекті. Моя вина була в тому, що бібліотека підтримки була включена двічі: Одного разу всередині google-play-service lib, а інший як окремий.

Ось як я це виправив:

BAD build.gradle:

dependencies {
   compile files('libs/android-support-v4.jar') 
   compile files('libs/core-2.2.jar')
   compile files('libs/universal-image-loader-1.8.5-with-sources.jar')
   compile 'com.google.android.gms:play-services:3.2.65'
}

ДОБРЕ build.gradle:

dependencies {
   // compile files('libs/android-support-v4.jar')  // not needed 
   compile files('libs/core-2.2.jar')
   compile files('libs/universal-image-loader-1.8.5-with-sources.jar')
   compile 'com.google.android.gms:play-services:3.2.65'
}

Сподіваюся, що це комусь допоможе :-)


3

Я використовую com.google.android.gms:play-services-analytics:8.3.0і android-support-v13.jarне можу дістатись exclude module: 'support-v4'до роботи.

Для мене працювало android-support-v13артефакт, а не android-support-v13.jarфайл.

Тобто замість

dependencies {
compile ('com.google.android.gms:play-services-analytics:8.3.0')
compile files('libs/android-support-v13.jar')

}

я використав

dependencies {
compile ('com.google.android.gms:play-services-analytics:8.3.0')
compile ('com.google.android:android-support-v13')

}


3

У моєму випадку проблема була викликана невідповідністю версії :

Build tools 25
compileSdk 24
targetSdk 24
Support library 24

Рішення було простим: зробити все версією 25


3

Аналогічно Dex питання вирішене метод

gradle.build містив:

compile files('libs/httpclient-4.2.1.jar')
compile 'org.apache.httpcomponents:httpclient:4.5'
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'

Проблему було вирішено, коли мене видалили

compile files('libs/httpclient-4.2.1.jar') 

Зараз мій градул виглядає так:

apply plugin: 'com.android.application'

android {

compileSdkVersion 24
buildToolsVersion "24.0.3"

defaultConfig {
    applicationId "com.mmm.ll"
    minSdkVersion 16
    targetSdkVersion 24
    useLibrary  'org.apache.http.legacy'
}

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
}

dependencies {

compile 'com.google.android.gms:play-services:6.1.+'
compile files('libs/PayPalAndroidSDK.jar')
compile files('libs/ksoap2-android-assembly-3.0.0-RC.4-jar-with-dependencies.jar')
compile files('libs/picasso-2.1.1.jar')
compile files('libs/gcm.jar')
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

Було надмірність у файлі JAR та у складеному проекті gradle

Тож гостро шукайте залежність та jar файли, що мають однакові класи.

І зніміть надмірність.
Це працювало для мене.


2

Якщо ви імпортували ваш проект із Eclipse .

1. The select project 
2. Go to File -> **Project Structure**
3. Select app in **module** section on left hand panel
4. Select **Dependency** tab
5. Your able to see jars you have added in eclipse project for v4 and v13.
6. Remove that jar by clicking on minus sign at bottom after selection
7. Click on Plus sign select **Library Dependency** 
8. Choose V4 and V13 if added
9. Press Ok and Clean and Rebuild your project

Сценарій, з яким я стикався після імпорту проекту Eclipse в студію Android.

Сподіваюся, це допомагає ..


2

Це дратівлива проблема, яка може зайняти деякий час, щоб з'ясувати кореневу справу. Як ви повинні продовжити, це відповідь @CommonsWare.

Нещодавно я зіткнувся з цією проблемою і мені було важко її вирішити.

Моєю проблемою було те, що я включав бібліотеку за версією "+" у build.gradle. Остання версія бібліотеки містила один із старих dex і bang.

Я повернувся до старшої версії бібліотеки і вирішив її.

Добре запустити свої AndroidDependpendes і подивитися, що насправді відбувається. Його також добре шукати у папці збірки.

Перш за все, Android Studio 2.2 забезпечує вбудовані функції для відстеження цієї проблеми.

Щасливі хлопці з кодування


2

В Android Studio перейдіть до свого build.gradle (перевірте як проект, так і модулі build.gradle файлів) та знайдіть дублюючі залежності.

Видаліть ті, які ваш проект не потребує.


2

Видалення всіх файлів із кешу Gradle виправило мою проблему.

в Linux:

rm -rf ~/.gradle/caches/*

1

Я видалив компіляцію 'com.android.support:support-v4:18.0.+' у залежності, і вона працює


2
це має бути коментар, інакше ви повинні пояснити це кращим чином.
Аніруд Шарма

1

Мені вдалося вирішити проблему у своєму реальному проекті, просто додавши

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

наприкінці мого файлу android \ app \ build.gradle


0

Нарешті, я вирішив це, модифікуючи ці атрибути у файлі Gradle модуля

  1. compileSdkVersion 25
  2. targetSdkVersion 25
  3. компілювати 'com.android.support:appcompat-v7:+'
  4. компілювати 'com.android.support:recyclerview-v7:+'

0

У мене була така ж проблема, коли я додав react-native-paletteдо свого проекту, ось моє дерево залежностей:

./gradlew app:dependencies
+--- project :react-native-palette
|    +--- com.facebook.react:react-native:0.20.+ -> 0.44.2
|    |    +--- javax.inject:javax.inject:1
|    |    +--- com.android.support:appcompat-v7:23.0.1
|    |    |    \--- com.android.support:support-v4:23.0.1
|    |    |         \--- com.android.support:support-annotations:23.0.1 -> 24.2.1
...
|    \--- com.android.support:palette-v7:24.+ -> 24.2.1
|         +--- com.android.support:support-compat:24.2.1
|         |    \--- com.android.support:support-annotations:24.2.1
|         \--- com.android.support:support-core-utils:24.2.1
|              \--- com.android.support:support-compat:24.2.1 (*)
+--- com.android.support:appcompat-v7:23.0.1 (*)
\--- com.facebook.react:react-native:+ -> 0.44.2 (*)

Я спробував багато солютонів і не зміг його виправити, поки не змінив com.android.support:appcompatверсію android/app/build.gradle, я хочу, щоб це допомогло:

dependencies {
    compile project(':react-native-palette')
    compile project(':react-native-image-picker')
    compile project(':react-native-camera')
    compile fileTree(dir: "libs", include: ["*.jar"])
    // compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.android.support:appcompat-v7:24.2.1"
    compile "com.facebook.react:react-native:+"
}

здається, що кілька записів не є великою проблемою, невідповідність версій є


0

Зрозуміло, що це працює для compile file('...')конфлікту, збільшивши minSdkVersion до 21 та включивши мультидекс. Не впевнений, чи найкраще це рішення, але єдиний спосіб, коли я міг би працювати в цьому випадку.

Примітка: оскільки, compile file('...')здається, ви не можете поставити excludeпункт, щоб ця опція була недоступною.


0

У мене була така ж проблема, і моє рішення - це зміна версії підтримки '27. + '(27.1.0) на '27 .0.1'


0

У мене була така ж проблема. У своєму проекті у мене були такі залежності:

  • appcompat-v7
  • android-support-v13

З застарілих прикладів додаток отримано з репо Google Maven, тоді як Android-підтримка була локальним .jar.

Коли я зрозумів це і замінив цю локальну посилання на Maven, це просто вирішило мою проблему збірки.

Ось відмінність мого додатка / build.gradle:

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



0

Отримала таку помилку

Не вдалося виконати завдання ": app: transformDexArchiveWithDexMergerForDebug".

com.android.build.api.transform.TransformException: com.android.dex.DexException: Кілька файлів dex визначають Landroid / support / constraint / ConstraintSet $ ​​1

Виправлення: перейдіть до Build -> Clean Project


Привіт, Ласкаво просимо до переповнення стека. Але, будь ласка, не повторюйте відповідей, окрім того, що вже було 24 відповіді, будівництво в чистоті вже було надано як відповідь ашишдух. Дякую!
Elletlar
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.