gradle - 库在依赖项中重复

anb*_*ber 47 android gradle maven android-studio

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

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

但我有~10个其他依赖项build.gradle.例如 appcompat-v7:22.2.0.我可以表明,appcompat-v7:22.2.0实际上还要考虑support-v4-22.2.0在Maven的依赖关系,并含蓄地将其拉.但我没有任何想法support-v4-21.0.3.

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

所以我有下一个问题:

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

You*_*jae 88

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

gradle -q dependencies yourProject:dependencies --configuration compile
Run Code Online (Sandbox Code Playgroud)

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

gradlew -q dependencies yourProject:dependencies --configuration compile
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

您可以看到覆盖依赖关系,并考虑应该避免哪些依赖关系.在上面的例子中,最后一行com.android.support:support-annotations呈现从重写22.1.122.2.0内部.

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

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'
        }
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅https://docs.gradle.org/current/userguide/userguide_single.html#sec:listing_dependencies上的教程.

  • 使用`exclude`这是一个可怕的想法 - 库有一个最小版本的依赖项是有原因的.如果排除依赖关系,则很可能行为不同或者您将遇到崩溃.您在编译的APK中永远不会有重复的类(因此,为什么依赖项显示它们已升级为APK中的单个版本) (2认同)