多个dex文件定义了Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat

216

如果我从命令行运行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)
如果我使用grep命令搜索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,但每次重新运行assembleDebug时,它总是出现。

如果我在build目录中搜索r7,我会在文件中看到它:

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

如果我不包含v13,其他东西就无法编译。

但是v13难道不包括v4支持库吗?

这是play服务AAR捆绑包和v13库之间的不兼容性吗?

我从gradleplease.appspot.com获取了gradle文件。

删除play服务并不能解决问题;错误依然存在。

我的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的问题,但现在我必须工作。任何信息也会很有帮助,我真的很喜欢kotlin。 - clementiano
26个回答

305

运行 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-Camera库,所以我使用:

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
有没有一种方法可以检查/排除在Maven上不可用的.jar依赖模块?使用gradle dependencies似乎无法报告使用compile files('libs/example.jar')添加的依赖项。 有没有一种方法可以检查/排除在Maven上不可用的.jar依赖模块?使用gradle dependencies似乎无法报告使用compile files('libs/example.jar')添加的依赖项。 - dbro
3
假设我有两个libs/*.jar的依赖项,它们有一个共同的模块,但没有作为构件可用。有没有办法执行类似的依赖项检查/类排除? - dbro
2
@dbro:据我所知,没有这样的功能,但是说实话,我还没有研究过这一点。以我的个人看法,这两个JAR文件中的一个或同时存在的两个JAR文件在打包时可能有误,因为共同模块应该被分解成自己的JAR。 - CommonsWare
12
./gradlew -q :projectName:dependencies 对我有效 - Defuera
15
针对从模块依赖中排除一个模块的快速提示:您需要将compile project(':foo')更改为 compile(project(':foo')) { exclude module: 'support-v4' }。请注意括号。 - espinchi
显示剩余23条评论

123

我通过在 build.gradle 文件中的 android 块内添加以下代码段来解决类似的错误。

android {
    dexOptions {
        preDexLibraries = false
    }
}

4
对我很有效!这种方法有没有任何不利之处? - Barrie Galitzky
3
谢谢,这个方法完美解决了问题!但我觉得它有一些副作用……assembleDebug任务变慢了三倍! - Marino
这是最好、最简单的解决问题的方法。谢谢,伙计! - Serdar Samancıoğlu
没用啊!!在将模块添加到Android包中后,我得到了之前出现的相同错误... - sudharsan chandrasekaran
10
加入这个之后,我遇到了“翻译已被中断”的错误。我想我得尝试一下CommonsWare的方法。 - DroidHeaven
显示剩余2条评论

36

既然“一张图片胜过千言万语”,为了让像我这样的初学者更容易快速完成此任务,以下是显示了适用于我的答案发布者@edsappfactory.com的截图:

首先在Androidstudio的右侧打开Gradle视图,在您的应用程序项目中转到 Tasks ,然后进入 Android ,然后右键单击androidDependencies ,然后选择 Run

step 1

其次您将看到类似于此的内容:

Step 2

我发布这篇文章的主要原因是很难知道在哪里执行gradle 任务或上面发布的命令。这也是要执行它们的地方。

因此,要执行gradle命令:

第一步:

first

第二步:

second

就这么容易。

就是这样。

谢谢。


33

还需要注意的是,您可以通过前往Android Studio Gradle视图并选择目标“androidDependencies”来查看您的Android依赖项。

再给一个提示:我遇到了这个问题,直到我从项目和相关模块/库项目的libs文件夹中删除了v4支持库才解决了。


3
需要更具体的指示吗?找不到“androidDependencies”。谢谢。 - CopperCash
进入Gradle视图,然后找到“所有任务”标题,在您的应用程序名称上进行钻取,然后再钻取“:app”,您将在那里找到“androidDependencies”。 - AutoM8R
2
Gradle 视图在哪里? - Paul Beusterien
4
如果你看窗口的最右边,会有一个标有“Gradle”的侧向选项卡。点击它可以打开一个固定视图。androidDependencies 实际上是一个 Gradle 任务。 - JCricket
谢谢你,我发布了截图来解释你的答案,以使它更容易理解。 - MBH

11

当我升级到ButterKnife 8.5.1时,我开始遇到这个错误。这里的其他答案都没有对我起作用。

我使用了gradle -q:app:dependencies来查看依赖关系树,然后查找jar文件,直到找到冲突点。冲突是因为ButterKnife依赖于com.android.support:support-compat:25.1.0版本中包含了accessibility类,而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'

保持支持版本不变是一个简单的解决方案,而排除模块对我来说并不起作用。 - Jay
我也用了第二种解决方案!同样的冲突,但是使用的是Butter Knife 8.8.1版本。示例:implementation ('com.jakewharton:butterknife:8.8.1') { exclude module: 'support-compat' } annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' - GFPF

9
如果有人发现CommonsWare的答案无法应用于Android库项目,这里是修复代码片段:

编译(project(':yourAndroidLibrary')){ exclude module: 'support-v13' }

如果使用以下代码:

compile project(':yourAndroidLibrary'){ exclude module: 'support-v13' }

你会遇到以下问题:

找不到不支持Gradle DSL方法:'exclude()'

区别在于括号"("")"之前是否存在"project"


谢谢,我漏掉了双括号! - Marko

8
exclude module: 'support-v4'

对于有项目依赖的情况,下面这种语法是我能让它工作的唯一方式:

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

其中:Android-SDK 是您的项目名称。


8

1
如果你不是非常需要,多DEX分包会使你的应用程序启动速度变慢。 - James Goodwin

6

我遇到了同样的错误,但这是因为我最近从v4更改为v13。所以我只需要清理项目即可。


1
升级Intellij后出现了相同的错误,清理项目解决了问题。 - Allan Spreys

5

我在一个老项目中遇到了同样的错误,我的问题是支持库被包含了两次:一次在google-play-services库中,另一次是独立存在的。

以下是我的解决方法:

错误的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'
}

希望能对某些人有所帮助 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接