是什么:是一个编程工具
做什么:构建项目的工具
gradle执行流程图
-
初始化阶段:首先执行setting.gradle文件,读出工程有几个project,为所有的project构建对象
-
在配置阶段:解析所有projects对象中的task,生成有向无环图(task的依赖关系图)
主要监听配置阶段,是gradle执行的核心
-
执行阶段:执行所有task及其以来的task
生命周期监听
//配置阶段开始前
this.beforeEvaluate {
println '配置阶段开始前'
}
//配置阶段完成后
this.afterEvaluate {
println '配置阶段开始hou '
}
//gradle执行完毕后
this.gradle.buildFinished {
println 'gradle执行完毕后 '
}
this.gradle.beforeProject {
println 'beforeProject '
}
this.gradle.afterProject {
println 'afterProject '
}
执行build(是一个task),要先执行他所依赖的task
所有的都是project
module也是project,每个poject所有一个build.gradle 文件
查看项目的所有project执行
./gradlew project
根project下多个子project
根project:管理子project
子project:对应输出,例如上面的app 会对应输出一个apk,Alibrary会对应一个aar的输出
如果是Java项目每个子project对应一个jar包的生成
project API
得到所有project
this.getAllprojects()
注意:所有build.gradle和setting.gradle的代码或方法都是在配置阶段执行的
得到当前项目的所有子project
this.getSubprojects()
得到当前项目的父project
this.getParent().name
得到当前项目的根project
this.getRootProject().name
在根project的gradle文件里,寻找指定的子project方法
project(‘子project名字’)
也可以在父project里完成对子project的配置,一般不这样做
配置当前project以及他下面的所有子project
allprojects{}
配置当前project下面的所有子project
subprojects {}
apply from: 导包
project 属性api
默认属性
定义变量
扩展属性
在父project里通过subprojects给所有子project定义扩展属性
直接在根project定义扩展属性
使用根project的属性
this.rootProject.xxx,也可以直接使用父类属性(继承关系)
把所有属性定义在一个gradle文件里,然后引入
引入gradle文件
使用属性
在gradle.properties里定义扩展属性
使用
注意:定义在这里的属性直接拿到的时候object,要转一下类型才能用
xxx.toInteger() xxx.toBoolean()
file文件api
注意:只支持在同一个项目里进行copy,不能脱离这个项目
跨工程可以用groove的方法
获取目录路径
file(path)
注意这个方法传入的是相对路径
拷贝
文件拷贝
copy {
from file("src/main/AndroidManifest.xml")
into getRootDir()
}
文件夹拷贝
拷贝其他操作
文件树遍历
遍历apk目录下的所有文件,打印每一个文件的名字(element是文件节点)
并且把每一个文件拷贝到test文件夹里面的
依赖相关api
buildscript
一般都是闭包的简略写法,这里为了理解,全部把参数写出来
配置仓库地址
简单写法
buildscript {
ext.kotlin_version = '1.3.10'
repositories {
google()
jcenter()
}
Maven仓库配置
简写
buildscript里的dependencies为工程引入插件地址
与project里的dependencies不同,为程序引入第三方库地址
依赖冲突
compile和provided的区别
compile 在打包后,会把依赖内容达到apk里
provided (占位编译)只会在编译器使用这个依赖,不会打包到apk里
一个使用场景是
- 只在编译器起作用,不在运行期起作用
- 如果主工程所依赖的库工程中的依赖库已经在主工程中已用过了,那么在库过程中就不需要再次通过compile引入这个依赖了,而是应该通过占位编译方式provided,让在编译过程中通过,但是在不要打包到apk,因为最后使用的是主工程里的依赖 ,减少apk大小