写点什么

看完此文,你对 Gradle 的理解又升级了!,万字总结

用户头像
Android架构
关注
发布于: 3 小时前

implementation fileTree(dir:'libs',include:['*.aar'])


implementation(name:'XXX',ext:'aar')


}


Gradle 的本地 Module 依赖


当项目中有多个 Module 时,我们需要在 settings.gradle 中引入,如下所示。


include ':app'


include ':library1', ':library2'


接着在


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


模块 build.gradle 引入。


implementation project(':library1')


Gradle 的远程库依赖


当在 Android Studio 中新建一个项目时,会在项目 build.gradle 有如下代码:


buildscript {


repositories {


google()


jcenter()


}


dependencies {


classpath 'com.android.tools.build:gradle:3.4.0'


}


}


allprojects {


repositories {


google()


jcenter()


}


}


这些代码都是默认的,在 buildscript 和 allprojects 块中,通过 repositories 来引入谷歌的 Maven 库和 JCenter 库。首先会从谷歌的 Maven 库去寻找相应的库,如果找不到会从 JCenter 库中去寻找。


然后在模块 build.gradle 加入如下的代码,就可以引入远程库。


implementation group:'com.android.support',name:'appcompat-v7',version:'28.0.0'


//简写


implementation 'com.android.support:appcompat-v7:28.0.0'

[](

)3.Gradle 的库依赖管理


随着 Gradle 依赖的库越来越多,那么必然会产生一些问题,比如依赖冲突的问题,为了解决依赖冲突,我们需要先了解 Gradle 的库依赖管理的几个技术点。

[](

)3.1 Gradle 的依赖传递


Gradle 默认是支持依赖传递的,所以当用到 Gradle 依赖时一定会涉及到它,是必须要知道的一个知识点。


那什么是依赖传递呢?举一个最简单的例子。


projectC 依赖 projectB,projectB 依赖 projectA,那么 projectC 就依赖了 projectA。


依赖传递会产生一些问题,比如重复依赖、依赖错误等问题,那么我们可以通过 transitive 来禁止依赖传递。


implementation('com.xxx.xxx:xxx:3.6.3') {


transitive false


}


上面禁止了 com.xxx.xxx:xxx:3.6.3 库的依赖传递,还可以使用如下语句来关闭当前模块的所有库的依赖传递:


configurations.all {


transitive = false


}


只不过这样就需要手动添加当前模块的每个库的依赖项,一般不会这么做。

[](

)3.2 Gradle 的依赖检查


有了依赖检查,我们可以解决依赖产生的问题。依赖检查有很多种方式,分别来介绍下。


使用 Gradle 的命令行


可以直接使用 Gradle 的命令行来进行依赖检查,拿 Windows 平台来说,使用 cmd 进入项目的根目录,执行 gradle :app:dependencies 即可,其中 app 是我们新建工程时默认的模块的名称。日志输出很多,下面截取一部分:


+--- com.android.support:appcompat-v7:28.0.0


| +--- com.android.support:support-annotations:28.0.0 //1


| +--- com.android.support:support-compat:28.0.0 //2


| | +--- com.android.support:support-annotations:28.0.0


| | +--- com.android.support:collections:28.0.0


| | | --- com.android.support:support-annotations:28.0.0


| | +--- android.arch.lifecycle:runtime:1.1.1


| | | +--- android.arch.lifecycle:common:1.1.1


| | | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0 //3


| | | +--- android.arch.core:common:1.1.1


| | | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0


| | | --- com.android.support:support-annotations:26.1.0 -> 28.0.0


| | --- com.android.support:versionedparcelable:28.0.0


| | +--- com.android.support:support-annotations:28.0.0


| | --- com.android.support:collections:28.0.0 (*)


上面是 appcompat-v7:28.0.0 库的依赖树的一小部分,appcompat-v7:28.0.0 依赖了注释 1 处和注释 2 的库,注释 2 处的库又依赖了 com.android.support:support-annotations:28.0.0 和 com.android.support:collections:28.0.0,因此当我们引入 appcompat-v7:28.0.0 时,会自动下载所有它依赖传递的库。注释 3 处说明,Gradle 在依赖传递时,会自动提升依赖传递的库的版本,默认使用最高版本的库。


