gradle - 依赖项中的库重复 [英] gradle - library duplicates in dependencies

查看:45
本文介绍了gradle - 依赖项中的库重复的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个带有 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 的权重.

所以我有下一个问题:

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

解决方案

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

gradle -q dependencies yourProject:dependencies --configuration compile

请注意,在 Windows 中运行 gradlew 如下.

gradlew -q dependencies yourProject:dependencies --configuration compile

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

compile - 用于编译主要源代码的类路径.+--- 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+--- 项目 :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+--- 项目:脸书|\--- 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') {排除组:'com.android.support'}编译('org.simpleframework:simple-xml:2.7.1'){排除模块:'stax'排除模块:'stax-api'排除模块:'xpp3'}编译('com.google.android.gms:play-services-base:6.5.+'){排除模块:'support-v4'}

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

I have an Android project with gradle. The problem is: In project view I see few versions of support-v4 libraries, for example support-v4-21.0.3 and support-v4-22.2.0.

But in build.gradle I don't have support-v4 at all.

But I have ~10 other dependencies in build.gradle. For example appcompat-v7:22.2.0. I can suggests that appcompat-v7:22.2.0 depens on support-v4-22.2.0 in maven dependencies and implicitly pulls it. But I have no ideas who pulls support-v4-21.0.3.

As far as I know all this libs will packed in my APK and increase weight of APK.

So I have next questions:

  1. How to avoid library duplicates?
  2. How to see maven dependencies in Android Studio?
  3. How detect which library require this library? For example which library require support-v4-21.0.3 in my project?

解决方案

To find duplicate dependencies or its required dependencies, you can visualize library dependencies in tree. Execute gradle command as below.

gradle -q dependencies yourProject:dependencies --configuration compile

Note that, run gradlew in Windows as below.

gradlew -q dependencies yourProject:dependencies --configuration compile

The command result will show you human-readable tree hierarchy of all dependencies as below.

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

You can see overriden dependencies and decide in mind which ones should be avoided. In above example, last line com.android.support:support-annotations presents overriden from 22.1.1 to 22.2.0 internally.

To avoid duplicates, you can add exclude clauses in each project build.gradle file.

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'
}

For more information, you can see the tutorial at https://docs.gradle.org/current/userguide/userguide_single.html#sec:listing_dependencies

这篇关于gradle - 依赖项中的库重复的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