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

Posted

技术标签:

【中文标题】多个dex文件定义Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat【英文标题】:Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat 【发布时间】:2014-01-26 04:18:45 【问题描述】:

如果我从命令行运行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,我会在构建文件夹中看到两个文件。

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

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

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'

【问题讨论】:

我尝试了所有解决方案,但碰巧它们都不起作用。比我刚刚创建了一个同名的新项目,并从旧项目中复制了所有文件。现在效果很好。希望对您有所帮助。 我在 support-v13 中遇到了这个问题。经过大量调试并尝试了所有答案都无济于事,我发现它是在我尝试将 kotlin 集成到现有 java 项目的项目中时引入的。我删除了 kotlin 标准库和其他 kotlin 库,这很好。仍然会尝试解决 kot​​lin 的问题,但现在,我得工作了。任何信息都会有所帮助,真的很喜欢 kotlin。 【参考方案1】:

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

【讨论】:

是否有一种方法可以从 .jar 依赖项中检查/排除模块,这在 Maven 上不可用? gradle dependencies 似乎没有报告使用 compile files('libs/example.jar') 添加的依赖项 假设我有两个 libs/*.jar 依赖项和一个共同的模块,但都不能作为工件使用。有什么方法可以执行类似的依赖检查/类排除? @dbro:我不知道,但是,我还没有研究过这一点。恕我直言,这些 JAR 文件中的一个或两个都感觉打包错误,因为公共模块应该被分解到自己的 JAR 中。 ./gradlew -q :projectName:dependencies 为我工作 给那些从模块依赖中排除模块的人的快速提示:你必须把你的compile project(':foo')变成compile(project(':foo')) exclude module: 'support-v4' 。注意括号。【参考方案2】:

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

android 
    dexOptions 
        preDexLibraries = false
    

【讨论】:

为我工作!这样做有什么不好的地方吗? @BarrieGalitzky 到目前为止我还没有遇到任何问题 谢谢,这完美地解决了这个问题!无论如何,我认为它有一些副作用.. assembleDebug 任务变慢了 3 倍! dexOptions 未找到。 添加后出现“翻译已中断”错误。我想我得试试 CommonsWare 方法。【参考方案3】:

因为一张图片胜过一千个字

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

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

第二你会看到这样的:

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

SO,执行 gradle 命令:

第一:

第二:

很简单。

就是这样。

谢谢。

【讨论】:

【参考方案4】:

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

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

【讨论】:

更具体的说明?找不到“androidDependencies”。谢谢 转到 Gradle 视图,然后找到标题“所有任务”,向下钻取您的应用名称,然后向下钻取“:app”,您将在那里找到“androidDependencies”。 Gradle 视图在哪里? @PaulBeusterien 如果您查看窗口的最右侧,有一个标记为 Gradle 的侧边选项卡。单击它以打开固定视图。 androidDependencies 实际上是一个 gradle 任务 谢谢你,我发布了截图解释你的答案,以使其更容易。【参考方案5】:

升级到 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'

【讨论】:

保持支持版本相同是简单的解决方案,排除模块对我不起作用。 我也用第二种解决方案解决了!相同的冲突,但与 Butter Knife 版本 8.8.1 示例: implementation ('com.jakewharton:butterknife:8.8.1') exclude module: 'support-compat' annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' 【参考方案6】:

如果有人发现CommonsWare 的答案不能应用于android 库项目,这里是修复的sn-p

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

你会发现问题

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

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

区别在于"project"之前的手环"("")"

【讨论】:

谢谢,缺少双括号!【参考方案7】:
exclude module: 'support-v4'

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

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

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

【讨论】:

【参考方案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

【讨论】:

Multidexing 可以让你的应用启动速度变慢,只有在必要时才使用它。【参考方案9】:

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

【讨论】:

升级intellij后出现同样的错误,清理项目解决了问题。【参考方案10】:

我在旧项目中遇到了同样的错误。我的错是支持库被包含了两次:一次在 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'

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

Build tools 25
compileSdk 24
targetSdk 24
Support library 24

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

【讨论】:

【参考方案13】:

类似 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 文件。

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

【讨论】:

【参考方案14】:

如果您已从 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 后遇到的场景。

希望这会有所帮助..

【讨论】:

【参考方案15】:

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

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

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

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

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

首先,Android Studio 2.2 提供了用于跟踪此问题的构建功能。

快乐的编码人

【讨论】:

【参考方案16】:

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

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

【讨论】:

【参考方案17】:

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

在 Linux 上:

rm -rf ~/.gradle/caches/*

【讨论】:

【参考方案18】:

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

【讨论】:

这应该是一个评论,否则你应该用更好的方式解释它。【参考方案19】:

我可以通过简单地添加来解决我的 react native 项目中的问题

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

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

【讨论】:

【参考方案20】:

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

    compileSdkVersion 25 targetSdkVersion 25 编译'com.android.support:appcompat-v7:+' 编译'com.android.support:recyclerview-v7:+'

【讨论】:

【参考方案21】:

在我的项目中添加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 (*)

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

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:+"

看来多条目问题不大,版本不匹配是

【讨论】:

【参考方案22】:

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

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

【讨论】:

【参考方案23】:

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

【讨论】:

【参考方案24】:

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

appcompat-v7 android-support-v13

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

当我发现这一点并用 maven 引用替换这个本地引用时,它解决了我的构建问题。

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

【讨论】:

【参考方案25】:

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

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

【讨论】:

【参考方案26】:

收到以下错误

任务“:app:transformDexArchiveWithDexMergerForDebug”执行失败。

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

修复:转到构建 -> 清理项目

【讨论】:

您好,欢迎来到 Stack Overflow。但是请不要重复答案,除了已经有 24 个答案之外,ashishduh 已经提供了 building clean 作为答案。谢谢!

以上是关于多个dex文件定义Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat的主要内容,如果未能解决你的问题,请参考以下文章

Android Bug:Error:com.android.dex.DexException: Multiple dex files define Landroid/support/design/wi

Android Studio:Multiple dex files define Landroid/support/annotation/AnimRes

Android studio 报 multiple dex files define landroid/support/annotation/AnimRes 问题

NoClassDefFoundError:解析失败:Landroid/support/v7/appcompat/R$styleable

无法使用 RealmAdapter - java.lang.NoClassDefFoundError:解析失败:Landroid/support/v7/widget/TintManager;

java.lang.NoClassDefFoundError:无法解决:Landroid/support/v4/content/LocalBroadcastManager 仅在构建 APK 上