《在飞Android Gradle实战》之生命周期1

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]

发布了72 篇原创文章 · 获赞 15 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/pangzaifei/article/details/87611885
今日推荐