如果我从命令行运行 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'
}
运行 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
我通过在 android 块内的 build.gradle 文件中添加以下代码解决了类似的错误。
android {
dexOptions {
preDexLibraries = false
}
}
因为一张图胜过千言万语
为了让像我这样的初学者更容易和更快地完成这项任务。这是显示@edsappfactory.com 发布的对我有用的答案的屏幕截图:
首先打开 Androidstudio 右侧的 Gradle 视图,在您应用的项目中转到 Tasks
,然后转到 Android
,然后右键单击 androidDependencies
,然后选择 Run
:
https://i.stack.imgur.com/DPJkT.png
其次你会看到这样的东西:
https://i.stack.imgur.com/n5Klg.png
我发布此内容的主要原因是不容易知道在哪里执行 gradle
任务或上面发布的命令。所以这也是执行它们的地方。
所以,要执行 gradle 命令:
第一的:
https://i.stack.imgur.com/louca.png
第二:
https://i.stack.imgur.com/eThSB.png
很容易。
而已。
谢谢你。
另请注意,您可以通过转到 Android Studio Gradle 视图并选择目标“androidDependencies”来查看您的 android 依赖项。
另一个提示:我遇到了这个问题,直到我从项目和相关模块/库项目的 libs 文件夹中删除了 v4 支持库。
升级到 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'
如果有人发现 CommonsWare 的答案无法应用于 android 库项目,这里是要修复的代码段
compile (project(':yourAndroidLibrary')){ exclude module: 'support-v13' }
你会发现问题
发现不支持的 Gradle DSL 方法:“exclude()”
如果你使用 compile project(':yourAndroidLibrary'){ exclude module: 'support-v13' }
区别在于“项目”之前的手镯“(”和“)”。
exclude module: 'support-v4'
不适用于我的项目依赖项,我可以让它工作的唯一方法是通过以下语法:
configurations {
dependencies {
compile(project(':Android-SDK')) {
compile.exclude module: 'support-v4'
}
}
}
其中 :Android-SDK 是您的项目名称。
我遇到了同样的问题,由于库的原因,我的应用程序似乎有太多方法: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
我遇到了同样的错误,但这是因为我最近从使用 v4 更改为 v13。所以我所要做的就是清理项目。
我在遗留项目上遇到了同样的错误。我的错是支持库被包含了两次:一次在 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'
}
希望它可以帮助某人:-)
我正在使用 com.google.android.gms:play-services-analytics:8.3.0
和 android-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')
}
在我的情况下,问题是由版本不一致引起的:
Build tools 25
compileSdk 24
targetSdk 24
Support library 24
解决方案很简单:将所有内容都设为 25 版
一个类似的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 文件。
并消除冗余。这对我有用。
如果您已从 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 后遇到的情况。
希望这可以帮助..
这是一个烦人的问题,可能需要一些时间才能找出根本案例。你应该继续的方式是@CommonsWare 回答。
我最近遇到了这个问题,发现很难解决。
我的问题是我在 build.gradle 中包含了一个“+”版本的库。最新版本的库包含较旧的 dex 和 bang 之一。
我恢复到旧版本的库并解决了它。
最好运行你的 androidDependencies 并查看实际发生的情况。在您的构建文件夹中搜索也很好。
最重要的是,Android Studio 2.2 提供了构建功能来跟踪这个问题。
快乐的编码人员
在 Android Studio 中,转到您的 build.gradle(检查项目和模块 build.gradle 文件)并搜索重复的依赖项。
删除您的项目不需要的那些。
从 Gradle 缓存中删除所有文件解决了我的问题。
在 Linux 上:
rm -rf ~/.gradle/caches/*
我在依赖项中删除了 compile 'com.android.support:support-v4:18.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 文件的末尾
最后,我解决了它在模块 gradle 文件上修改这些属性
compileSdkVersion 25 targetSdkVersion 25 编译 'com.android.support:appcompat-v7:+' 编译 'com.android.support:recyclerview-v7:+'
将 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:+"
}
似乎多个条目不是什么大问题,版本不匹配是
通过将 minSdkVersion 增加到 21 并启用 multidex 来解决 compile file('...')
冲突。不确定这是否是最好的解决方案,但我可以让它在我的情况下工作的唯一方法。
注意:对于 compile file('...')
,您似乎不能放入 exclude
子句,因此该选项不可用。
我遇到了同样的问题,我的解决方案是将支持版本 '27.+'(27.1.0) 更改为 '27.0.1'
我有同样的问题。在我的项目中,我有以下依赖项:
appcompat-v7
安卓支持-v13
由于遗留原因,appcompat 是从 Google Maven 存储库中获取的,而 android-support 是本地 .jar。
当我弄清楚这一点并用 Maven 引用替换这个本地引用时,它就解决了我的构建问题。
这是我的 app/build.gradle 的差异:
https://i.stack.imgur.com/oqMdB.jpg
我通过将其添加到 project.properties 解决了我的所有问题
cordova.system.library.7=com.android.support:appcompat-v7:27.1.0
收到以下错误
任务 ':app:transformDexArchiveWithDexMergerForDebug' 执行失败。
com.android.build.api.transform.TransformException: com.android.dex.DexException: 多个dex文件定义Landroid/support/constraint/ConstraintSet$1
修复:转到构建 -> 清理项目
不定期副业成功案例分享
gradle dependencies
似乎没有报告使用compile files('libs/example.jar')
添加的依赖项libs/*.jar
依赖项与一个共同的模块,都不能作为工件使用。有什么方法可以执行类似的依赖检查/类排除?compile project(':foo')
变成compile(project(':foo')) { exclude module: 'support-v4' }
。注意括号。