Gradle的基本流程

感觉很多时候创建好了项目,Gradle Build一下就好了。那么Build的时候发生了什么事呢?在此之前先看下Gradle项目的构成,了解下Gradle Wrapper。
这是一个Gradle项目运行的三个步骤:


image.png
  1. 从Gradle服务器下载指定版本的gradle
  2. 将下载的gradle存放并解压到Gradle User Home,对应着本地文件夹~/.gradle复用,避免一个项目下载一次
  3. 使用下载的gradle

使用Gradle Wrapper的意义即在于把上面三步完成,不需要用户一步一步去完成。通常在使用的时候都是IDE帮我们生成好了,那么如果是自己新建一个Gradle Wrapper项目呢?直接在文件夹下执行gradle wrapper :

.
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat

即可生成最基础的gradle wrapper项目。这时执行./gradlew build(不难看出,gradlew就是指的 gradle wrapper)就会去执行上面提到的三步。具体是第一步启动一个非常轻量级的JVM,然后这个Clinet JVM会和Gradle 的Deamon JVM连接将具体下载等等操作交给Deamon JVM。为什么要这么做呢?为什么不直接使用Clinet JVM做下载等操作呢?这是因为完成Gradle任务的JVM启动非常耗时,如果每次都新建JVM那么会浪费很多时间,这个Deamon JVM一旦创建会存在很长时间。这就是为什么你在首次同步Gradle的时候会在Build Output里面看到下面的log:

Starting Gradle Daemon...
Gradle Daemon started in 1 s 67 ms
> Task :prepareKotlinBuildScriptModel UP-TO-DATE

BUILD SUCCESSFUL in 12s

但是如果你同步成功后再按同步按钮你会发现log是这样的:

> Task :prepareKotlinBuildScriptModel UP-TO-DATE

BUILD SUCCESSFUL in 1s

不会再启动Daemon了。Daemon和项目的gradle wrapper要求的配置一一对应,不同配置的gradle wrapper会启动不同的Daemon。有时会遇到一些莫名其妙的gradle同步错误,可以试试 ./gradlew --stop 杀掉对应的Daemon JVM再试一次。

需要的Gradle版本完成下载后就会进入到项目Gradle的生命周期。Gradle的生命周期可以分为三大步:

  1. Initialization 初始化阶段
    在这个过程中,Gradle会确定哪些工程需要参与编译,并且为每个工程生成一个Project类。Project类是什么?为什么在项目中没有见过呢?其实你见过了,就是项目里的build.gradle。那么Gradle是怎么确定哪些工程需要参与编译的呢?根据Settings类。根据Settings类?这个好像见过,对,就是项目中的settings.gradle。现在知道settings.gradle中的include ':app'是怎么肥事了吧。当前项目的根目录,也就是settings.gradle所在的目录会默认生成一个
    Project对象。

  2. Configuration 配置阶段
    有了Project的对象就可以根据里面闭包等等执行具体的任务了。比如下载依赖库、依赖的插件等等,这就是配置阶段。

  3. Execution 执行阶段
    这一步是根据传入的参数执行task的。比如 assembleDebug这样的。task是Gradle中执行的最小单元。这么说很抽象,举个例子吧,可以在biuld.gradle中定义一个task:

task("yy"){
    doFirst {
        println("doFirst yy")
    }

    doLast {
        println("doLast yy")
    }

    println("configure yy")
}

Sync项目就会在Gradle任务面板中找到这个task:


image.png

现在知道其他task都是怎么上去的了吧。双击yy或者在执行./gradlew yy可以看到下面输出:

➜  GroovyTest ./gradlew yy

> Configure project :
configure yy

> Task :yy
doFirst yy
doLast yy

可以看到先输出了configure yy这就是上面提到的配置阶段。如果这里面的代码有点陌生,可以看看上一篇介绍groovy基础的文章。

除了自己定义一些task外,还可以根据项目gradle的生命周期过程去执行一些task。比如项目构建完成后打印个log啥的。

afterEvaluate {
    println("afterEvaluate")
    if (state.failure != null) {
        println ("Evaluation of $this FAILED")
    } else {
        println ("Evaluation of $this succeeded")
    }
}

还可以定义task之间的依赖关系,比如taskA依赖taskB,这样执行taskA的时候会先执行taskB。

        task("taskB") {

            doFirst {
                println("doFirst helloworld")
            }

            doLast {
                println("doLast helloworld")
            }

            println("configure helloworld")
        }

        task("taskA") {
            dependsOn("taskB")//依赖关系
            doLast {
                println("try")
            }
        }

好了,这里就简单介绍完了gradle的简单生命周期。接下来会介绍如何编写自己的gradle插件。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 简介 Gradle是一个优秀的构建系统和构建工具,它允许通过插件创建自定义的构建逻辑。 我们基于Gradle以下的...
    zizi192阅读 438评论 0 1
  • 说明 本文主要介绍和Gradle关系密切、相对不容易理解的配置,偏重概念介绍。部分内容是Android特有的(例如...
    jzj1993阅读 15,364评论 1 62
  • 在过去一年左右,我开始使用Gradle作为我构建基于JVM项目的主要工具。 在使用Gradle之前,我是一个Apa...
    天地征途_觉醒阅读 17,551评论 0 6
  • Gradle对于很多开发者来说有一种既熟悉又陌生的感觉,他是离我们那么近,以至于我每天做项目都需要他,但是他又是离...
    阿_希爸阅读 9,517评论 10 199
  • 教学视频 一.Gradle基础概念 1.1 gradle发布的版本 distributions 1.2 gradl...
    真胖大海阅读 217评论 0 0