【问题标题】:Unable to merge dex Android studio 3.0 [duplicate]无法合并dex Android studio 3.0 [重复]
【发布时间】:2018-04-24 19:05:16
【问题描述】:

我的项目有问题。在 Android Studio 2.3.3 中它工作正常,但是当我更新到 3.0 时,我遇到了 marge dex 的问题。

我清理并重建项目。

怎么了:

任务“:app:transformDexArchiveWithExternalLibsDexMergerForDebug”执行失败。 com.android.builder.dexing.DexArchiveMergerException: 无法合并 dex

堆栈跟踪:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
at     org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeA  ctions(ExecuteActionsTaskExecuter.java:100)
at   org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(  ExecuteActionsTaskExecuter.java:70)
at    org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(Sk  ipUpToDateTaskExecuter.java:63)
at   org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecut  er.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at   org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(Vali  datingTaskExecuter.java:58)
at   org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.ex  ecute(SkipEmptySourceFilesTaskExecuter.java:88)
at   org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at   org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execu  te(SkipTaskWithNoActionsExecuter.java:52)
at   org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(Skip  OnlyIfTaskExecuter.java:54)
at   org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execu  te(ExecuteAtMostOnceTaskExecuter.java:43)
at   org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(  CatchExceptionTaskExecuter.java:34)
at   org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWork  er$1.run(DefaultTaskGraphExecuter.java:248)
at   org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOpe  rationWorker.execute(DefaultBuildOperationExecutor.java:336)
at   org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOpe  rationWorker.execute(DefaultBuildOperationExecutor.java:328)
at   org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultB  uildOperationExecutor.java:197)
at   org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuild  OperationExecutor.java:107)
at   org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWork  er.execute(DefaultTaskGraphExecuter.java:241)
at   org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWork  er.execute(DefaultTaskGraphExecuter.java:230)
at   org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.p  rocessTask(DefaultTaskPlanExecutor.java:124)
at   org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
at   org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1  .execute(DefaultTaskPlanExecutor.java:105)
at   org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1  .execute(DefaultTaskPlanExecutor.java:99)
at   org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTask  ExecutionPlan.java:625)
at   org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(Def  aultTaskExecutionPlan.java:580)
at   org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.r  un(DefaultTaskPlanExecutor.java:99)
at   org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExec  ute(ExecutorPolicy.java:63)
at   org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImp  l.java:46)
at   org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(  ThreadFactoryImpl.java:55)
Caused by: java.lang.RuntimeException:   com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
at   com.android.builder.dexing.DxDexArchiveMerger.mergeMultidex(DxDexArchiveMer ger.java:266)
at  com.android.builder.dexing.DxDexArchiveMerger.mergeDexArchives(DxDexArchive Merger.java:133)
at  com.android.build.gradle.internal.transforms.DexMergerTransformCallable.cal l(DexMergerTransformCallable.java:97)
at   com.android.build.gradle.internal.transforms.ExternalLibsMergerTransform.tr  ansform(ExternalLibsMergerTransform.kt:121)
at   com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTa  sk.java:222)
at   com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTa  sk.java:218)
at   com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
at   com.android.build.gradle.internal.pipeline.TransformTask.transform(Transfor  mTask.java:213)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at   org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$Incre  mentalTaskAction.doExecute(DefaultTaskClassInfoStore.java:173)
at   org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$Stand  ardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
at   org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$Stand  ardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
at   org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(Ex  ecuteActionsTaskExecuter.java:122)
at   org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOpe  rationWorker.execute(DefaultBuildOperationExecutor.java:336)
at   org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOpe  rationWorker.execute(DefaultBuildOperationExecutor.java:328)
at   org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultB  uildOperationExecutor.java:197)
at   org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuild  OperationExecutor.java:107)
at   org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeA  ction(ExecuteActionsTaskExecuter.java:111)
at   org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeA  ctions(ExecuteActionsTaskExecuter.java:92)
... 27 more
Caused by: com.android.builder.dexing.DexArchiveMergerException: Unable     to merge dex
at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCa llable.java:72)
at   com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCa  llable.java:36)
... 46 more
Caused by: com.android.dex.DexException: Multiple dex files define     Landroid/support/v4/view/accessibility/AccessibilityRecordCompatIcsMr1;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
at   com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCa  llable.java:61)
... 47 more

build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 21
buildToolsVersion '26.0.2'

