Gralde的task说明

前言

接上一篇文章提到的,task的构建有向无环图,这个是gralde后期执行的核心,这期需要重点了解下task

在写task之前,先解决一个比较重要的问题。
在gradle写代码是很痛苦的,没有提示很难保证自己写的代码是正确的,属性有哪些?不知道!方法有哪些?不知道!一直在摸瞎的路上各种尝试或者copy代码,脑阔疼。这里有一个折中的方法供大家参考下。

dependencies {
	gradleApi()
	implementation 'com.android.tools.build:gradle:3.6.2' //版本与你在根目录下的build.gralde配置的相关
}

在配置了下载gradle的工具源码后,就可以到具体的类里面到底有哪些方法和属性。同时需要在写闭包的时候写上具体的类型,不要写个简写,举个例子

  applicationVariants.all { ApplicationVariant variant ->
        variant.outputs.all { BaseVariantOutput output ->
            
        }
    }//这里面的闭包参数的类型就标明了,在写代码的时候就可以进行一定程度提示了。

创建task

task 有两个基本的闭包,doFirst, doLast,是可以声明多个闭包,最终的会形成一个集合,不是覆盖的关系,如果按照下图的方式来定义,则其执行的顺序是"1,2, 3"
方式一

task taskA {
	doFirst {
		println(1)
	}
	doLast {
			println(2)
	}
	doLast {
			println(3)
	}
}

方式2

task taskA << {

}
这种写法与
task taskA {
	doLast {
	}
}
是等价的,是一种简写的方式。好像高版本的失效了?如果没用的不要这种简写的方式吧

方式3

project.tasks.create(name: "taskA")

查找指定的task

查找指定的task

def assembleTaskName = "taskName"
project.tasks.findByPath(assembleTaskName)

但是由于顺序的问题,如果上面的查找动作在task还没有创建之前肯定的没法找到的,一般可以采取在project扫描完成之后进行处理

project.afterEvaluate {
	def assembleTaskName = "taskName"
	project.tasks.findByPath(assembleTaskName)
}

指定依赖关系

taskB 依赖于 taskA

task taskA {

}
task taskB {

}
taskB.dependsOn(taskA)
//这种方式的优势是可以后期指定
task taskA {

}
task taskB(dependsOn: "taskA") {

}
//创建时指定

task可以进行编组

  taskB.group = "test"
   taskA.group = "test"
//编组后,相关的task就可以在android studio中查看gradle的任务时,可以看到归类后的任务

还有 runafter之类的我用的比较少,就不列举了,如果大家感兴趣,可以直接看gradle中task的源码中有哪些方法

进行apk文件拷贝的实操代码

android {
 ....
 applicationVariants.all { ApplicationVariant variant ->
        variant.outputs.all { BaseVariantOutput output ->
            def outputFile = output.outputFile
            def buildTypeName = variant.buildType.name
            def flavorsName = variant.flavorName
            println("assembleRelease variant  outputFile " + outputFile.path)
            println("assembleRelease variant  buildTypeName " + buildTypeName)

            def outputFilePath = outputFile.path
            def assembleTaskName = "assemble" + getStringFirstUp(flavorsName) + getStringFirstUp(buildTypeName)

            def flavorTargetTask = project.tasks.findByPath(assembleTaskName)
            println("assembleTaskName " + flavorTargetTask)
            flavorTargetTask.doLast {
                def targetFileDirStr =  ""
                File targetFileDir = new File(targetFileDirStr)
				if(!targetFileDir.exists()) {
				targetFileDir.mkdirs()
				}
                copy() {
                    CopySpec copySpec ->
                    from file(outputFilePath)
                    into targetFileDir.getAbsolutePath()
                    rename {
                        String srcFileName ->
                            "xxxxxx.apk"
                    }
                }
            }
        }

        project.afterEvaluate {

        }
    }

}

def getStringFirstUp(String orignal) {
    if (orignal == null || orignal.isEmpty()) {
        return orignal;
    }
    String firstchar = orignal[0]
    firstchar = firstchar.toUpperCase()
    if (orignal.length() > 1) {
        return firstchar + orignal[1..orignal.length() - 1]
    } else {
        return firstchar
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值