【问题标题】:Multiple dex files define Landroid/support/v7/util/ThreadUtil$MainThreadCallback Error多个 dex 文件定义 Landroid/support/v7/util/ThreadUtil$MainThreadCallback 错误
【发布时间】:2017-05-20 22:21:28
【问题描述】:

仅当我尝试发布或调试我的应用程序的 apk 时才会发生错误。我可以直接从 Android Studio 在我的设备上运行或调试它。从this 问题,我了解到这可能是由于重复的依赖关系。所以我尝试通过运行检查是否有任何重复的依赖项:

 ./gradlew -q :app:dependencies

我得到了以下依赖树:

_releaseApk - ## Internal use, do not manually configure ##
+--- com.android.support:appcompat-v7:25.3.1
|    +--- com.android.support:support-annotations:25.3.1
|    +--- com.android.support:support-v4:25.3.1
|    |    +--- com.android.support:support-compat:25.3.1
|    |    |    \--- com.android.support:support-annotations:25.3.1
|    |    +--- com.android.support:support-media-compat:25.3.1
|    |    |    +--- com.android.support:support-annotations:25.3.1
|    |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |    +--- com.android.support:support-core-utils:25.3.1
|    |    |    +--- com.android.support:support-annotations:25.3.1
|    |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |    +--- com.android.support:support-core-ui:25.3.1
|    |    |    +--- com.android.support:support-annotations:25.3.1
|    |    |    \--- com.android.support:support-compat:25.3.1 (*)
|    |    \--- com.android.support:support-fragment:25.3.1
|    |         +--- com.android.support:support-compat:25.3.1 (*)
|    |         +--- com.android.support:support-media-compat:25.3.1 (*)
|    |         +--- com.android.support:support-core-ui:25.3.1 (*)
|    |         \--- com.android.support:support-core-utils:25.3.1 (*)
|    +--- com.android.support:support-vector-drawable:25.3.1
|    |    +--- com.android.support:support-annotations:25.3.1
|    |    \--- com.android.support:support-compat:25.3.1 (*)
|    \--- com.android.support:animated-vector-drawable:25.3.1
|         \--- com.android.support:support-vector-drawable:25.3.1 (*)
+--- com.android.support:cardview-v7:25.3.1
|    \--- com.android.support:support-annotations:25.3.1
+--- com.android.support:recyclerview-v7:25.3.1
|    +--- com.android.support:support-annotations:25.3.1
|    +--- com.android.support:support-compat:25.3.1 (*)
|    \--- com.android.support:support-core-ui:25.3.1 (*)
+--- com.android.support:design:25.3.1
|    +--- com.android.support:support-v4:25.3.1 (*)
|    +--- com.android.support:appcompat-v7:25.3.1 (*)
|    +--- com.android.support:recyclerview-v7:25.3.1 (*)
|    \--- com.android.support:transition:25.3.1
|         +--- com.android.support:support-annotations:25.3.1
|         \--- com.android.support:support-v4:25.3.1 (*)
+--- pl.droidsonroids.gif:android-gif-drawable:1.2.7
+--- com.google.android.gms:play-services-ads:10.2.6
|    +--- com.google.android.gms:play-services-ads-lite:10.2.6
|    |    \--- com.google.android.gms:play-services-basement:10.2.6
|    |         \--- com.android.support:support-v4:25.2.0 -> 25.3.1 (*)
|    +--- com.google.android.gms:play-services-base:10.2.6
|    |    +--- com.google.android.gms:play-services-basement:10.2.6 (*)
|    |    \--- com.google.android.gms:play-services-tasks:10.2.6
|    |         \--- com.google.android.gms:play-services-basement:10.2.6 (*)
|    +--- com.google.android.gms:play-services-clearcut:10.2.6
|    |    +--- com.google.android.gms:play-services-base:10.2.6 (*)
|    |    \--- com.google.android.gms:play-services-basement:10.2.6 (*)
|    +--- com.google.android.gms:play-services-basement:10.2.6 (*)
|    \--- com.google.android.gms:play-services-gass:10.2.6
|         \--- com.google.android.gms:play-services-basement:10.2.6 (*)
+--- com.google.android.gms:play-services-location:10.2.6
|    +--- com.google.android.gms:play-services-base:10.2.6 (*)
|    +--- com.google.android.gms:play-services-basement:10.2.6 (*)
|    \--- com.google.android.gms:play-services-tasks:10.2.6 (*)
\--- com.google.firebase:firebase-core:10.2.6
     \--- com.google.firebase:firebase-analytics:10.2.6
          +--- com.google.firebase:firebase-analytics-impl:10.2.6
          |    +--- com.google.android.gms:play-services-basement:10.2.6 (*)
          |    +--- com.google.firebase:firebase-iid:10.2.6
          |    |    +--- com.google.android.gms:play-services-basement:10.2.6 (*)
          |    |    \--- com.google.firebase:firebase-common:10.2.6
          |    |         +--- com.google.android.gms:play-services-basement:10.2.6 (*)
          |    |         \--- com.google.android.gms:play-services-tasks:10.2.6 (*)
          |    +--- com.google.firebase:firebase-common:10.2.6 (*)
          |    \--- com.google.android.gms:play-services-tasks:10.2.6 (*)
          +--- com.google.android.gms:play-services-basement:10.2.6 (*)
          \--- com.google.firebase:firebase-common:10.2.6 (*)

