gradle由简入深

邮差的信 提交于 2020-02-26 00:19:31

众所周知android编译有两种方式分别是,make和gradle

Gradle

附 gradle文档

gradle这种方式包含project、task、action、closures,他们关系如下图:

Project

一个project与一个build.gradle文件是一对一的关系

project与project的关系是树形结构的,通过getParent()获得父project,通过getSubprojects()获得所有子project

提出一个问题,build.gradle是一个project对象吗?

答案:不是的,根据官方文档介绍可以知道每一个build.gradle脚本与关联的project对象有一个委托关系。所以脚本使用的任何属性或方法都通过关联的项目对象进行委托。

举个例子

我们在build.gradle文件中常用的Project属性,实际代理的是

Project getProject();

Project Properties

一个project的properties可以有5种范围

  • project自身的,比如任何 getters and setters修饰的属性
  • extra 比如在ext{}里定义的

  • 由插件添加的Convention

  • 由插件添加的extensions

  • task的名字,比如task:compile,它的名字就是一个属性

extra和Convention属性,子project可以直接从父project继承,但是不可改变它的值

这些属性都可以在build.gradle文件通过直接读取其名字访问,比如project.name 可以直接代替name

这里主要说一下extra属性,可以通过

gradle在构建过程中会为每一个参与构建的Project装配一个project对象,gradle构建过程如下,执行每一个task都会经历以下三个阶段。

  • 构建开始首先创建setting对象
  • 确认setting.gradle文件存在,如果存在则根据脚本配置setting对象
  • 根据已经配置好的setting对象配置Project实例层次结构
  • 最后评估每个project对象根据他们的build.gradle文件,每个project对象是在他的子project之前评估,根据每个project的依赖关系和task的依赖关系确定任务集,
  • 执行每个任务集

gradle在构建过程中可以添加一些监听

配置阶段添加监听

beforeEvaluate{"开始配置"}

afterEvaluate{"配置结束"}

task比较特殊,在配置阶段会执行task自身这个closures,task运行的时候才会执行doFirst和doLast这两个closures

task testTask() {

println '配置阶段执行'

doFirst {'执行task时先执行'}

doLast{'执行task时后执行'}

}

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!