gradle - 依赖项中的库重复

Posted

技术标签:

【中文标题】gradle - 依赖项中的库重复【英文标题】:gradle - library duplicates in dependencies 【发布时间】:2015-08-19 07:41:25 【问题描述】:

我有一个带有 gradle 的 android 项目。问题是: 在project 视图中,我看到几个版本的support-v4 库,例如support-v4-21.0.3support-v4-22.2.0

但是在build.gradle 我根本没有support-v4

但我在 build.gradle 中有大约 10 个其他依赖项。例如 appcompat-v7:22.2.0。我可以建议 appcompat-v7:22.2.0 依赖于 maven 依赖项中的 support-v4-22.2.0 并隐式提取它。但我不知道谁拉support-v4-21.0.3

据我所知,所有这些库都将打包在我的 APK 中并增加 APK 的重量。

所以我有下一个问题:

    如何避免库重复? 如何在Android Studio中查看maven依赖? 如何检测哪个库需要这个库?例如,我的项目中哪个库需要 support-v4-21.0.3

【问题讨论】:

【参考方案1】:

要查找重复的依赖项或其所需的依赖项,您可以在树中可视化库依赖项。如下执行gradle命令。

gradle -q dependencies yourProject:dependencies --configuration compile

请注意,在 Windows 中运行gradlew,如下所示。

gradlew -q dependencies yourProject:dependencies --configuration compile

命令结果将显示所有依赖项的人类可读树层次结构,如下所示。

compile - Classpath for compiling the main sources.
+--- org.androidannotations:androidannotations-api:3.2
+--- com.android.support:support-annotations:22.1.1
+--- com.squareup:otto:1.3.6
+--- in.srain.cube:grid-view-with-header-footer:1.0.10
+--- com.nostra13.universalimageloader:universal-image-loader:1.9.3
+--- com.github.chrisbanes.photoview:library:1.2.3
+--- org.simpleframework:simple-xml:2.7.1
+--- com.google.android.gms:play-services-base:6.5.+ -> 6.5.87
+--- project :yourProject
|    +--- com.loopj.android:android-async-http:1.4.6
|    +--- org.apache.httpcomponents:httpmime:4.2.5
|    |    \--- org.apache.httpcomponents:httpcore:4.2.4
|    \--- com.google.code.gson:gson:2.3.1
+--- project :facebook
|    \--- com.android.support:appcompat-v7:22.1.1
|         \--- com.android.support:support-v4:22.1.1
|              \--- com.android.support:support-annotations:22.1.1 -> 22.2.0

您可以查看被覆盖的依赖项并决定应该避免哪些依赖项。在上面的示例中,最后一行 com.android.support:support-annotations 表示内部从 22.1.1 覆盖到 22.2.0

为避免重复,您可以在每个项目build.gradle文件中添加exclude子句。

compile('com.github.chrisbanes.photoview:library:1.2.3') 
    exclude group: 'com.android.support'


compile('org.simpleframework:simple-xml:2.7.1') 
    exclude module: 'stax'
    exclude module: 'stax-api'
    exclude module: 'xpp3'


compile('com.google.android.gms:play-services-base:6.5.+') 
    exclude module: 'support-v4'

更多信息,您可以在https://docs.gradle.org/current/userguide/userguide_single.html#sec:listing_dependencies查看教程

【讨论】:

完美。在我的情况下,它给了我太多的输出,所以在 and 处添加类似 --configuration compile 的东西是个好主意。 感谢您的回答,节省我的时间。 当我有重复的依赖项时,我如何通过读取输出来判断?我正在查看树但不知道如何读取它。是否建议向后工作?如果 android studio 抱怨 gradle 中有重复项,那么我会在树中搜索所有包含该代码的包并将其排除在外吗?就是这样完成的。 为此使用exclude 是一个可怕的想法——库有一个最低版本的依赖项是有原因的。如果您排除依赖项,则行为很可能会有所不同,或者您将遇到崩溃。编译后的 APK 中永远不会有重复的类(因此依赖项显示它们已升级为 APK 中的单个版本) 此排除项会减小最终 APK 的大小吗?还是只是为了更快地构建?

以上是关于gradle - 依赖项中的库重复的主要内容,如果未能解决你的问题,请参考以下文章

可以使Maven构建包含依赖项中的.class文件[重复]

如何从 Gradle 中的所有依赖项中忽略特定的传递依赖项

如何从 Kotlin DSL build.gradle 中的所有依赖项中排除库?

makefile中的特殊符号及关键字

两个官方 android 库中的重复类,gradle 失败

Android gradle依赖冲突和资源重复值