AAR图书馆传递依赖冲突?

时间:2016-06-20 17:38:12

标签: android android-gradle aar transitive-dependency

我正在使用在本地maven存储库上发布的aar。 由于我想要包含传递依赖项,因此我将transitive属性添加到了我的依赖项中:

compile ('com.mycompany.domain:artifact:1.0.0@aar') {
    transitive = true
}

现在,让我们说这个项目添加了对cardView支持库v23的依赖:

compile "com.android.support:cardview-v7:23.4.0"

如果我还在v24 cardView库上添加依赖项,我的apk版本文件会发生什么:

compile "com.android.support:cardview-v7:24.0.0"

Gradle是否能够管理这种双重依赖并采用最新的双依赖而不会产生冲突?或者,在不使用transitive属性的情况下手动指定依赖项更安全。

此外,transitive属性是否还会导入aar可能设置的proGuard规则?

感谢您的帮助,

2 个答案:

答案 0 :(得分:3)

只是添加一些细节。

您使用的是@aar表示法 这意味着您只想下载aar工件,而不是依赖项 您可以查看[文档] [1]的这一部分:
查看1.4.1.2. Artifact only notation部分:

  

仅工件表示法创建模块依赖项,该依赖项仅下载具有指定扩展名的工件文件。 忽略现有模块描述符

如果要下载依赖项,请使用@aar表示法,您应该添加transitive=true,否则您可以省略@aar,它将在不添加传递属性的情况下工作。

关于依赖性。
Gradle将自动管理依赖项 使用默认配置,gradle将下载最新版本。

在任何情况下,您还可以排除 build.gradle中的依赖关系。

 compile('mylibrary:1.0.0') {
     //excluding a particular transitive dependency:
     exclude module: 'xxx' //by artifact name
     exclude group: 'xxx.xxx' //by group
     exclude group: 'xxx.xxxx', module: 'xxxx' //by both name and group

     //disabling all transitive dependencies of this dependency
     transitive = false
 }

答案 1 :(得分:0)

我在Gradle官方文档中找到了答案:Gradle Depedency Management link

Gradle Dependency解算器会自动执行此操作。 Gradle提供的两个主要冲突解决策略是:

最新版本:使用最新版本的依赖项。这是Gradle的默认策略,只要版本向后兼容,它通常是一个合适的选择。

失败:版本冲突会导致构建失败。此策略要求在构建脚本中显式解决所有版本冲突。有关如何明确选择特定版本的详细信息,请参阅ResolutionStrategy。

此外,如果在库中声明了以下声明(see this answer for more details),则应导出规则,导出规则:

defaultConfig {
    consumerProguardFiles 'proguard-rules.txt'
}
相关问题