欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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