Android Gradle 自定义Task 详解

一:Gradle 是什么

  • Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。

  • 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。面向Java应用为主。

  • 当前其支持的语言限于Java、Groovy、Kotlin和Scala,计划未来将支持更多的语言。基于 groovy 脚本构建,其 build 脚本使用 groovy 语言编写。


二:groovy 是什么

Groovy是一种动态语言,它和Java类似(算是Java的升级版,但是又具备脚本语言的特点),都在Java虚拟机中运行。当运行Groovy脚本时它会先被编译成Java类字节码,然后通过JVM虚拟机执行这个Java字节码类。


三:Gradle 的 Project 和 Tasks

每次构建(build)至少由一个project构成,一个project 由一到多个task构成。每个task代表了构建过程当中的一个原子性操作,比如编译,打包,生成javadoc,发布等等这些操作。

gradle : 一个 project 包含多个 task,一个 task 包含多个 Action

project 
                  -- task1 (Action1、Action2...)
                  -- task2 (Action1、Action2...)
                  -- ...

四:自定义 Task

  • 格式:

 task 任务的名字 {    //do some things
 }
  • 例子

build.gradle

//定义 task , 名字 hello task hello{    println "hello world"}//定义 task,名字 hello task(hello2){    println "hello world2"}//定义 task,名字 hello3 task ('hello3'){    println "hello world3"}
  • 在终端运行 gradle 命令

//执行 hello taskgradlew hello//执行 hello2 taskgradlew hello2//执行 hello3 taskgradlew hello3

五:创建Action

在上面的举例中,是一个非正式的 task , 说非正式是因为创建的 task 里面没有 action 。task 本质上又是由一组被顺序执行的 Action 对象构成,Action其实是一段代码块,类似于Java中的方法。

创建 Action 相关 API

 //在Action 队列头部添加Action
 Task doFirst(Action<? super Task> action); Task doFirst(Closure action); //在Action 队列尾部添加Action
 Task doLast(Action<? super Task> action); Task doLast(Closure action);    
 //已经过时了,建议用 doLast 代替
 Task leftShift(Closure action); //删除所有的Action
 Task deleteAllActions();

小例子

build.gradle

//创建一个名字为hello的 task task hello {    //创建一个 Action , 添加到 Action 列表的头部
   doFirst(new Action<Task>() {
       @Override       void execute(Task task) {
           println "action1++++++++++"
       }
   })    //创建一个 Action , 添加到 Action 列表的头部
    doFirst {
        println "action2++++++++++"
    }

}

在 Action 列表中添加了 两个 Action , Action 列表如下图所示:

这里写图片描述

运行 hello task : gradle hello

运行结果:

action2++++++++++
action1++++++++++

leftShift 说明

leftShift 的作用和 doLast 一样,在action 列表尾部添加一个Action,只不过现在过时了,官方建议用 doLast 代替。下面举个小例子:

build.gradle

task hello {    //在 Action 列表尾部添加一个 Action 
    leftShift {        println "+++++"
    }
}

leftShift 还有一种简洁写法,用 << 代替, 如下所示:

build.gradle

task hello <<{    //在 Action 列表尾部添加一个 Action 
    println "+++++"}

那么问题来了,task 中的 Action 在什么时候执行?

六:Gradle 生命周期

1.初始化阶段

会去读取根工程中 setting.gradle 中的 include 信息,决定有哪几个工程加入构建,创建 project 实例,比如下面有三个工程: include ':app', ':lib1', ':lib2 。

2.配置阶段

会去执行所有工程的 build.gradle 脚本,配置 project对象,一个对象由多个任务组成,
此阶段也会去创建、配置task及相关信息。

3.运行阶段

根据gradle命令传递过来的task名称,执行相关依赖任务。Task 的 Action 会在这个阶段执行。

七:创建 Task 的另外一种方式

在上面讲解了创建 task 的基本方式,其实 gradle api 给我们提供了其他的方式创建 task ,下面讲解其他两种方式。

  • tasks

build.gradle

//创建 hello2 tasktasks.create("hello2"){
    doFirst {        println "hello2+++++"
    }
}
  • 自定义 DefaultTask 子类

class MyTask extends DefaultTask {    
    @TaskAction
    void action(){
        println "action1+++++"
    }
}//创建 hello3 tasktask hello3 (type: MyTask){
    doLast{
       println "action2+++++"
    }
}

运行 hello3 task: gradlew hello3

输出

action1+++++
action2+++++

八: Task 依赖

1、dependsOn

build.gradle

task task1 << {    println "我是task1----"}

task task2 << {    println "我是task2----"}//task2 依赖 task1, 执行task2之前先执行task1task2.dependsOn task1

执行 task2

gradlew task2

执行效果

我是task1----
我是task2----

2、mustRunAfter

两个 task 依赖

task task1 << {    println "我是task1----"}

task task2 << {    println "我是task2----"}//task2 运行之前先运行task1task2.mustRunAfter task1
  • 执行 task1 : gradlew task1

    我是task1----

  • 执行 task2 : gradlew task2

    我是task2----

  • 同时执行 task1、task2 : gradlew task1 task2

    我是task1----
    我是task2----

