在接入第三方SDK的时候经常会遇到一些依赖的冲突等问题,需要解决,主要有以下的几种方式:
gradle dependencies
通过gradle dependencies
可以找出整个应用的依赖,按照层级展示
- 可以看出每一个依赖包都是由:group-moudle-version组成的
- 后面带
(*)
的代表该Library或者aar包下存在相同的依赖 ->
代表最终使用的版本,可以看到如果存在相同的依赖包时,会优先使用高版本的依赖包,这可能就存在冲突
transitive
Transitive用于自动处理子依赖项。默认为true,gradle自动添加子依赖.设置为false,则需要手动添加每个依赖项。例如:
对com.meituan.mapsdk2d
来说,当transitive为true时会自动添加其下的依赖,当transitive为false时,如下图:
你需要手动添加它所需要的依赖。
通过下面的可以统一指定transitive
如果你所依赖的包比较少,希望自己管理每个包时,适合这种方式,但是当引入的sdk很多时,这种方式就有些力不从心了。
版本覆盖
当存在相同的依赖时,会用a->b
的这种形式告诉你a版本的被b版本的覆盖了,通过上图可以看到高版本的会覆盖低版本的依赖。这时就可能会存在问题,如果高版本的不兼容低版本的,引入低版本依赖的sdk就会报错,存在冲突。
force
force可以强制指定某个版本的依赖
我们可以看到support包被强制指定成23.4.0版本了
exclude
exclude规则可以帮我们排除指定的依赖。例如所有依赖里匹配的或者指定排除某个依赖里的,有group和moudle参数,可以分别使用。
例如:
可以看到v7包都没有了。
但我们也可以单独给某个模块下添加exclude
可以看到mapsdk下的v7包没了,下面的还是存在的
不同compile下的冲突
相同compile下的依赖会自动改成依赖高版本,不同compile则会产生冲突
扩展阅读
https://docs.gradle.org/current/userguide/dependency_management.html