【问题标题】:Android Gradle Plugin 3.0.0: Multiple dex files define Lorg/xmlpull/mxp1/MXParser with XStreamAndroid Gradle Plugin 3.0.0:多个 dex 文件用 XStream 定义 Lorg/xmlpull/mxp1/MXParser
【发布时间】:2017-11-16 16:51:32
【问题描述】:

自带xmlpullparser 的包含项目总是需要在 Android Studio 中格外小心,因为 Android 自带了自己的 xmlpullparser。

例如流行的 XML 映射器 XStream 需要此排除 (1) (2)

compile('com.thoughtworks.xstream:xstream:1.4.7') {
    exclude group: 'xmlpull', module: 'xmlpull' //exclude xmlpull to avoid `Multiple dex files define`-error
}

Somewhere else我也见过:

compile('com.thoughtworks.xstream:xstream:1.4.7') {
      exclude group: 'xmlpull'
     exclude group: 'XmlPullParser'
  }

关于这个问题的新闻是:排除在 Android 插件版本 2.3.3 上有效,而在 Android 插件版本 3.0.0 上我又遇到错误! (您可以在文件>项目结构>项目下看到Android插件版本)

是否有人已经想出如何更改 gradle 文件以使 xstream 在Android Plugin Version 3.0.0 上运行?

我只是怀疑“XStream”会导致该错误。

16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 失败:构建失败并出现异常。 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] * 出了什么问题: 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter]任务':app:transformDexArchiveWithExternalLibsDexMergerForDebug'执行失败。 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] > com.android.builder.dexing.DexArchiveMergerException:无法合并 dex 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] * 例外是: 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] org.gradle.api.tasks.TaskExecutionException:任务':app:transformDexArchiveWithExternalLibsDexMergerForDebug'的执行失败。 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100) 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70) 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63) 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54) 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) 16:40:26.671 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124) 16:40:26.672 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 原因:java.lang.RuntimeException:com.android.builder.dexing.DexArchiveMergerException:无法合并 dex 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 原因:com.android.builder.dexing.DexArchiveMergerException:无法合并 dex 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:72) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 原因:com.android.dex.DexException:多个 dex 文件定义 Lorg/xmlpull/mxp1/MXParser; 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661) 16:40:26.673 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616) 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598) 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 com.android.dx.merge.DexMerger.merge(DexMerger.java:198) 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 在 com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61) 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] ... 还有 1 个 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildExceptionReporter] * 在 https://help.gradle.org 获得更多帮助 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildResultLogger] 16:40:26.674 [错误] [org.gradle.internal.buildevents.BuildResultLogger] 37 秒内构建失败

【问题讨论】:

    标签: android android-gradle-plugin xstream android-build xmlpullparser


    【解决方案1】:

    终于找到了解决办法。但是,我仍然很困惑为什么它依赖于 Gradle 插件版本。

    我正在使用logback-android,它以某种方式依赖于 xpp3,正如您在依赖关系图中看到的那样:

        +--- com.github.tony19:logback-android-classic:1.1.1-6
    |    |    +--- com.github.tony19:logback-android-core:1.1.1-6
    |    |    \--- com.github.tony19:apktool-lib:1.4.4-3
    |    |         \--- com.google.android:android:2.1_r1
    |    |              +--- commons-logging:commons-logging:1.1.1
    |    |              +--- org.apache.httpcomponents:httpclient:4.0.1
    |    |              |    +--- org.apache.httpcomponents:httpcore:4.0.1
    |    |              |    +--- commons-logging:commons-logging:1.1.1
    |    |              |    \--- commons-codec:commons-codec:1.3
    |    |              +--- org.khronos:opengl-api:gl1.1-android-2.1_r1
    |    |              +--- xerces:xmlParserAPIs:2.6.2
    |    |              \--- xpp3:xpp3:1.1.4c
    

    必须说我在 utils 模块中声明了 logback-android,然后我使用 implementation project(:'myUtilsModule') 将其包含到我的应用程序中

    现在我排除了组 xpp3 及其模块 xpp3。组和模块名称xmlpull 不起作用。:

    // https://mvnrepository.com/artifact/com.github.tony19/logback-android-classic
    implementation('com.github.tony19:logback-android-classic:1.1.1-6') {
        exclude group: 'xpp3', module: 'xpp3'  //in order to avoid "Multiple dex files define Lorg/xmlpull/v1/XmlPullParser;"
        //exclude group: 'xmlpull', module: 'xmlpull' //This works usually on other libs to exclude xmlpull, but not on that one
    }
    

    我学会了如何阅读依赖图以及如何从图中排除项目;)

    1. 运行How do I show dependencies tree in Android Studio?
    2. 依赖图中的每一行都有格式 <group>:<module>:<version>
    3. 映射到排除参数 exclude group: '<group>', module: '<module>' 或只是 exclude module: '<module>'

    更新:logback-android-1.1.1-7+ 不再需要排除。

    【讨论】:

      猜你喜欢
      • 2014-05-07
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多