Gralde的task说明

Posted xjz729827161

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
    



以上是关于Gralde的task说明的主要内容,如果未能解决你的问题,请参考以下文章

配置gralde环境变量

gradle中的task

Gralde 网络代理

安装gralde以及gradle插件

一文了解Gralde

gralde执行遇到Unsupported major.minor version 52.0错误