Android依赖管理

在接入第三方SDK的时候经常会遇到一些依赖的冲突等问题,需要解决,主要有以下的几种方式:

gradle dependencies

通过gradle dependencies可以找出整个应用的依赖,按照层级展示

  • 可以看出每一个依赖包都是由:group-moudle-version组成的
  • 后面带(*)的代表该Library或者aar包下存在相同的依赖
  • ->代表最终使用的版本,可以看到如果存在相同的依赖包时,会优先使用高版本的依赖包,这可能就存在冲突

transitive

Transitive用于自动处理子依赖项。默认为true,gradle自动添加子依赖.设置为false,则需要手动添加每个依赖项。例如:

com.meituan.mapsdk2d来说,当transitive为true时会自动添加其下的依赖,当transitive为false时,如下图:

你需要手动添加它所需要的依赖。

通过下面的可以统一指定transitive

1
2
3
configurations.all {
transitive = false
}

如果你所依赖的包比较少,希望自己管理每个包时,适合这种方式,但是当引入的sdk很多时,这种方式就有些力不从心了。

版本覆盖


当存在相同的依赖时,会用a->b的这种形式告诉你a版本的被b版本的覆盖了,通过上图可以看到高版本的会覆盖低版本的依赖。这时就可能会存在问题,如果高版本的不兼容低版本的,引入低版本依赖的sdk就会报错,存在冲突。

force

force可以强制指定某个版本的依赖

1
2
3
4
5
configurations.all {
resolutionStrategy {
force 'com.android.support:support-v4:23.4.0'
}
}


我们可以看到support包被强制指定成23.4.0版本了

exclude

exclude规则可以帮我们排除指定的依赖。例如所有依赖里匹配的或者指定排除某个依赖里的,有group和moudle参数,可以分别使用。

例如:

1
2
3
4
5
6
7
8
configurations {
all*.exclude group: 'com.android.support' moudle: 'appcompat-v7'
}
dependencies {
compile 'com.meituan.mapsdk2d:sdk2d:0.2.5'
compile 'com.android.support:appcompat-v7:23.4.0'
}

可以看到v7包都没有了。
但我们也可以单独给某个模块下添加exclude

1
2
3
4
5
compile ('com.meituan.mapsdk2d:sdk2d:0.2.5'){
transitive = true
exclude group: 'com.android.support', module: 'appcompat-v7'
}
compile 'com.android.support:appcompat-v7:23.4.0'


可以看到mapsdk下的v7包没了,下面的还是存在的

不同compile下的冲突

相同compile下的依赖会自动改成依赖高版本,不同compile则会产生冲突

扩展阅读

https://docs.gradle.org/current/userguide/dependency_management.html