三个 task 相互依赖

build.gradle

task task1 << {    println "我是task1----"}

task task2 << {    println "我是task2----"}

task task3 << {    println "我是task3----"}

task2.mustRunAfter task1
task3.mustRunAfter task1
  • 执行 gradlew task1 task2 task3

    我是task1----
    我是task2----
    我是task3----

  • 执行 gradlew task1 task3 task2

    我是task1----
    我是task3----
    我是task1----

在出现语法矛盾的情况下,依赖关系形成闭环,编译器会报错

task1.mustRunAfter task2task2.mustRunAfter task1

3、shouldRunAfter

形成依赖关系可有可无。

build.gradle

task task1 << {    println "我是task1----"}

task task2 << {    println "我是task2----"}

task1.shouldRunAfter task2

运行: gradlew task1 task2

我是task2----
我是task1----

在出现语法矛盾的情况下,依赖关系形成闭环,会自动打破闭环。不会报错

九:系统默认 task

gradle 默认提供了很多 task 给我们使用,比如 copy、delete

1、copy

build.gradle

task 任务的名字 (type: Copy) {    //action }
  • Api 介绍

//数据源目录,多个目录public AbstractCopyTask from(Object... sourcePaths)  

//目标目录,单一public AbstractCopyTask into(Object destDir) 

//过滤文件 包含public AbstractCopyTask include(String... includes)//过滤文件 排除public AbstractCopyTask exclude(String... excludes)//重新命名,老名字 新名字public AbstractCopyTask rename(String sourceRegEx, String replaceWith)//删除文件 Project 接口boolean delete(Object... paths);

小例子:

  • 复制图片:单一数据源

task copyImage(type: Copy) {    from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'
    into 'C:\\Users\\yiba_zyj\\Desktop'
}
  • 复制图片:多个数据源

task copyImage(type: Copy) {    from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy' , 
         'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'
    
    into 'C:\\Users\\yiba_zyj\\Desktop'
}
  • 复制图片:过滤文件

只会复制后缀为 .jpg 的文件

task copyImage(type: Copy) {    from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'
    into 'C:\\Users\\yiba_zyj\\Desktop'    include "*.jpg" 
}
  • 复制文件:过滤文件,重命名

task copyImage(type: Copy) {    from 'C:\\Users\\yiba_zyj\\Desktop\\gradle\\copy'
    into 'C:\\Users\\yiba_zyj\\Desktop'
    include "*.jpg"
    exclude "image1.jpg"
    rename("image2.jpg","123.jpg")
}

文件覆盖规则

相同文件覆盖

Copy 类的继承图

Copy (类)   - AbstractCopyTask (抽象类)  (from、 into、 include、rename)
      -ConventionTask(抽象类)
       - DefaultTask (类)
        - AbstractTask (抽象类)
           - TaskInternal (接口)
            - Task(接口)        
              -Comparable<Task>, ExtensionAware(接口)
                -Project(接口)    (delete 方法)

2、Delete

  • 删除 Android 更目录的aaa 文件

build.gradle

task deleteFile(type: Delete) {    //删除Android 更目录的aaa 文件
    delete '../aaa'  }
  • 删除桌面上的文件

build.gradle

task deleteFile(type: Delete) {
    //删除系统桌面 delete 
    delete "C:\\Users\\yiba_zyj\\Desktop\\gradle\\delete"
}

十:小技巧

1、自定义 task 的名字用驼峰命名法

build.gradle

task deleteFile{    //do some things}

运行

gradlew dF 等价 gradlew deleteFile

打包时候运行 gradlew assembleRelease,可以简写成 gradlew aR

2、常见的 gradlew 命令

查看项目所有默认自带的 task,不包括自定义 task

gradlew tasks

查看所有 task (默认 task + 自定义task)

gradlew tasks --all

查看某个 task 的相关信息,这些结果包含了任务的路径、类型以及描述信息等

gradlew help --task taskName

查看 gradle 版本

gradlew -version

3、给task 添加描述 description

task task1 << {    description = "这是一段描述信息"
    println "我是task1----"}

十一:Gradle 环境变量配置

在上面的介绍中,运行 task 的方式是用 gradlew , 那我们怎么用 gradle 。如果在终端运行 gradle 就会提示 gradle 不是内部或外部命令,也不是可运行的程序或批处理文件。

'gradle' 不是内部或外部命令,也不是可运行的程序或批处理文件。

官网下载:http://services.gradle.org/distributions/

下载完成后,我将压缩包解压放在 d 盘的 soft 目录中。
环境变量

  • GRADLE_HOME

D:\soft\gradle-4.3-all

  • Path

    D:\soft\gradle-4.3-all\gradle-4.3\bin


原文地址:https://blog.51cto.com/14009815/2359863

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


安装环境都很简单,就是下载工具需要在华为开发者联盟里注册,然后认证,扫码认证我这边是不可以的,人工认证需要两个工作日审核安装成功之后遇到了很多报错,网上都是可以解决的,遇到下面这个报错网上查了很多方式也解决不了,于是记录一下  找了很久,发现网上说的我都配置了,添加 allow
上传的方式有两种,第一种是通过bintray官方出的插件bintray/gradle-bintray-plugin第二种是一个国外组织开源的插件novoda/bintray-release 这里讲bintray/gradle-bintray-plugin  1.在项目根目录下的 build.gradle 添加插件依赖 dependencies{classpat
转载自: 完美解决Error:SSLpeershutdownincorrectly打开gradle文件夹下的gradle-wrapper文件修改其中的配置文件将红色区域修改为http://services.gradle.org/distributions/等待编译完成
https://www.jianshu.com/p/9220227cdfb3buildscript{ext.kotlin_version='1.2.71'repositories{google()jcenter()}dependencies{//classpath'com.android.tools.build:gradle:3.1.0-alpha09'
Markdown版本笔记我的GitHub首页我的博客我的微信我的邮箱MyAndroidBlogsbaiqiantaobaiqiantaobqt20094baiqiantao@sina.com发布库到仓库mavenjcenterJitPackMD目录目录通过AS创建aar的步骤发布到Github仓库【推荐】创建项目配置项目构建并上传上传
 跟着教程做的,已经有了JDK,直接进行后面的步骤,下载安装AndroidSDK没有FQ,教程里的网址打不开,就换了个。网址http:/ools.android-studio.org/index.php/sdk下的.exe  nextinstall然后就是漫长的等待 ……先这样吧开始下载AndroidStudio,网址http://www.and
今天更新了universal-image-loader-1.9.5.jar文件,studio死活找不到其中相关的类,上网百度试了很多办法,总算解决了,具体方法跟一篇老外的帖子的差不多,这里分享下。 解决步骤:Somethingwentwronginincrementalbuildsystem.Oneofthisshouldhelp:MenuBuild->Rebuild
https://blog.csdn.net/zxc514257857/article/details/80425711编写不易,如有转载,请声明出处:梦回河口:https://blog.csdn.net/zxc514257857/article/details/80425711报错一:Error:Unabletofindmethod'com.android.build.gradle.tasks.factory.AndroidJavaCompile.setDepe
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow                     创建兼容AndroidStudio和eclipse的AS工程虽然我的博客名叫eclipse_xu,但是我已经将
gradle跳过测试直接编译gradlebuild-xtest  根据build.gradle和setting.gradle文件生成idea项目:gradleidea  gradle这几年发展迅猛,github越来越多的项目都开始采用gradle来构建了,但是并不是所有人都对gradle很熟悉,下面的方法可以把gradle转成maven项目,前提gradle项
本地仓库配置配置环境变量GRADLE_USER_HOME,并指向你的一个本地目录,用来保存Gradle下载的依赖包。 远程仓库配置一般Gradle、maven从中央仓库mavenCentral()http:/epo1.maven.org/maven2/下载依赖包,但是在国内下载速度巨慢,我们只能使用国内的镜像。所以每个Gradle构建的项目
what:Buildtool(构建工具)是从源代码自动创建可执行应用程序的程序。构建包括将代码编译,链接和打包成可用或可执行的形式。在小项目中,开发人员通常会手动调用构建过程。这对于较大的项目来说是不实际的,在这些项目中,很难跟踪需要构建的内容,构建过程中的顺序和依赖关系。使用自动化工
说明:该示例为在windows系统下自动化部署springboot架构:springboot+github+gradle+jdk8各种配置步骤及截图说明:1、配置git,gradle及jdk  系统管理→全局工具配置  说明:其中git配置项中的PathtoGitexecutable要指到git.exe文件,maven的配置方式和gradle类似
AndoridStudio模块化开发相关配置下面以宿主APP模块和Uer_Module模块为例:第一步:在项目根目录gradle.properties配置文件中添加如下代码isNeedUserModule=true#isNeedUserModule=false 第二步在user_module中的build.gradle文件中加入了如下代码来控制此库是library还
buildtools构建工具能够帮助你创建一个可重复的、可靠的、携带的且不需要手动干预的构建。构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求。假设你想要编译源代码,将生成的class文件拷贝到某个目录,然后将该目录组装成可交付的软件。如下图所示,展示了所
Git及用法Git是目前世界上最先进的分布式版本控制系统。Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上
打release包的时候,出现这个玩意,但debug直接跑apk又没问题。Causedby:com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:ExpectedanamebutwasSTRINGatline1column99path$[0].apkInfo.versionNameatcom.google.gson.internal.bind.
android\gradle\wrapper\gradle-wrapper.properties由distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-2.12.1-all.
1.上传本地仓库1.1build.gradle项目设置plugins{id'java'id'maven'//引入maven插件}group'com.inkyi'//包名version'1.0.1-SNAPSHOT'//版本号1.2 build.gradle上传设置//指定上传的路径deflocalMavenRepo='file://'+new
Gradle的Emas服务插件会加载您下载的aliyun-emas-services.json文件。请修改工程的build.gradle使用该插件。配置步骤如下:1.修改项目级目录下build.gradle({project}/build.gradle):1buildscript{2repositories{3maven{4url'http://maven.aliyun.com