hi各位小伙伴,继之前《在飞Android Kotlin实战》系列结束后,今日开始按计划更新《在飞Android Gradle实战系列》。
前言:
随着Android技术的发展,我们现在的app业务越来越多,体积越来越大,之前的ant等等构件工具已经无法满足我们的需求。Android Studio的快速普及,对于Gradle现在已经成为我们技术人员的一项必备技能,本系列也将会和大家一起学习Gradle的知识。
还是一样的风格,只讲实战中经常用到的内容,让你快速入门和使用,加上我自己的分析让你更加清楚的了解这些内容。至于基础知识请自己学习~。
本章难度:简单 普通 困难
本章重要程度:普通 重要 核心
Gradle组成:groovy api、build script block 、gradleapi
一、Gradle的生命周期:
1、在探讨Gradle生命周期前,大家可以先在Android Studio的Terminal中执行./gralew projects 这个命令,看看大家的项目中有多少个project。
上图看到,我的项目有3个poject,分别为Root poject:'dap-audience-network' 2个子project:'buildSrc' 'ToolboxSample'
2.我们在Android Studio的Terminal中输入法./gradlew clean
经验:
在上面执行./gradlew clean或者./gradlew projects命令的过程中我们会看到有这么几个过程:loading(初始化阶段)、config(配置极端)、build(构建阶段),那这几个对应的是什么意思呢?请看如下流程图
init初始化阶段:解析整个工程中的所有Project,构建所有的Project对应的project对象。
举例:按上面./gradlew projects中的结果来说的话就是:init过程会遍历Root poject:'dap-audience-network' 2个子project:'buildSrc' 'ToolboxSample' 这3个project,并且为这3个构建自己的project对象。
Configuration配置阶段:init初始化阶段之后,解析所有的projects对象中task,构建好所有task的关系图。
举例:前面init初始化阶段已经完成了,gradle会解析init阶段中的task,构建好所有task。(可以使用./gradlew tasks命令来查看自己的project有哪些task)(这个就是我们后面章节中提到的doLast{}这个闭包掉用的时机,就是在执行阶段的Task中执行)
Execution执行阶段:在Configuration阶段之后,执行具体的task及其依赖的task。
举例:
前面的./gradlew clean,./gradlew projects,./graldew tasks 命令里面的clean、projects、tasks其实都是一个task。但是如果一个Task有'dependsOn'依赖的,那么就会先执行依赖的Task之后再执行自己的Task,这就是为什么我们使用./gradlew build命令的时候会看到明明只执行了build这一个Task但是看到结果是执行很多其他task的原因。
二、Gradle生命周期监听:
通过project中的api监听初始化阶段、配置阶段、运行阶段。
//在初始化和配置阶段之间的监听回调(Configuration配置阶段开始前的回调监听)
this.beforeEvaluate {
println '配置阶段开始前...'
}
//在配置阶段之后和执行阶段之前调用(Configuration配置阶段完成后的回调)
this.afterEvaluate {
println '配置阶段完成...'
}
//gradle生命周期执行完之后 (gralde task执行完毕后的会调此监听)
this.gradle.buildFinished {
println 'gradle执行完毕...'
}
//等同于this.beforeEvaluate {}
this.gradle.beforeProject {}
//等同于this.afterEvaluate {}
this.gradle.afterProject {}
结果如下:
经验:
对于Gradle生命周期,只有了解了Gradle的生命周期才能写出正确的脚本代码,初始化、配置、执行这三个阶段相辅相成,初始化阶段gradle会完成所有projects的初始化,决定我们的项目有多少个子项目 这个阶段重点就是解析setting.gradle文件。
初始化阶段完毕之后就是配置阶段,build.gradle中的代码大部分代码都是执行在配置阶段的。配置阶段执行完之后就是运行阶段,在运行阶段才真正执行task中的逻辑。
只有知道这三个阶段的作用,才能写出正确的脚本代码,否则代码很容易执行在错误的生命周期从而造成功能的失效。
为什么说如果生命周期错误了会造成功能失效呢? 转载请注明出处:https://blog.csdn.net/pangzaifei/article/details/87611885
this.afterEvaluate {
//配置过程结束,保证要找的task都已经配置完毕
Project project ->
def preBuildTask = project.tasks.getByName('preBuild')
preBuildTask.doFirst {
startBuildTime = System.currentTimeMillis()
println "start time is ${startBuildTime}"
}
def endBuildTask = project.tasks.getByName('build')
endBuildTask.doLast {
endBuildTime = System.currentTimeMillis()
println "the build time is ${endBuildTime - startBuildTime}"
}
}
如果你再this.beforeEvaluate去执行上面的方法是无法获取到startBuildTime和endBuildTask的
上面这段代码就是在this.afterEvaluate生命周期中执行的一系列业务操作,配置阶段已经完成了,配置阶段的作用一项就是构建好task的关系。
在闭包中的内容def preBuildTask = project.tasks.getByName('preBuild')才能获取到对应的task。doFirst{}、doLast{}这两个闭包分别是说在执行阶段中你自己的Task的开始和结束这两个时机(后面会介绍)。
Ps:我是在飞~~,只有空闲时间更新博客,所以本系列偏快速入门和个人经验分享。主要讲实战中经常用到和我认为重要的内容。所以文章尽量简短,敬请谅解,希望我的博客对你有帮助!本系列暂定阅读者已经有groovy基本知识,如果需要我来说下Groovy内容也可以评论中提出,后续单开一章。
祝各位工作顺利!
有问题可联系q:1660380990邮箱[email protected]