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 '执行阶段执行完毕...'}//等同于 beforeEvaluatethis.gradle.beforeProject {
}//等同于 afterEvaluatethis.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()//获取所有的projectdef 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//打印所有的子projectgetAllSubprojects()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是很重要的概念,下面是官方的文档


随时随地看视频