gradle扩展属性、任务与构建周期

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
    }
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值