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

来源:互联网 发布:新网域名转万网 编辑:程序博客网 时间:2024/06/06 00:18

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'//每个对象都能够设置exttask 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 任务名 << {

    }

  • 第二种方式

    DefaultTasktask 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 finalizedD.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    }})
阅读全文
0 0
原创粉丝点击