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


212

如果我从命令行运行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)

如果我为v4使用grep,则在build文件夹中看到两个文件。

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时,它总是出现在那。

如果我在构建目录中grep r7,我会在文件中看到它:

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

如果我不包括v13,则其他内容将无法编译。

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

这是Play服务AAR捆绑包与v13库之间的不兼容吗?

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

删除播放服务不能解决该问题;同样的错误。

我在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

Answers:


304

运行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')
dbro 2014年

3
假设我有两个libs/*.jar共同的模块依赖项,都不能作为工件使用。有什么方法可以执行类似的依赖检查/类排除?
dbro 2014年

2
@dbro:不是我知道,但是,我还没有研究这一点。恕我直言,这些JAR文件中的一个或两个都包装不当,因为应该将共同的模块分解到自己的JAR中。
CommonsWare 2014年

12
./gradlew -q:projectName:dependencies为我工作
Defuera 2014年

15
对于那些从模块依赖中排除模块的人的快速提示:您必须将compile project(':foo')变成compile(project(':foo')) { exclude module: 'support-v4' }。注意括号。
espinchi 2014年

122

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

android {
    dexOptions {
        preDexLibraries = false
    }
}

4
为我工作!这样做有什么弊端吗?
Barrie Galitzky 2014年

@BarrieGalitzky到目前为止,我还没有遇到任何问题
mike.tihonchik 2014年

3
谢谢,这非常适合解决问题!无论如何,我认为它有一些副作用。.assembleDebug任务变得慢了3倍!
马力诺(Marino)2014年

找不到dexOptions。
奥利弗·迪克森

10
添加此内容后,出现“翻译被中断”错误。猜猜我必须尝试使用​​CommonsWare方法。
DroidHeaven

36

由于一张图片值一千字

为了使与我这样的初学者一起完成此任务更加容易和快捷。这是显示@ edsappfactory.com为我工作的答案的屏幕截图:

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

第1步

其次,您将看到类似以下内容:

第2步

我发布此消息的主要原因是,不容易知道在哪里执行gradle任务或上面发布的命令。因此,这也是他们的罪魁祸首。

因此,要执行gradle命令:

第一:

第一

第二:

第二

如此简单。

而已。

谢谢。


33

还要注意,您可以转到Android Studio Gradle视图,然后选择目标“ androidDependencies”来查看android依赖项。

另一个提示:我遇到了这个问题,直到我从项目以及相关模块/库项目中的libs文件夹中删除了v4支持库。


3
更具体的说明?找不到“ androidDependencies”。Thx
CopperCash14年

转到Gradle视图,然后找到标题“所有任务”,向下钻取您的应用程序的名称,然后向下钻取“:app”,您将在其中找到“ androidDependencies”。
AutoM8R 2014年

2
Gradle视图在哪里?
Paul Beusterien 2015年

4
@PaulBeusterien如果您看向窗口的最右边,则有一个标记为Gradle的横向选项卡。单击它打开固定的视图。androidDependencies实际上是一项艰巨的任务
JCricket 2015年

谢谢你,我张贴了截图,解释了你的答案,使之变得更加容易。
MBH

11

升级到ButterKnife 8.5.1时,我开始收到此错误。这里没有其他答案对我有用。

我曾经gradle -q :app:dependencies看过树,然后浏览jar文件,直到发现冲突为止。冲突在于,黄油刀的依赖项com.android.support:support-compat:25.1.0包含可访问性类的一个版本,并且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'

保持支持版本相同是简单的解决方案,并且排除模块对我不起作用。
杰伊

我也用第二种解决方案解决了!相同的冲突,但与黄油刀版本8.8.1示例:实现('com.jakewharton:butterknife:8.8.1'){排除模块:'support-compat'}注解处理器'com.jakewharton:butterknife-compiler:8.8.1'
GFPF

9

万一有人发现CommonsWare的答案无法应用于android库项目,以下是要修复的代码段

编译(project(':yourAndroidLibrary')) {排除模块:'support-v13'}

你会发现问题

找到了不受支持的Gradle DSL方法:“ exclude()”

如果您使用compile project(':yourAndroidLibrary') {排除模块:'support-v13'}

区别在于“ project”之前的手镯“(”“)


谢谢,缺少双括号!
Marko

8
exclude module: 'support-v4'

对于项目依赖项对我不起作用,使它起作用的唯一方法是通过以下语法:

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

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



6

我有同样的错误,但这是因为我最近从使用v4更改为v13。所以我要做的就是清理项目。


1
升级intellij后出现相同的错误,清理项目解决了该问题。
Vlad Spreys 2014年

5

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

这是我解决的方法:

坏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'
}

希望它可以帮助某人:-)


3

我正在使用com.google.android.gms:play-services-analytics:8.3.0android-support-v13.jar无法exclude module: 'support-v4'上班。

对我android-support-v13有用的是使用人工制品而不是android-support-v13.jar文件。

即代替

dependencies {
compile ('com.google.android.gms:play-services-analytics:8.3.0')
compile files('libs/android-support-v13.jar')

}

我用了

dependencies {
compile ('com.google.android.gms:play-services-analytics:8.3.0')
compile ('com.google.android:android-support-v13')

}


3

就我而言,问题是由版本不一致引起的:

Build tools 25
compileSdk 24
targetSdk 24
Support library 24

解决方案很简单:将所有内容都设为25版


3

一个类似的 DEX问题解决方法

gradle.build包含:

compile files('libs/httpclient-4.2.1.jar')
compile 'org.apache.httpcomponents:httpclient:4.5'
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'

我移除后该问题已解决

compile files('libs/httpclient-4.2.1.jar') 

我的gradle现在看起来像:

apply plugin: 'com.android.application'

android {

compileSdkVersion 24
buildToolsVersion "24.0.3"

defaultConfig {
    applicationId "com.mmm.ll"
    minSdkVersion 16
    targetSdkVersion 24
    useLibrary  'org.apache.http.legacy'
}

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}
}

dependencies {

compile 'com.google.android.gms:play-services:6.1.+'
compile files('libs/PayPalAndroidSDK.jar')
compile files('libs/ksoap2-android-assembly-3.0.0-RC.4-jar-with-dependencies.jar')
compile files('libs/picasso-2.1.1.jar')
compile files('libs/gcm.jar')
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'
}

JAR文件和已编译的gradle项目中存在冗余

因此,敏锐地寻找具有相同类的依赖项和jar文件。

并删除冗余。
这对我有用。


2

如果您是从Eclipse导入项目的。

1. The select project 
2. Go to File -> **Project Structure**
3. Select app in **module** section on left hand panel
4. Select **Dependency** tab
5. Your able to see jars you have added in eclipse project for v4 and v13.
6. Remove that jar by clicking on minus sign at bottom after selection
7. Click on Plus sign select **Library Dependency** 
8. Choose V4 and V13 if added
9. Press Ok and Clean and Rebuild your project

将Eclipse项目导入Android Studio之后,我遇到的情况是。

希望这可以帮助..


2

这是一个烦人的问题,可能需要一些时间才能找出根本原因。您应该继续的方法是@CommonsWare答案。

我最近遇到了这个问题,发现很难解决。

我的问题是我在build.gradle中包含了“ +”版本的库。该库的最新版本包含较旧的dex和bang之一。

我恢复到旧版本的库并解决了。

最好运行您的androidDependencies并查看实际发生的情况。在构建文件夹中搜索也很好。

首先,Android Studio 2.2提供了内置功能来跟踪此问题。

快乐的编码家伙


2

在Android Studio中,转到您的build.gradle(检查项目和模块的build.gradle文件)并搜索重复的依赖项。

删除您的项目不需要的项目。




1

我只需添加即可解决我的本机项目中的问题

configurations {
        all*.exclude group: 'com.android.support', module: 'support-compat'
        all*.exclude group: 'com.android.support', module: 'support-core-ui'
    }

在我的android \ app \ build.gradle文件的末尾


0

最后,我解决了修改模块gradle文件中的这些属性的问题

  1. 编译版本25
  2. targetSdkVersion 25
  3. 编译'com.android.support:appcompat-v7:+'
  4. 编译'com.android.support:recyclerview-v7:+'

0

添加react-native-palette到我的项目时,我遇到了同样的问题,这是我的依赖关系树:

./gradlew app:dependencies
+--- project :react-native-palette
|    +--- com.facebook.react:react-native:0.20.+ -> 0.44.2
|    |    +--- javax.inject:javax.inject:1
|    |    +--- com.android.support:appcompat-v7:23.0.1
|    |    |    \--- com.android.support:support-v4:23.0.1
|    |    |         \--- com.android.support:support-annotations:23.0.1 -> 24.2.1
...
|    \--- com.android.support:palette-v7:24.+ -> 24.2.1
|         +--- com.android.support:support-compat:24.2.1
|         |    \--- com.android.support:support-annotations:24.2.1
|         \--- com.android.support:support-core-utils:24.2.1
|              \--- com.android.support:support-compat:24.2.1 (*)
+--- com.android.support:appcompat-v7:23.0.1 (*)
\--- com.facebook.react:react-native:+ -> 0.44.2 (*)

我尝试了许多解决方案,但无法修复,直到更改中的com.android.support:appcompat版本android/app/build.gradle,我希望这可以有所帮助:

dependencies {
    compile project(':react-native-palette')
    compile project(':react-native-image-picker')
    compile project(':react-native-camera')
    compile fileTree(dir: "libs", include: ["*.jar"])
    // compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.android.support:appcompat-v7:24.2.1"
    compile "com.facebook.react:react-native:+"
}

似乎多个条目不是一个大问题,版本不匹配是


0

得到它的工作对compile file('...')通过的minSdkVersion提高至21并使multidex冲突。不知道这是否是最好的解决方案,但是我无法以我的情况进行工作。

注意:因为compile file('...')您似乎无法放入exclude子句,所以该选项不可用。


0

我遇到了同样的问题,我的解决方案是将支持版本“ 27。+”(27.1.0)更改为“ 27.0.1”


0

我有同样的问题。在我的项目中,我具有以下依赖关系:

  • appcompat-v7
  • android-support-v13

由于遗留原因,appcompat是从Google Maven存储库获取的,而android-support是本地的.jar。

当我弄清楚这一点并将其替换为maven引用后,它就解决了我的构建问题。

这是我的app / build.gradle的区别:

在此处输入图片说明


0

通过将其添加到project.properties中,我解决了所有问题

cordova.system.library.7=com.android.support:appcompat-v7:27.1.0

0

收到以下错误

任务':app:transformDexArchiveWithDexMergerForDebug'的执行失败。

com.android.build.api.transform.TransformException:com.android.dex.DexException:多个dex文件定义了Landroid / support / constraint / ConstraintSet $ 1

修复:转到Build-> Clean Project


嗨,欢迎来到堆栈溢出。但是,请不要重复答案,除了已经有24个答案之外,ashishduh还提供了建筑物清洁的答案。谢谢!
Elletlar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.