解决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中能看出来,是由于我们使用了多个相同的库,但是他们依赖的版本并不相同,那么我们怎么能找出那些库之间依赖的相同的第三方库,但是版本不相同呢?

分三步

  1. 找出错误中出现的group的名称,已经相应的module,通过命令:./gradlew -q :app:dependencies > ../dependencies.txt到处当前app module 中所有依赖关系。

  2. 在dependencies.txt文件中,找出Duplicate文件。

举个例子:

发生问题时候的内容截图: core messaging

可以看到,firebase-messaging和firebase-core分别引用了play-services-measurement-base支持库,但是他们的版本号是不相同的,这样,我们可以判定,是由于这两个库的引用,导致了编译的冲突,那么接下来我们需要更改有冲突的版本。

  1. 更改有冲突版本让他们有同样的依赖库,

例子中的冲突发生在google库中,那么,我们到maven上看看有哪些版本可以下载:

https://dl.google.com/dl/android/maven2/index.html

可以看到,core和messaging的15+版本中,最新的分别是15.0.2和15.0.2

更改项目中的版本号。

再通过生成dependnces的命令来查看结果 core messaging

可以看到,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'
   }
}