Gralde的task说明
程序员文章站
2022-06-25 21:36:43
前言接上一篇文章提到的,task的构建有向无环图,这个是gralde后期执行的核心,这期需要重点了解下task在写task之前,先解决一个比较重要的问题。在gradle写代码是很痛苦的,没有提示很难保证自己写的代码是正确的,属性有哪些?不知道!方法有哪些?不知道!一直在摸瞎的路上各种尝试或者copy代码,脑阔疼。这里有一个折中的方法供大家参考下。dependencies {gradleApi()implementation 'com.android.tools.build:gradle:3....
前言
接上一篇文章提到的,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
}
}
本文地址:https://blog.csdn.net/xjz729827161/article/details/108154586
上一篇: 微信回应“马化腾天天看你的聊天记录?”
下一篇: 刷爆朋友圈