学习了解下gradle需要掌握的基本知识
Task可以理解为gradle的执行单元,gradle通过执行一个个Task来完成整个项目构建工作
我们可以在build.gradle中使用关键字task来自定义一个Task。比如创建build.gradle文件,并添加task,如图:

上图中定义了一个简单的Task A,然后在终端中使用以下命令执行此Task,即可看到打印结果,如图:

从结果中可以看出,打印日志是在gradle的配置(Configure)阶段执行的。gradle的构建生命周期包含3部分:初始化阶段,配置阶段,执行阶段。在task A中添加doFirst闭包,如下:

再次执行gradle A,如下:

gradle在运行期会执行所有task的配置语句,然后执行指定的Task
gradle 中的Task可以通过dependsOn来指定它依赖另一个Task,如下

在build.gradle中,新加一个Task B,并通过dependsOn关键字指定task B依赖于task A。在命令中执行“gradle B”,如下:

可以看出虽然只是执行taskB,但是因为依赖关系的存在,taskA也会被执行
gradle 会在配置Configure阶段,确定依赖关系。对于Android项目来说即为执行各个module下的build.gradle文件,这样各个build.gradle文件中的task的依赖关系就被确认下来了,而这个依赖关系的确定就是在Configuration阶段
我们可以在build.gradle中使用def关键字,自定义方法,比如以下代码中自定义了getData方法,并在task中使用此方法

通过gradle命令执行上述task,结果如下:

自定义task时,还可以使用系统提供的各种显示task来完成相应的任务。具体就是使用关键字type来指定使用的是哪一个task。
比如在当前目录下新建2个文件夹:src和dst。目录如下:

然后在src中创建文件Demo.java,代码如下:

最后当前路径结构如下:

修改build.gradle,新添加一个task copy如下:

然后在命令行执行”gradle copy“,运行结束后,重新查看目录结构:

可以看出Demo.java被拷贝了一份到dst目录中。
除了Copy之外,还有很多其他显示的task可用,比如我们可以通过自定义task实现编译Demo.java并将编译后的.class输出到某一特定路径,如下:

解释:
最后执行”gradle compile“,查看目录结构:

在Android中每个module就对应一个project,gradle在编译时期会为每一个project创建一个Project对象用来构建项目。这一过程是在初始化阶段,通过解析settings.gradle中的配置来创建相应的Project。

上图settings.gradle中导入了3个project,但是实际上还会有一个跟project,使用./gradlew project查看,如下:

我们可以在跟project中统筹管理所有的子project,具体在LagouGradle路径下的build.gradle中进行设置,如下:

这样写的好处是,项目中所有module的配置都统一写在一个地方,统筹管理。比如经常会在主项目的build.gradle中添加包过滤,解决依赖冲突,如下:

随着项目越来越大,工程中的module越来越多,依赖的三方库也越来越多。一般情况下我们会在一个集中的地方统一管理这些三方库的版本。比如像Google推荐的使用ext变量,在根module的build.gradle中 ,使用ext集中声明各种三方库的版本,如下:

然后在子module中,引用这些版本信息

但是这种写法有点小瑕疵:不支持AS的自动补充功能,也无法使用代码自动跟踪,因此可以考虑使用buildSrc
buildSrc是Android项目中一个比较特殊的project,在buildSrc中可以编写Groovy语言,但是现在Google越来越推荐使用Kotlin来编写编译语句
先在根路径下创建目录buildSrc,结构如下:

注意:这个工程只能有一个,并且名字必须为buildSrc!
创建好之后,在buildSrc中创建build.gradle.kts文件,并添加Kotlin插件

编译工程有可能会报错,如下:

只要添加respositories{ jcenter() }仓库即可
接下来在buildSrc中创建src/main/java目录,并在此目录下创建Dependencies.kt(名字随便起)。在Dependencies.kt中创建两个object,分别用来管理工程中的版本信息以及依赖库。

我们可以在Versions中添加各种项目中可能会引用到的版本

然后在Deps中引用Versions中的变量

最后我们就可以在各个module中的build.gradle直接引用Deps中的变量用来声明依赖,比如在app module的build.gradle中添加如下依赖:

上图中分别是使用buildSrc前后的对比,并且在使用Deps的过程中,studio会自动给出提示,如下:

主要介绍学习了gradle构建中的task和project。
task与大部分的开发者是最为紧密,它是gradle构建的基本单元。我们每次编译工程时,AS会在控制台打印出执行的task名称,类似下图:

我们也可以自定义task实现相同的构建需求
project对应的项目中的module,每个module中包含一个build.gradle,每个build.gradle都会被gradle编译成Project字节码。我们在build.gradle中所写的所有逻辑,实际上最终都会被映射成此Project字节码内的实现逻辑。