gradle官网:https://docs.gradle.org/3.5/dsl/org.gradle.api.tasks.Delete.html
Demo地址:https://github.com/zhaopingfu/listener19
扩展属性
可以在build.gradle中和gradle.properties中定义
局部变量:可以直接在build.gradle中声明groovy属性
作用范围:只能在定义的类中使用
//局部变量
def prop = 'prop-value'
全局变量:通过ext设置的属性
作用范围:能在所有的子模块中使用
ext{
prop1 = '11'
}
或者
ext.prop3 = '33'
最后
task show << {
println prop
}
在Terminal里执行show任务就可以看到输出了
gradlew show
build.gradle在执行的时候会转换成project类,里面的方法和属性都是在类里面定义好的,如果想自己添加方法和属性的话,直接在build.gradle里写groovy代码就可以了
在gradle.properties中也可以直接定义全局变量,app下的build.gradle可以直接用
gradle_prop1='prop1'
gradle_prop2='prop2'
工程的build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
ext {
prop1 = 'prop1-value'
compileSdkVersion = 25
buildToolsVersion = "25.0.3"
}
app的build.gradle:
apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.pf.listener19"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
//局部变量,作用范围只是在当前类
def prop = 'prop-value'
//全局变量,对所有子项目可见,比如项目里的build.gradle中声明ext属性,那么在app里面是可以拿到的,因为是全局的
ext {
prop1 = 'prop1-value'
}
android.ext.prop2 = 'prop2-value'
ext.prop3 = '33'
//每个对象都能够设置ext
task show << {
println prop
println prop1
//rootProject是项目中的build.gradle
println rootProject.ext.prop1
println android.ext.prop2
println project.ext.prop3
println prop3
println ext.prop4
//下面这两个属性是在gradle.properties里定义的
println gradle_prop1
println gradle_prop2
//show任务里的ext
println ext
//当前类的ext
println project.ext
//项目里的build.gradle里的ext
println rootProject.ext
}
show.ext.prop4 = '44'
之后在terminal中直接执行gradlew show就可以看到这些输出了
自定义任务
Android构建过程就是在执行一个一个的任务
terminal中:
查看有哪些任务:
gradlew task
查看全部任务:
gradlew task --all
查看app模块下的任务:
gradlew :app:task
创建一个task:
第一种方式
task 任务名 << {}
第二种方式
DefaultTask task B { doLast { println 'doLast' } doLast { println 'doLast1' } doLast { println 'doLast2' } doFirst { println 'doFirst' } } B.doLast { println 'doLast3' }
这里会先执行doFirst,最后执行doLast,注意,有多个doLast都会依次执行
“<<”的意思 就是闭包里就是doLast
任务周期
比如有个任务叫做mergerDebugAssets
执行任务可以:gradle mergerDebugAssets也可以gradle mDA
一、任务执行顺序
task C << { println 'C' } task D << { println 'D' } task MyTask(dependsOn: [D, C]) << { println 'mytask' } //依赖 执行C任务肯定执行D任务 //C.dependsOn D //C必须在D后面执行 //C.mustRunAfter D //C应该在D后面执行,并行编译下,不一定C在D后面执行 //C.shouldRunAfterD //TODO C依赖D是执行C任务必须先执行D任务,C在D后面执行,不用先执行D任务,只有CD同时执行的时候C才会在D后面 //释放资源,清理缓存 task finalized << { println 'finalized' } C.finalizedBy finalized D.dependsOn C
总结一下:
- dependsOn:依赖
A.dependsOn B:A依赖B,就是说执行A的时候,必须要先执行B任务 - mustRunAfter和shouldRunAfter
A … B:A要在B后面执行,也就是说我单独调用A任务的时候,不会执行B任务,只有A和B都要执行的时候,才会A在B后面 finalizedBy
A.finalizedBy B:B要在A执行完之后执行,就是说执行A之后,一定会执行B,这个一般用来释放资源,清理缓存二、任务类
class IncrementTask extends DefaultTask { // @Input //入参 // @Optional //指明参数是可选的,不是必须赋值 String filePath //input可以使n个文件目录或者属性 // @OutputFile //出参 File file //output IncrementTask() { //指明分组名 group '自定义任务' //任务描述 description '自定义任务描述' //是否每次必须执行 outputs.upToDateWhen { true } } //注解的方式指明要执行那个方法 @TaskAction void run() { println 'incrementTask' println inputs.files.first() println inputs.files.singleFile } } //tasks是一个任务容器,包含了所有的任务 第一种方式: tasks.create('increment', IncrementTask) 第二种方式: task increment(type: IncrementTask) { filePath = 'path/to/somefile' file = file('path.txt') inputs.file file('text') }
增强任务
Zip是android自带的一个任务
task zip(type: Zip) {
//输出名字
archiveName 'my.zip'
//输出路径
destinationDir file("${buildDir}/zip")
//要压缩的名字
from "${buildDir}/outputs/logs"
}
放在构建任务完成之后执行
//在分析完成gradle之后执行
afterEvaluate {
task zip(type: Zip) {
//输出名字
archiveName 'my.zip'
//输出路径
destinationDir file("${buildDir}/zip")
println tasks.getByName('assembleDebug')
//要压缩的名字
from tasks.getByName('packageDebug').outputs.files
}
}
gradle执行流程
- 1、分析构建脚本,生成settings与project类
- 2、进行初始化配置
- 3、执行任务
afterEvaluate {}
在分析完gradle之后执行,也就是第一步和第二部之间执行
beforeEvaluate {}
在分析gradle之前执行,对于引入了android插件的工程无效
gradle构建过程中的监听
在build.gradle中直接使用gradle.add可以看到有好几个方法
gradle.addBuildListener()
构建过程中的监听回调gradle.addProjectEvaluationListener()
分析构建脚本的监听回调gradle.addListener()
这个可以有很多个监听- org.gradle.BuildListener}
- org.gradle.api.execution.TaskExecutionGraphListener}
- org.gradle.api.ProjectEvaluationListener}
- org.gradle.api.execution.TaskExecutionListener}
- org.gradle.api.execution.TaskActionListener}
- org.gradle.api.logging.StandardOutputListener}
- org.gradle.api.tasks.testing.TestListener}
- org.gradle.api.tasks.testing.TestOutputListener}
- org.gradle.api.artifacts.DependencyResolutionListener}
其中TaskExecutionGraphListener是任务执行图,当执行一个任务时,会打印出来所有执行了的任务
gradle执行任务图
gradle.addListener(new TaskExecutionGraphListener(){
@Override
void graphPopulated(TaskExecutionGraph graph) {
println graph.allTasks
}
})