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

xrd*_*xrd 210 android gradle android-support-library android-gradle-plugin

如果我从命令行运行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)
Run Code Online (Sandbox Code Playgroud)

如果我grep for v4,我会在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
Run Code Online (Sandbox Code Playgroud)

我的gradle文件仅包含此支持库:

compile 'com.android.support:support-v13:19.0.0'
Run Code Online (Sandbox Code Playgroud)

关于如何以某种方式包含r7库,我很难过.我跑了gradle clean,当我重新运行assembleDebug时它总是出现在那里.

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

Binary file build/exploded-bundles/ComGoogleAndroidGmsPlayServices4030.aar/classes.jar matches
Run Code Online (Sandbox Code Playgroud)

如果我不包含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'
}
Run Code Online (Sandbox Code Playgroud)

Com*_*are 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
Run Code Online (Sandbox Code Playgroud)

然后,使用该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.+'
}
Run Code Online (Sandbox Code Playgroud)

(其中第二个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
Run Code Online (Sandbox Code Playgroud)

  • 那些从模块依赖项中删除模块的快速提示:你必须将`compile project(':foo')`转换为`compile(project(':foo')){exclude module:'support-v4'}` .注意括号. (15认同)
  • ./gradlew -q:projectName:依赖项对我有用 (12认同)
  • 是否有一种方法可以检查/排除Maven上不可用的.jar依赖项中的模块?`gradle dependencies`似乎不报告使用`compile files('libs/example.jar')`添加的依赖项 (3认同)
  • 假设我有一个共同模块的两个`libs/*.jar`依赖项,它们都不能用作工件.有没有办法执行类似的依赖检查/类排除? (3认同)
  • @dbro:不是我知道的,但是,我再也没有研究过这一点.恕我直言,关闭袖口,这些JAR文件中的一个或两个感觉错误打包,因为共同的模块应该被分解到它自己的JAR中. (2认同)
  • 对不起我是新手如何运行"gradle -q依赖"我不知道如何找到gradle.exe (2认同)
  • ./gradlew -q依赖项应该具有相同的效果吧?当我这样做时,我得到一个标题为“ Root project”的文件,并在其下一行“ No configuration”。还有谁有相同的问题吗? (2认同)
  • 嗨,我有类似的问题.我正在运行`gradlew -q dependencies`你所建议的唯一输出是`------------------------------- -----------------------------根项目------------------- -----------------------------------------没有配置`我做错了什么? (2认同)

mik*_*hik 122

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

android {
    dexOptions {
        preDexLibraries = false
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 添加此内容后,我收到"翻译已中断"错误.猜猜我一定要试试CommonsWare方法. (10认同)
  • 为我工作!这样做有什么不好的方面吗? (4认同)
  • 谢谢你,这完美地解决了这个问题!无论如何,我认为它有一些副作用.. assembleDebug任务变得慢了3倍! (3认同)

MBH*_*MBH 35

因为一张图片胜过千言万语

为了让像我这样的初学者完成这项任务变得更容易,更快捷.这是截图显示@ edsappfactory.com发布的答案对我有用:

首先打开Androidstudio右侧的摇篮视图,在您的应用程序的项目去Tasks,然后Android再用鼠标右键单击androidDependencies,然后选择Run:

步骤1

其次你会看到这样的东西:

第2步

我发布这个的主要原因是,要知道在哪里执行gradle任务或上面发布的命令并不容易.所以这也是执行它们的地方.

那么,执行gradle命令:

第一:

第一

第二:

第二

很容易.

而已.

谢谢.


Ed *_*ers 33

另外要注意,您可以通过转到Android Studio Gradle视图并选择目标"androidDependencies"来查看您的Android依赖项.

还有一个提示:我遇到了这个问题,直到我从项目和相关模块/库项目中的libs文件夹中删除了v4支持lib.

  • @PaulBeusterien如果你看向窗户的最右侧,有一个标有Gradle的侧面标签.单击它以打开固定视图.androidDependencies实际上是一个gradle任务 (4认同)
  • 更具体的指示?找不到"androidDependencies".谢谢 (3认同)
  • Gradle视图在哪里? (2认同)

use*_*927 10

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

我曾经gradle -q :app:dependencies看到树,然后查看jar文件,直到我发现冲突.冲突是,butterknife的依赖com.android.support:support-compat:25.1.0包含了一个可访问类的版本,并且com.android.support:support-v4:23.1.1还包含该类.

我通过改变我对此的依赖来解决它:

compile 'com.jakewharton:butterknife:8.5.1'
Run Code Online (Sandbox Code Playgroud)

对此:

compile('com.jakewharton:butterknife:8.5.1') {
    exclude module: 'support-compat'
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,它似乎并未影响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'
Run Code Online (Sandbox Code Playgroud)

  • 我解决了第二个解决方案,谢谢! (2认同)

Ton*_*son 9

如果有人发现CommonsWare的答案无法应用于android库项目,这里是要解决的片段

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

你会发现问题

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

如果您使用编译项目(':yourAndroidLibrary') {exclude module:'support-v13'}

不同之处是"项目"之前的手镯"("")".


小智 8

我有同样的问题,似乎我的应用程序有太多的方法因为库:http: //developer.android.com/tools/building/multidex.html

解决了它:

android {
   defaultConfig {
   ...
   multiDexEnabled = true
   }
}
Run Code Online (Sandbox Code Playgroud)

更多信息错误:任务':app:dexDebug'的执行失败.> comcommand以非零退出值2结束


Pel*_*let 7

exclude module: 'support-v4'
Run Code Online (Sandbox Code Playgroud)

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

configurations {
    dependencies {
        compile(project(':Android-SDK')) {
            compile.exclude module: 'support-v4'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


ash*_*duh 6

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


vog*_*Dev 5

我在遗留项目上遇到了同样的错误.我的错是支持库被包含两次:一次进入google-play-services lib,另一次进入独立.

这就是我修复它的方法:

BAD 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'
}
Run Code Online (Sandbox Code Playgroud)

GOOD 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'
}
Run Code Online (Sandbox Code Playgroud)

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