НЕОЖИДАННОЕ ИСКЛЮЧЕНИЕ ВЕРХНЕГО УРОВНЯ: com.android.dex.DexException: Несколько файлов dex определяют
Когда я добавляю настройки для Google Analytics в свой проект Android и собираю проект, я получаю следующую ошибку:
:app:transformClassesWithDexForDebug
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Ljavax/inject/Inject;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
* Try:
Run with --info or --debug option to get more log output.
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithDexForDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:310)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63)
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88)
at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23)
at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:68)
at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:62)
at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:55)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:149)
at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:106)
at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:86)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:90)
at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:54)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:28)
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:49)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
at org.gradle.util.Swapper.swap(Swapper.java:38)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.health.DaemonHealthTracker.execute(DaemonHealthTracker.java:47)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:66)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:71)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.health.HintGCAfterBuild.execute(HintGCAfterBuild.java:41)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:246)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.internal.UncheckedException: com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:45)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:78)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.doExecute(AnnotationProcessingTaskFactory.java:243)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:219)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$IncrementalTaskAction.execute(AnnotationProcessingTaskFactory.java:230)
at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:208)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
... 57 more
Caused by: com.android.build.transform.api.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
at com.android.build.gradle.internal.transforms.DexTransform.transform(DexTransform.java:411)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:112)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
... 63 more
Caused by: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:42)
at com.android.builder.core.AndroidBuilder.convertByteCode(AndroidBuilder.java:1325)
at com.android.build.gradle.internal.transforms.DexTransform.transform(DexTransform.java:396)
... 65 more
Caused by: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:365)
at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:40)
... 67 more
Что это значит и как я могу предотвратить эту ошибку?
12 ответов
Немного опоздал к игре здесь, но это, скорее всего, проблема с зависимостями, которые вы перечислили в своем build.gradle
файл для вашего приложения.
После многих испытаний я успешно выследил свою проблему и считаю, что она может помочь другим.
Вещи, которые я не рекомендую:
Если у вас нет абсолютной необходимости включать multiDex в вашем build.gradle, НЕ ДЕЛАЙТЕ ЭТОГО, это просто перешагивает через основную проблему в вашем приложении и не доходит до ее корня. Вы также излишне увеличиваете размер вашего apk, и могут возникнуть непредвиденные сбои, когда в вашем файле dex есть конфликтующий метод.
На что обращать внимание:
Проверьте все ваши зависимости в вашем файле build.gradle. Вы ссылаетесь на зависимость, которая также включает зависимость, которую вы уже включили? Например, если вы включили appcompat-v7, нет необходимости включать appcompat-v4, поскольку v7 включает в себя все функции v4.
ЧТО Я НАСТОЯЩИМ НАЙТИ (МОЯ ВОПРОС заставил мое приложение превысить лимит метода в моем файле dex) ----> GOOGLE PLAY SERVICES
Если вам не нужны все зависимости библиотеки Google Play Services, оставайтесь в стороне от этой строки в вашем build.gradle
compile 'com.google.android.gms:play-services:8.3.0'
и вместо этого просто используйте то, что вам нужно!
У Google есть полный список библиотек для выборочной компиляции здесь
Учитывая все вышесказанное, вам, вероятно, нужно всего лишь включить одну строку в gradle для своей Google Analytics:
dependencies{
compile 'com.google.android.gms:play-services-analytics:8.3.0'
}
РЕДАКТИРОВАТЬ
Также вы можете просмотреть дерево зависимостей, перейдя в корень вашего проекта (или используя терминал в Android Studio) и запустив:
./gradlew app:dependencies
Удачи и счастливого кодирования!
Обновить
Теперь, начиная с Android Studio 2.2, вам больше не нужно проб и ошибок, нужно ли вам использовать multi-dex в вашем приложении. Используйте Apk Analyzer, чтобы увидеть, действительно ли он нужен!
Explication: создание приложений с использованием более 65 000 методов
Файлы приложения Android (APK) содержат исполняемые файлы байт-кода в виде файлов Dalvik Executable (DEX), которые содержат скомпилированный код, используемый для запуска вашего приложения. Спецификация исполняемого файла Dalvik ограничивает общее количество методов, на которые можно ссылаться в одном файле DEX, до 65 536, включая методы платформы Android, библиотечные методы и методы в вашем собственном коде. Чтобы преодолеть это ограничение, необходимо настроить процесс сборки приложения для создания более одного файла DEX, известного как мультидекс конфигурация.
Примечание. Это позволяет обращаться ко всем методам приложения. Это как если бы у вас было два модуля (ограничение: 2 x 65K), но они были сжаты в один. Это влечет за собой затраты (время) в процессе сборки.
Решение:
- Вы должны попытаться отформатировать свой код с библиотеками, чтобы удалить лишние классы, а также не превышать предельные методы. Например, если вы используете карты play-services ( com.google.android.gms: play-services: 8.1.0), вы можете перейти на (compile 'com.google.android.gms:play-services-maps:8.1.0') для устранения ненужных библиотечных зависимостей. Затем синхронизируйте Gradle в AndroidStudio и проверьте, работает ли он. Если нет, переходите к пункту 2.
- Добавьте это в build.gradle (модуль приложения).
android {
...
defaultConfig {
...
multiDexEnabled true
}
}
Для меня это было связано с Simplexml Converter для дооснащения 2. И это исправлено с помощью:
compile ("com.squareup.retrofit2:converter-simplexml:2.0.0-beta4"){
exclude module: 'stax'
exclude module: 'stax-api'
exclude module: 'xpp3'}
Поддержка Multidex для Android 5.0 и выше
Android 5.0 и выше использует среду выполнения, которая называется ART, которая изначально поддерживает загрузку нескольких файлов dex из файлов APK приложения. ART выполняет предварительную компиляцию во время установки приложения, которая сканирует файлы классов (..N).dex и компилирует их в один файл.oat для исполнения устройством Android. Для получения дополнительной информации о среде выполнения Android 5.0 см. Введение в ART.
Это означает, что ваше приложение будет работать нормально на уровне API 21 или выше.
Поддержка Multidex до Android 5.0
Версии платформы до Android 5.0 используют среду выполнения Dalvik для выполнения кода приложения. По умолчанию Dalvik ограничивает приложения одним файлом байт-кода classes.dex для каждого APK. Чтобы обойти это ограничение, вы можете использовать библиотеку поддержки multidex, которая становится частью основного файла DEX вашего приложения, а затем управляет доступом к дополнительным файлам DEX и коду, который они содержат.
Итак, во-первых, убедитесь, что вы импортировали правильную зависимость, которая, кажется, вы сделали это.
dependencies {
compile 'com.android.support:multidex:1.0.1'
}
В вашем манифесте добавьте MultiDexApplication
класс из библиотеки поддержки мультидекса в элемент приложения.
<?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
,
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
Наконец, вам нужно обновить файл build.gradle, как показано ниже, добавив multiDexEnabled true
:
defaultConfig {
applicationId '{Project Name}'
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
Я надеюсь, что это поможет вам.
В моем случае это было дважды в файле build.grade
compile 'com.google.android.gms:play-services-auth:8.4.0'
Как только я удалил 2-ую запись, все заработало нормально.
Точно такая же проблема, с которой я столкнулся!
Я узнал, что это связано с дублированием зависимостей. В build.gradle одна зависимость может быть уже включена в другие, что порождает конфликты. Я удалил необходимые зависимости и решил мою проблему.
Включите конкретные зависимости в файл сборки.
Если вы хотите добавить карты в свое приложение, включите компиляцию 'com.google.android.gms: play-services-location: 9.2.1'
вместо компиляцииcom.google.android.gms:play-services:9.2.1
То, что я сделал, чтобы исправить это, убрало изменения gradle отсюда ( https://developers.google.com/analytics/devguides/collection/android/v4/), затем в Android Studio перешел в "Файл / Структура проекта", затем нажмите на Analytics и, если флажок установлен, снимите его, позвольте gradle sync, затем установите флажок снова и нажмите кнопку, чтобы войти. После всего этого, чтобы ваш трекер аналитики заработал, вам просто нужно скопировать свой фактический идентификатор трекера в mTracker = analytics.newTracker(<here>)
посмотрите на эту страницу за помощью. https://developers.google.com/android/reference/com/google/android/gms/analytics/GoogleAnalytics
Та же проблема, но при использовании response-native-svg. Это помогло мне:
cd android
./gradlew clean
Я думаю, что вы используете Google Analytics SDK V3 использовать V4 вместо этого, я также столкнулся с той же проблемой при использовании SDK V3 Google Analytics https://developers.google.com/analytics/devguides/collection/android/v4/ см. эту ссылку для Дополнительная информация.
Это может произойти, если вы обновили Android Studio до последней версии 1.4. Вы обновили библиотеки поддержки до последних версий? Ваш compileSdkVersion
должно быть 23.
apply plugin: 'com.android.application'
android {
compileSdkVersion 23 //update this to 23
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "your.package.name"
minSdkVersion 16
targetSdkVersion 21
multiDexEnabled true //enable this
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
// update these to 23 if you have them and add the multidex
compile 'com.android.support:support-v4:23.0.1'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
compile 'com.google.android.gms:play-services:+'
compile 'com.android.support:multidex:1.0.1'
}
С веб-сайта разработчика Android:
Android 5.0 (уровень API 21) и выше использует среду выполнения под названием ART, которая наивно поддерживает загрузку нескольких файлов DEX из файлов APK.
Я установил min SDK на 21, и это решило проблему для меня (конечно, вам нужно проверить свой конкретный случай, если установка min-SDK на 21 или выше вас устраивает)
На самом деле я обнаружил, что слишком много модулей Android Studio способствовало возникновению этой ошибки без включения мультидекса. Если вы пытаетесь избежать включения мультидекса, то кажется, что предел составляет около 26 модулей. Это было с Android Studio 1.5.1