defaultConfig {
    applicationId "...."
    minSdkVersion 21
    targetSdkVersion 21
    versionCode 2
    multiDexEnabled true
    versionName "1.01"
}
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),      'proguard-rules.pro'
    }
}
}
repositories {
mavenCentral()

maven { url 'http://maven.livotovlabs.pro/content/groups/public' }
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.android.support:cardview-v7:21.0.3'
compile 'com.android.support:multidex:1.0.1' //1.0.1
compile 'com.google.android.gms:play-services:6.5.87' //6.5.87
compile fileTree(dir: 'libs', include: 'Parse-*.jar')
compile 'com.parse.bolts:bolts-tasks:1.4.0'
compile 'com.parse.bolts:bolts-applinks:1.4.0'
compile 'com.jakewharton:butterknife:8.8.0'
compile 'it.neokree:MaterialNavigationDrawer:1.3.3'
compile 'com.github.navasmdc:MaterialDesign:1.5@aar'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.github.bluejamesbond:textjustify-android:2.1.0'
compile 'it.neokree:MaterialTabs:0.11'
compile('com.googlecode.json-simple:json-simple:1.1.1') {
    exclude module: 'junit'
}
compile ('eu.livotov.labs.android:CAMView:2.0.1@aar') {transitive=true}
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}

当我删除 multiDexEnable 时:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
at com.android.builder.dexing.DxDexArchiveMerger.mergeMonoDex(DxDexArchiveMerger.java:177)
at com.android.builder.dexing.DxDexArchiveMerger.mergeDexArchives(DxDexArchiveMerger.java:118)
at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:97)
at com.android.build.gradle.internal.transforms.ExternalLibsMergerTransform.transform(ExternalLibsMergerTransform.kt:121)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:222)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:218)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:213)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:173)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
... 27 more
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
at com.android.builder.dexing.DxDexArchiveMerger.lambda$mergeMonoDex$0(DxDexArchiveMerger.java:171)
Caused by: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
Caused by: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:72)
at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)
Caused by: com.android.dex.DexException: Multiple dex files define   Landroid/support/v4/view/accessibility/AccessibilityRecordCompatIcsMr1;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
at   com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCa  llable.java:61)
... 1 more

【问题讨论】:

  • 您是否已经尝试不使用 multidex?
  • 是的。我正在尝试在 Android Studio 2.3.3 中运行应用程序并且它可以工作。所以只有当我使用 3.0 版本时才有问题
  • 只是一个猜测,但我认为这与依赖项的重复有关。因为这个问题经常发生,因为每个人都在更新到 Android Studio 3.0。例如here。我的猜测是,如果您关闭 multidex 库,您可能会看到更好的堆栈跟踪,显示重复错误。

标签: android android-studio dex


【解决方案1】:

这与您项目中的重复依赖项有关。由于某些库隐式依赖于同一个库但版本不同,因此会发生重复的依赖关系。 Android Studio 中使用的 Gradle 4.1 不允许库重复。

您可以在 Linux 终端中使用以下命令从依赖关系树中检查它(app 是您的模块名称):

./gradlew app:dependencies

或者如果您使用的是 Windows,请在命令提示符下尝试:

gradlew.bat app:dependencies

那么在你找到它之后,你需要将它从库中排除并且只使用其中的一个。像这样的:

compile('com.library.name:version') {
  // this is a case for duplicate support library version.
  exclude group: 'com.android.support'
  exclude module: 'appcompat-v7'
}

请注意,您最好使用相同版本的 compileSdkVersionbuildToolsVersiontargetSdkVersionSupport Library

【讨论】:

    【解决方案2】:

    在我的情况下,它与 awsgateway sdk 给出的 gson 的依赖问题有关,并且 gson 已经存在。

    gradle -q app:dependencies
    

    在依赖项中没有显示任何差异,但 gradle 构建堆栈跟踪显示它与 gson 相关。 引起:com.android.dex.DexException: 多个dex文件定义Lcom/google/gson/FieldNamingStrategy;

    issue 之后,我在下面的配置中添加了 build.gradle,但这并没有解决问题。

    compile("com.google.code.gson:gson:2.3") {
        exclude module: 'gson:2.2.4'
    }
    

    我不得不手动删除 app/libs 文件夹中存在的 jar(在 sdk 生成期间由 apigateway 提供的 gson-2.2.4.jar)。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,然后我从Here (Github)找到了解决方案

      添加

      multiDexEnabled true
      

      在您的默认配置中 例子

      defaultConfig {
          applicationId "my application id "
          minSdkVersion 14
          targetSdkVersion 27
          versionCode 1
          versionName '1.0'
          multiDexEnabled true
      }
      

      然后添加

      implementation('commons-validator:commons-validator:1.4.1') {
          exclude group: 'commons-collections', module: 'commons-collections'
      }
      

      在您的依赖项中。 这对我有用,我希望它也能解决你的问题:)

      【讨论】:

      • 为什么您认为 OP 的问题和您的问题(或 LeakCanary 列表的问题)“相同”?为什么你建议将multiDexEnabled true 添加到 OPs 默认配置中,当它已经存在时?最后,你为什么建议 OP 添加一个库而不给出这样做的理由?
      • 我建议是因为我遵循了答案,但它对我不起作用。我认为其他人可能面临同样的问题,这就是为什么我要解决这个问题。
      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-15
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2018-08-06
      相关资源
      最近更新 更多