Gradle系列之三 Gradle概述以及生命周期
1 Gradle是一种编程框架
gradle主要由以下三部分组成
- 1 groovy核心语法
- 2 build script block
- 3 gradle api
注:本章所有的代码都在 https://github.com/jiulu313/gradledemo.git
如下图
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
如下图
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系列之三 Gradle概述以及生命周期的更多相关文章
- React 深入系列4:组件的生命周期
文:徐超,<React进阶之路>作者 授权发布,转载请注明作者及出处 React 深入系列4:组件的生命周期 React 深入系列,深入讲解了React中的重点概念.特性和模式等,旨在帮助 ...
- 【深入ASP.NET原理系列】--ASP.NET页面生命周期
前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...
- maven系列(3)-maven生命周期的介绍
1. 概述 Maven有三套相互独立的生命周期,请注意这里说的是"三套",而且"相互独立",初学者容易将Maven的生命周期看成一个整体,其实不然.这三套生命周 ...
- Maven系列第6篇:生命周期和插件详解,此篇看过之后在maven的理解上可以超越同级别90%的人!
maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能. 这是maven系列第6篇. 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部 ...
- Spring原理系列一:Spring Bean的生命周期
一.前言 在日常开发中,spring极大地简化了我们日常的开发工作.spring为我们管理好bean, 我们拿来就用.但是我们不应该只停留在使用层面,深究spring内部的原理,才能在使用时融汇贯通. ...
- Spring系列13:bean的生命周期
本文内容 bean的完整的生命周期 生命周期回调接口 Aware接口详解 Spring Bean的生命周期 面试热题:请描述下Spring的生命周期? 4大生命周期 从源码角度来说,简单分为4大阶段: ...
- react实战 系列 —— React 的数据流和生命周期
其他章节请看: react实战 系列 数据流和生命周期 如何处理 React 中的数据,组件之间如何通信,数据在 React 中如何流动? 常用的 React 生命周期方法以及开源项目 spug 中使 ...
- Ninject之旅之三:Ninject对象生命周期
摘要 DI容器的一个责任是管理他创建的对象的生命周期.他应该决定什么时候创建一个给定类型的对象,什么时候使用已经存在的对象.他还需要在对象不需要的时候处理对象.Ninject在不同的情况下管理对象的生 ...
- Servlet概述及其生命周期
Servlet和传统CGI程序相比的优点: 1. 只需要启动一个操作系统进程以及加载一个JVM,大大降低了系统的开销 2. 如果多个请求需要做同样处理的时候,这时只需要加载一个类,这也大大降低了开 ...
随机推荐
- BUPT复试专题—寻找变化前01序列(2016)
题目描述 给你一个01序列,HDLC协议处理的话,如果出现连续的5个1会补1个0.例如1111110,会变成11111010. 现在给你一个经过HDLC处理后的01序列,你需要找到HDLC处理之前的0 ...
- SolidEdge 如何绘制零件图的剖视图
1 点击检视-剖面,然后选择剖切面 2 比如要全剖,则绘制好方框之后点返回,选择方向. 选择剖切深度,然后预览即可 一个零件可以进行多次剖切
- Solidworks工程图如何使用,替换图纸格式模板文件
1 如果你有了图纸模板(SLDDRW文件),比如下面的这个文件,则以后把零件的三维图拖放到里面就可以了.注意,这是最简单,最有效的方法,后面另存为的slddrt文件不好使,所以还不如把模板文件另存为S ...
- android项目笔记(一)
1.getInstance:单例模式创建类的实例,getInstance在单例模式(保证一个类仅有一个实例,并提供一个访问它的全局访问点)的类中常见,用来生成唯一的实例,getInstance往往是s ...
- 64位CentOs7源码安装mysql-5.6.35过程分享
首先安装依赖包,避免在安装过程中出现问题 [root@bogon liuzhen]# yum -y install gcc gcc-c++[root@bogon liuzhen]# yum -y in ...
- HDU 3249 Test for job (有向无环图上的最长路,DP)
解题思路: 求有向无环图上的最长路.简单的动态规划 #include <iostream> #include <cstring> #include <cstdlib ...
- PowerDesigner逆向工程,从SQL Server数据库生成Physical Model
提前声明:这种方式貌似只能是Power Designer安装在数据库服务器的时候才可以,因为我按照成功的这个再去从本机逆向连接远程服务器的时候,一直提示:test failed......不讲了,尴尬 ...
- spring MVC (学习笔记)
web.xml 相关配置 <?xml version="1.0" encoding="UTF-8"?><web-app xmlns=" ...
- POJ 2421 Constructing Roads (Kruskal算法+压缩路径并查集 )
Constructing Roads Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19884 Accepted: 83 ...
- HDU4283 You Are the One —— 区间DP
题目链接:https://vjudge.net/problem/HDU-4283 You Are the One Time Limit: 2000/1000 MS (Java/Others) M ...