Gradle系列之三 Gradle概述以及生命周期

九路
• 阅读 1541

1 Gradle是一种编程框架

gradle主要由以下三部分组成

  • 1 groovy核心语法
  • 2 build script block
  • 3 gradle api

注:本章所有的代码都在 https://github.com/jiulu313/gradledemo.git

如下图 Gradle系列之三  Gradle概述以及生命周期

2 Gradle的优势

  • 1 更加的灵活,因为gradle是编程框架,所以功能要强大的多
  • 2 粒度性上,源码的编译,资源的编译,都是一个一个Task的,我们可以修改task来达到精细控制上
  • 3 扩展性上,gradle有插件机制

以上所有的优势其实全因为Gradle是一种编程框架

3 Gradle的生命周期

Gradle生命周期分为三个部分,如下:

  • 1 初始化阶段: 解析整个工程中所有Project,构建所有的Project对应的project对象,这个阶段主要就是解析setting.gradle文件
  • 2 配置阶段:解析所有的projects对象中的task,构建好所有的task拓扑图,主要解析各个project下的build.gradle文件
  • 3 执行阶段:执行具体的的task及其依赖task 如下图

Gradle系列之三  Gradle概述以及生命周期

4 Gradle的生命周期的监听

在root build.gradle中,添加如下代码

/**
 * 配置阶段开始前的监听回调
 */
this.beforeEvaluate {
    println '配置阶段开始111...'
}

/**
 * 配置阶段后的监听回调
 */
this.afterEvaluate {
    println '配置阶段执行完毕222...'
}

/**
 * gradle执行完毕后的回调
 */
this.gradle.buildFinished {
    println '执行阶段执行完毕...'
}


//等同于 beforeEvaluate
this.gradle.beforeProject {

}

//等同于 afterEvaluate
this.gradle.afterProject {
    println '配置阶段执行完毕333...'
}

然后运行 ./gradlew build,就会输出相应的log

5 Project详解

在gradle中,project就好像是android中的activity一样,经常使用,所以project概述是一个很重要的概念

在android工程中,所有的lib,module都是一个project

查看所有的project

./gradlew projects
//输出如下
------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'gradledemo'
+--- Project ':app'
+--- Project ':mylib'
+--- Project ':test'
--- Project ':utils'

可以看到当前工程下有5个 proejct,其中有一个根 project,剩下的4个是子project,可以看到project是树的结构,根project的作用就是用来管理子project 如何管理呢?就是通过相应的api进行管理,后面有讲到。每个project都对应一个输出

每个project都有一个build.gradle文件,build.gradle文件也是project的标识

5.1 Project核心api

  • 1 gradle 生命周期api
  • 2 project相关api
  • 3 task相关api
  • 4 属性相关api
  • 5 file相关api
  • 6 其它api

在gradle中,一个build.gradle文件会被编译成proejct字节码,所以在build.gradle中编写的所有的代码相当于都是在proejct中类内部编写的

输出所有的proejct

//在根project下的build.gradle中,获取所有的project,添加如下代码

//调用方法
getProjects()

//获取所有的project
def getProjects(){
    println '------------'
    println 'Root Project'
    println '------------'

    //getAllprojects()返回所有的Project的set集合
    this.getAllprojects().eachWithIndex { Project project, int index ->
        if(index == 0){
            println "Root protject :'${project.name}'"
        }else{
            println "+--- project '${project.name}'"
        }
    }
}

//运行 ./gradlew clean,输出如下:
------------
Root Project
------------
Root protject :'gradledemo'
+--- project 'app'
+--- project 'mylib'
+--- project 'test'
+--- project 'utils'

输出所有的子project

//在根project的build.gradle中,输出所有的子prject
//打印所有的子project
getAllSubprojects()

def getAllSubprojects(){
    getSubprojects().each { project ->
        println "---- ${project.name}"
    }
}

//输出
---- app
---- mylib
---- test
---- utils

获取父project的名字

//获取根project的名字,在根project中调用返回null,在子project下调用打印出父project的名字
getParentProjectName()

def getParentProjectName(){
    def project = getParent()
    if(project != null ){
        println "父project的名字是: " + project.name
    }else {
        println '没有父project'
    }
}

获取根project的名字

getRootPro()
def getRootPro(){
    println "根project的名字是:" + getRootProject().name
}

//运行 ./gradlew clean ,输出:
根project的名字是:gradledemo

在根project对子project进行配置

/**
 * 可以在根project下对所有的子project进行配置,如下代码
 * 任何在子project中的build.gradle文件中可以配置的东西
 * 都可以在下面的代码中进行配置
 */

project("app") {
    apply plugin: 'com.android.application'
    group 'com.zhj'
    version '1.0.0'

    dependencies {

    }

    android {

    }
}


project('mylib') {
    apply plugin: 'com.android.library'
    group 'com.zhj'
    version '1.1.1'
    dependencies {

    }
}

为所有的project进行统一的配置

/**
 * 配置当前结点工程和它的所有的所有的subproject
 * 比如将所有的project的group配置为 'com.zhj'
 */
allprojects {
    repositories {
        google()
        jcenter()
    }

    group 'com.zhj'
}

//测试在allprojects中配置的group属性
println "test工程的group是 : " + project('test').group

//输出
test工程的group是 : com.zhj

只对子project进行配置

/**
 * 和allprojects不同的是,subprojects不包括当前工程,只包括子project
 */
subprojects { Project project ->
    if(project.hasProperty('com.android.library')){
        //将库工程编译的库上传到maven中
    }
}

gradle 中对project的管理是以树的形式进行管理的,根project主要就是对子Project进行管理,可以查找,可以获取所有的子project,同时在子project中也可以获取根proejct或者父project的信息。同时,一个project对应于一个build.gradle文件,build.gradle文件也是判断是不是project的标志。project是很重要的概念,下面是官方的文档

gradle文档

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这