众所周知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时后执行'}
}
来源:oschina
链接:https://my.oschina.net/u/3336230/blog/3158155