使用 Gradle 面板


除了命令行,还可以使用 Android Studio 中的右侧的 Gradle 面板,找到 app 模块,展开后找到 help 目录中的 dependencies,如下图所示。



双击或者右键选择第一个选项即可执行命令,日志就会在 AS 中 Run 窗口中打印出来。


现在再举个例子,拿我们熟悉的 retrofit 举例,在模块 build.gradle 中引入 retrofit:


implementation 'com.squareup.retrofit2:retrofit:2.6.0'


执行依赖检查命令,打印的关于 retrofit 的日志如下:


+--- com.squareup.retrofit2:retrofit:2.6.0


| --- com.squareup.okhttp3:okhttp:3.12.0


| --- com.squareup.okio:okio:1.15.0


可以很清楚看到 retrofit:2.6.0 依赖 okhttp:3.12.0,而 okhttp:3.12.0 依赖 okio:1.15.0。


这时我们使用 3.1 小节的 transitive 试试,修改 build.gradle:


implementation ('com.squareup.retrofit2:retrofit:2.6.0') {


transitive false


}


执行依赖检查命令,打印的关于 retrofit 的日志如下:


+--- com.squareup.retrofit2:retrofit:2.6.0


使用 Gradle View 插件


如果你觉得前两种方式查看不方便、不直观,还可以使用 Android Studio 的 Gradle View 插件。


在 AS 中选择 File–>Settings–>Plugins 中搜索 gradle view,找到 Gradle View 插件安装并重启 AS,如下图所示。



接下来选择 View-–>Tools Windows–Gradle View,这时就可以在 AS 的底部发现 Gradle View 窗口,里面会显示当前项目的所有依赖树,如下图所示。


[](

)3.3 Gradle 的依赖冲突


依赖冲突产生的原因多是库的版本问题,举个例子,如果在 build.gradle 中这么写:


implementation 'com.squareup.retrofit2:retrofit:2.6.0'


implementation 'com.squareup.okio:okio:1.14.0'


在 3.2 小节中,我们知道 retrofit:2.6.0 依赖的 okio 的版本是 1.15.0,而这里引入的 okio 的版本为 1.14.0,引入的版本不同就会产生依赖冲突。依赖冲突的解决的关键有两点,一个是 Gradle 的依赖检查,这个在 3.2 小节已经讲过了,另一个是利用 Gradle 的关键字,合理利用它们是解决依赖冲突的关键,在 3.1 小节已经介绍了 transitive,现在介绍其余的。

[](

)3.3.1 force


有时候我们不是想要排除某个库,而是需要强制使用统一的库的版本,force 可以强制设置模块的库的版本,在模块 build.gradle 中加入如下代码。


configurations.all {


resolutionStrategy {


force 'com.squareup.okio:okio:2.1.0'


}


}


dependencies {


...



强制当前模块的 okio 的版本为 2.1.0,使用依赖检查来查看下 retrofit 的依赖:


+--- com.squareup.retrofit2:retrofit:2.6.0


| --- com.squareup.okhttp3:okhttp:3.12.0


| --- com.squareup.okio:okio:1.15.0 -> 2.1.0


--- com.squareup.okio:okio:1.14.0 -> 2.1.0


可以看到 okio 的版本都被强制升级到了 2.1.0,这样就可以解决一些依赖冲突的问题。

[](

)3.3.2 exclude


有些时候需要排除库依赖传递中涉及的库,此时不能靠关闭依赖传递来解决问题,这时可以使用 exclude。


我们知道 com.android.support:appcompat-v7:28.0.0 依赖于 com.android.support:support-annotations:28.0.0、com.android.support:support-compat:28.0.0、com.android.support:cursoradapter:28.0.0 等库,这时我们不想再依赖 support-annotations 库,可以这么写。


configurations {


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


}


dependencies {


...


用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
看完此文,你对Gradle的理解又升级了!,万字总结