无法从 Android 项目中的 gradle 移除传递依赖

Not able to remove transitive dependency from gradle in an Android Project

我正在尝试从我的 Android 项目中删除 传递依赖项 并且由于某些原因 exclude 在我尝试删除依赖项时不起作用来自我的特殊依赖。

例如我想从我的项目

中删除support-annotations

如果我使用

configurations {
    all*.exclude group: 'com.android.support', module:'support-annotations'
}

从依赖关系树中排除依赖关系。我可以使用 ./gradlew app:dependencies

查看依赖树

但是如果我使用

 compile('com.android.support:support-v4:23.4.0')
            {
                exclude group: 'com.android.support', module:'support-annotations'
            }

然后我仍然在依赖树中看到依赖。

所以我的问题是为什么当我尝试从特定依赖项中删除依赖项时它不起作用?

更新 1:

谁能告诉我树中依赖项旁边的 star (*) 符号代表什么?

更新 2

我也在使用 Fresco 我用 Fresco 尝试过同样的事情 exclude rule 似乎适用于它

Fresco 的依赖树

当我在 Fresco

中排除 imagepipeline-base 时的依赖树
compile("com.facebook.fresco:fresco:0.9.0")
            {
                exclude group: 'com.facebook.fresco', module: 'imagepipeline-base'
            }

如您所见,imagepipeline-base 依赖项被排除在外。 所以我不知道为什么这不适用于 Android 支持注释传递依赖性

所以我在一位朋友的帮助下解决了这个问题。我无法删除 support-annotation 的原因是因为大多数其他依赖项都使用 support-v4 作为传递依赖项,而那些 support-v4 也有自己的 support-annotation 副本。

现在有 2 个解决方案

解决方案一:

从包含support-v4作为传递依赖的所有依赖中排除support-annotation

方案二:

仅从我的 support-v4 依赖项中排除 support-annotation 并从具有 support-v4 作为传递依赖项的所有其他依赖项中删除 support-v4 依赖项。

注意:使用上述方法之一我能够解决我的问题并弄清楚当它们被多个依赖项引用时我们如何删除传递依赖项。

关于 ( * ) 符号,这意味着已经显示了该依赖项的依赖树。 gradle 不再显示这些依赖项的 整棵树 而是显示 ( * ) 符号。

示例 build.gradle 文件可用 here

还有更优雅的解决方案:您可以在 build.gradle 文件中使用 configueation.all 块,例如下面的示例:

configurations.all {
  exclude group: 'com.android.support', module: 'support-annotations'
}

它应该排除应用程序中所有内部模块的所有传递依赖项。