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

时间:2014-01-08 07:20:46

标签: android gradle android-support-library android-gradle

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

我的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支持库?

这是播放服务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'
}

26 个答案:

答案 0 :(得分:298)

运行 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

答案 1 :(得分:123)

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

android {
    dexOptions {
        preDexLibraries = false
    }
}

答案 2 :(得分:33)

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

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

答案 3 :(得分:32)

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

让像我这样的初学者更轻松,更快地完成这项任务。这是截图,显示 @ edsappfactory.com 发布的答案对我有用:

首先打开Androidstudio右侧的Gradle视图,在您应用的商品中转到Tasks然后Android,然后右键点击{{1然后选择androidDependencies

step 1

第二次你会看到类似这样的内容:

Step 2

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

所以,执行gradle命令:

首先:

first

第二

second

很容易。

多数民众赞成。

谢谢。

答案 4 :(得分: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'

到此:

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'

答案 5 :(得分:9)

如果有人发现CommonsWare的答案无法应用于Android库项目,请点击此处修改

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

你会发现问题

  

发现不支持的Gradle DSL方法:'exclude()'

如果你使用 编译 project(':yourAndroidLibrary') {         排除模块:'support-v13'     }

差异是“项目”之前的手镯“(”“)”

答案 6 :(得分:8)

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

解决它:

android {
   defaultConfig {
   ...
   multiDexEnabled = true
   }
}

更多Error:Execution failed for task ':app:dexDebug'. > comcommand finished with non-zero exit value 2

答案 7 :(得分:7)

exclude module: 'support-v4'

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

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

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

答案 8 :(得分:6)

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

答案 9 :(得分: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'
}

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

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

答案 10 :(得分: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文件。

删除冗余。
这对我有用。

答案 11 :(得分:3)

在我的情况下,问题是由版本不一致引起的:

Build tools 25
compileSdk 24
targetSdk 24
Support library 24

解决方案很简单:制作所有版本25

答案 12 :(得分:2)

从Gradle缓存中删除所有文件解决了我的问题。

Linux上的

StringBuilder binaryStr = new StringBuilder();
for (byte b : str.getBytes("UTF-8"))
    for (int i = 7; i >= 0; i--)
        binaryStr.append((b >> i) & 1);
String result = binaryStr.toString();

答案 13 :(得分:2)

这是一个烦人的问题,可能需要一些时间才能找出根案例。你应该继续的方式是@CommonsWare回答。

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

我的问题是我在#34; +" build.gradle中的版本。最新版本的库包含了一个较旧的dex和bang。

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

最好运行你的androidDependencies,看看到底发生了什么。它也适合在你的构建文件夹中搜索。

首先, Android Studio 2.2 提供构建功能来跟踪此问题。

快乐的编码家伙

答案 14 :(得分:2)

我正在使用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')

}

答案 15 :(得分: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后我遇到的情况。

希望这会有所帮助..

答案 16 :(得分:2)

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

删除项目不需要的那些。

答案 17 :(得分:1)

我删除了  编译' com.android.support:support-v4:18.0。+' 在依赖项中,它的工作原理

答案 18 :(得分:0)

最后,我解决了它在模块gradle文件

上修改这些属性的问题
  1. compileSdkVersion 25
  2. targetSdkVersion 25
  3. 编译'com.android.support:appcompat-v7:+'
  4. 编译'com.android.support:recyclerview-v7:+'

答案 19 :(得分: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:+"
}

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

答案 20 :(得分:0)

通过将minSdkVersion增加到21并启用multidex,使其适用于compile file('...')冲突。不确定这是否是最好的解决方案,但唯一可以让我在我的情况下使用它。

注意:对于compile file('...'),您似乎无法输入exclude子句,因此该选项不可用。

答案 21 :(得分:0)

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

答案 22 :(得分:0)

我遇到了同样的问题。 在我的项目中,我有以下依赖项:

  • 程序兼容性-V7
  • 机器人支撑-V13

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

当我想出这个,并用maven引用替换了这个本地引用时,它刚刚解决了我的构建问题。

这是我的app / build.gradle的差异:

enter image description here

答案 23 :(得分:0)

我通过将其添加到project.properties

中解决了我的所有问题
cordova.system.library.7=com.android.support:appcompat-v7:27.1.0

答案 24 :(得分:0)

收到以下错误

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

  

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

修复:转到Build-> Clean Project

答案 25 :(得分:0)

我只需添加

就可以解决我的本机项目中的问题
configurations {
        all*.exclude group: 'com.android.support', module: 'support-compat'
        all*.exclude group: 'com.android.support', module: 'support-core-ui'
    }

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