解决android依赖冲突问题 - kevenzxd/GoodPractice GitHub Wiki
在编译过程中,经常会遇到以下编译问题:"Duplicate zip entry"
Warning: Exception while processing task java.io.IOException: Can't write [.../app/build/intermediates/transforms/proguard/release/0.jar] (Can't read [/Users/xidongzhang/.gradle/caches/transforms-1/files-1.1/play-services-measurement-base-15.0.2.aar/d1f6f11a3fa8c37a85bada33d054c87c/jars/classes.jar(;;;;;;**.class)] (Duplicate zip entry [classes.jar:com/google/android/gms/internal/measurement/zzabn.class]))
FAILURE: Build failed with an exception.
从log中能看出来,是由于我们使用了多个相同的库,但是他们依赖的版本并不相同,那么我们怎么能找出那些库之间依赖的相同的第三方库,但是版本不相同呢?
分三步
-
找出错误中出现的group的名称,已经相应的module,通过命令:./gradlew -q :app:dependencies > ../dependencies.txt到处当前app module 中所有依赖关系。
-
在dependencies.txt文件中,找出Duplicate文件。
举个例子:
发生问题时候的内容截图:
可以看到,firebase-messaging和firebase-core分别引用了play-services-measurement-base支持库,但是他们的版本号是不相同的,这样,我们可以判定,是由于这两个库的引用,导致了编译的冲突,那么接下来我们需要更改有冲突的版本。
- 更改有冲突版本让他们有同样的依赖库,
例子中的冲突发生在google库中,那么,我们到maven上看看有哪些版本可以下载:
https://dl.google.com/dl/android/maven2/index.html
可以看到,core和messaging的15+版本中,最新的分别是15.0.2和15.0.2
更改项目中的版本号。
再通过生成dependnces的命令来查看结果
可以看到,core里边的引用没有变化,但messaging中重复引用已经没有了,问题解决。
具体文件可以查看:
https://github.com/kevenzxd/GoodPractice/blob/master/files/dependence_issue/dependencies_failed.txt https://github.com/kevenzxd/GoodPractice/blob/master/files/dependence_issue/dependencies_success.txt
附: 以上为解决复杂引用的解决方案,如果想简单解决可以使用
exclude方式解决
例如:
// for facebook account kit
implementation ("com.facebook.android:account-kit-sdk:4.28.0") {
transitive = true
exclude group: 'com.googlecode.libphonenumber'
}
// for facebook account kit
implementation ("com.facebook.android:account-kit-sdk:4.28.0") {
force = true
}
configurations.all {
resolutionStrategy {
force 'org.hamcrest:hamcrest-core:1.3'
}
}