如何从这棵树中推断出我的项目中哪些是重复的依赖项?它们是以星号结尾的吗?

编辑:我的 Gradle 文件如下所示

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.mycompany.myapp"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:cardview-v7:25.3.1'
    compile 'com.android.support:recyclerview-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.7'
    compile 'com.google.android.gms:play-services-ads:10.2.6'
    compile 'com.google.android.gms:play-services-location:10.2.6'
    compile 'com.google.firebase:firebase-core:10.2.6'
    testCompile 'junit:junit:4.12'
}


apply plugin: 'com.google.gms.google-services'  

编辑 2:完整的 gradle 错误:

错误:任务执行失败 ':app:transformClassesWithDexForDebug'.

com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException:com.android.dex.DexException: 多个dex文件定义 landroid/support/v7/util/ThreadUtil$MainThreadCallback;

编辑 3:由于 support/v7/util/ThreadUtil.java 属于 RecyclerView 模块,我尝试使用以下内容排除设计库下的 RecyclerView 模块:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:cardview-v7:25.3.1'
    compile 'com.android.support:recyclerview-v7:25.3.1'
    compile ('com.android.support:design:25.3.1') {
        exclude module: 'recyclerview-v7'
    }
    compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.7'
    compile 'com.google.android.gms:play-services-ads:10.2.6'
    compile 'com.google.android.gms:play-services-location:10.2.6'
    compile 'com.google.firebase:firebase-core:10.2.6'
    testCompile 'junit:junit:4.12'
  }

还是不行。

【问题讨论】:

  • 发布 gradle 文件
  • 尝试添加完整的gradle错误
  • multiDexEnabled true 在默认配置中
  • @jagapathi 我之前尝试过。没用。
  • 如果我将该依赖项列表粘贴到一个全新的 Android Studio 项目中(并从 activity_main 布局资源中删除 ConstraintLayout),我可以在没有重复依赖错误。如果您还没有这样做,请尝试清理和重建项目。如果这没有帮助,请尝试将您的项目目录复制到一个单独的位置,从副本中删除所有 build/*.iml.idea/.gradle/ 目录,导入该副本,然后进行构建。如果这没有帮助,我必须假设您在某处的 src/ 中有重复的 ThreadUtil

标签: android gradle dex


【解决方案1】:

根据您的评论,显然问题是第三方 SDK 分发了 recyclerview-v7 的 JAR,您在 libs/ 中拥有该 JAR,这与您的 recyclerview-v7 依赖项冲突。

使用纯 JAR 进行依赖有缺点。

一个是您倾向于忘记它们,特别是如果您正在使用来自工件存储库的依赖项。例如,我什至没有考虑到您在 libs/ 中可能在 my comment 中有 JAR。

另一个是 Gradle 不能为它们执行任何类型的依赖解析。 Gradle 依赖工件元数据(POM 文件)来确定需要哪些依赖项。对于 JAR 文件,Gradle 假定“您在做正确的事情”,在这种情况下,您的广告网络的一个 JAR 不是“正确的事情”。

此外,JAR 是 JAR,而不是 AAR。在这种情况下,您广告网络的工程师是非常奇怪的人。 recyclerview-v7 在其 AAR 中有 RecyclerView 需要的资源(例如,自定义属性)。基本上,通过分发包含RecyclerView 代码的 JAR,他们注定了使用他们的 SDK 的任何人:没有人可以使用他们的RecyclerView,因为它不完整(并且可能已经过时),并且没有人可以使用官方的RecyclerView,因为类冲突。

我建议您至少向广告网络投诉,敦促他们改用人工制品和一组适当的依赖项。

【讨论】:

  • 感谢您提供信息丰富且详细的回答。我已将此问题通知他们,并且一定会让他们注意您在此处共享的信息。 (仅供参考,广告网络的名称是 Appodealthis 是他们的 SDK zip 文件)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 2014-01-26
  • 1970-01-01
相关资源
最近更新 更多