Gradle命令
打开AndroidStudio的Terminal(windows环境下),输入下面命令:
gradlew :app:dependencies --configuration compile //查看编译时依赖树
gradle dependencies -configuration runtime //查看运行时依赖树
gradle dependencies //查看所有依赖库
什么是传递依赖
在Maven仓库中,构件通过POM(一种XML文件)来描述相关信息以及传递性依赖。Gradle 可以通过分析 该文件获取获取所以依赖以及依赖的依赖和依赖的依赖的依赖,为了更加直观的表述,可以通过下面的输出 结果了解。
可以看到,我们的项目依赖了com.android.support-v4包,然而com.android.support-v4包却依赖了一众support的全家桶,借助Gradle的传递性依赖特性,你无需再你的脚本中把这些依赖都声明一遍,你只需要简单的一行,Gradle便会帮你将传递性依赖一起下载下来。
传递依赖特性可以轻松地通过transitive参数进行开启或关闭,上面的示例中如果要忽略com.android.support-v4的传递性依赖可以采用指定 transitive = false 的方式来关闭依赖传递特性,也可以采用添加@jar的方式忽略该依赖的所有传递性依赖。
compile('com.android.support:support-v4:23.1.1'){
transitive = false
}
compile 'com.android.support:support-v4:23.1.1'@jar
当然,你也可以全局性的关闭依赖的传递特性。
configurations.all {
transitive = false
}
排除依赖
有些时候你可能需要排除一些传递性依赖中的某个模块,此时便不能靠单纯的关闭依赖传递特性来解决了。这时exclude就该登场了,如果说@jar彻底的解决了传递问题,那么exclude则是部分解决了传递问题。然而实际上exclude肯能还会用的频率更更频繁一些,比如下面几种情况。
可以通过configuration配置或者在依赖声明时添加exclude的方式来排除指定的引用。
exclude可以接收group和module两个参数,这两个参数可以单独使用也可以搭配使用,具体理解如下:
compile('com.github.nanchen2251:CompressHelper:1.0.5'){
//com.android.support:appcompat-v7:23.1.1
exclude group: 'com.android.support'//排除组织依赖
exclude module: 'appcompat-v7'//排除模块依赖
}
强制使用版本
当然,有时候你可能仅仅是需要强制使用某个统一的依赖版本,而不是排除他们,那么此时force就该登场了。指定force = true属性可以冲突时优先使用该版本进行解决。
compile('com.github.nanchen2251:CompressHelper:1.0.5'){
force = true
}
全局配置强制使用某个版本的依赖来解决依赖冲突中出现的依赖
configurations.all {
resolutionStrategy {
force 'com.github.nanchen2251:CompressHelper:1.0.5'
}
}
使用动态版本
如果你想让你的工程始终采用最新依赖,那么Gradle提供了一种方式可以始终保证采用依赖的最新版本而无需每次手工检查修改版本。
使用加号+,可以让Gradle在每次执行构建时检查远程仓库是否存在该依赖的新版本,如果存在新版本则下载选用最新版本。当然也可以指定依赖某个大版本下的最新子版本,1.+表示始终采用该依赖最新的1.x版本的最新依赖。
compile 'com.android.support:support-v4:+'//下载最新
compile 'com.android.support:support-v4:23+'//基于23这个版本最新
- 虽然这是看上去十分风骚的一种用法,但这无疑会降低你系统构建的速度同时提高构建失败的风险。因为Gradle不得不每次检查远程仓库是否存在最新版本,同时新版本也可能带来无法预知的兼容性问题。
一个综合案例
compile('com.github.nanchen2251:CompressHelper:1.0.5') {
// 冲突时优先使用该版本
force = true
// 依据构建名称排除
exclude module: 'CompressHelper'
// 依据组织名称排除
exclude group: 'com.github.nanchen2251'
// 依据组织名称+构件名称排除
exclude group: 'com.github.nanchen2251', module: 'CompressHelper'
// 为本依赖关闭依赖传递特性
transitive = false
}