Android Studio Gradle 介绍 2

Gradle简介

前面讲解了groovy的简单语法,本篇文章就来详细介绍一下gradle的使用吧。

0x00 首先要知道的一点东西

  • 首先贴出gradle的官网:http://gradle.org/
  • 然后是官方文档 :https://docs.gradle.org/current/dsl/ 如果你英语没问题,可以关了这篇blog直接看他的官方文档来学习,这当然是坠吼滴! 本篇文章主要将一下Gradle的一些基础知识,让读者大致明白Gradle是个什么东西以及他的一些API怎么用。 ### 0x01 配置环境 由于Gradle是基于Java,所以首先当然是要配好Java的环境变量了,不过对于Android开发者来说,配java这些应该很简单了,这里就讲一下怎么配grade。 首先要去他的官网下载需要的Gradle SDK,举个例子:https://downloads.gradle.org/distributions/gradle-3.0-all.zip 这里下载的是3.0版本的all版,里面包含了这个版本所需的全部内容:源代码,文档,示例等。下载好后的配置,这里以Ubuntu 14.04来举例。编辑 ~/.bashrc文件,在里面加上:vim GRADLE_HOME=/home/levent_j/gradle PATH=${PATH}:${GRADLE_HOME}/bin export GRADLE_HOME PATH 然后在终端执行 source ~/.bashrc 使配置生效即可。这样只是对当前用户的。如果要对所有用户都可用,需要在/etc/profile中添加,并重启才能成功。配置完成后终端执行 gradle -v后看到如下信息说明配置成功。

11

配置完成后就可以使用了。在此之前先要说明一下,gradle是用groovy这门语言写的一种用来构建项目的工具,或者也可以称之为一个框架。我们在AndroidStudio中见到的xxx.gradle文件中的东西都是gradle的一些API的调用。完全学习gradle框架需要我们很多精力去钻研,这里只是简单的介绍一下一些常见的API和组件,使我们在Android开发中能够灵活运用即可。

0x02 几个重要概念:Project,Task等

每一个用Gradle构建的工程都叫做一个Project,每一个Project会包含很多Task,在构建过程中,不同的Task各司其职。每个Task相当于一个Project对象的函数,专门用来干一件事,比如Android项目的构建过程就包括了Java的编译、资源的编译、打包过程、签名等Task。Task写法如下:

//Task的原型为create(String name,Closure configureClosure),根据groovy语法
//第一个参数为任务名,第二个参数为闭包,所以可以写在括号外。
task demo_task{
    doFirst{
        //step1
    }
    doLast{
        //step2
    }
    //这里只写了两个方法doFirst和doLast,其他方法及属性请参照官方文档
}

不同的Task之间可以增加依赖,比如Task A依赖于B,那么要执行A首先会执行B。而一个任务可以依赖的任务不止一个,这有点像面向对象编程中的“继承”。在每一个Project中都必须有一个build.gradle文件,这是一个构建脚本,类似于makefile,这个文件是整个Project构建的入口,可以在其中做一些配置,比如版本、插件、依赖等。

一般情况下,要编译一个工程,只需要cd到那个工程目录下,执行 gradle xxx(任务名)即可。有这样一种情况,即一个大的Project下有很多Project也需要编译。这个时候,我们可以分别cd到他们的目录下执行任务,但是这样做比较麻烦,有种简单的方法是,对于其中的每个Project,分别创建一个build.gradle,作为他们的编译脚本,然后在根目录下创建两个文件:build.gradle和setting.gradle。其中,这里的build.gradle用来配置其目录下的其他Project,为他们添加一些共同的属性。这个setting.build文件用来说明当前目录下有哪些Project是需要编译的,这相当于在一个Android Project之中创建了许多Module。只有在这里配置了的Project,在构建时才会被识别。比如我们在Androd工程的根目录下setting.gradle中常见的:

include 'app'

当然,这个setting文件不但可以用来添加Project,也可以为其添加一些函数,这些函数会在构建时执行。

0x03 工作流程/生命周期

关于工作流程和生命周期,可以看看官方文档有很详细的解释。
Gradle基于Java,因此在执行Gradle工作之前,所有的脚本都会转换为Java对象。Gradle有三种对象:Gradle对象、Project对象和setting对象。其中,当我们开始执行Gradle的时候,便会创造出一个gradle对象,在整个生命周期中也只有这一个对象来操作。每一个Project中的build.gradle会变为一个Project对象,而根目录下的setting.gradle会变为一个setting对象。
至于具体的工作流程,这里用一张图片总结一下:

22

简单来说,Gradle的工作过程分为三个阶段:Initialization阶段、Configuration阶段以及Execution阶段。首先,是一个Initialization阶段。在这一阶段,做一些初始化的工作,比如解析setting.gradle,知道之后要编译哪几个Project。下一个阶段,是Configuration阶段。在这一阶段,会解析每个Project中的build.gradle文件。在这一阶段中,Configuration会为所有的Task根据其依赖关系而建立一个有向图。执行完毕后,进入最后一个阶段,即开始执行任务。除此之外,在这三个阶段之间还会执行一些自定义的方法。

0x04 Task详解

前面说了,每个Project中包含了很多Task,在这里每一个Task就相当于Project中的一条属性,这个属性的类型都是TaskContainer,属性名即是Task名。Gradle中,每个Project默认都有许多类似的属性,从官方文档可以看到:
33
如上这些属性名字,看着是不是似曾相识?
44
没错,在build.gradle中有很多这样的属性,具体每个属性的意思大家翻翻官方文档就好了,我在后面会简单说一点。
任务也是一个属性,在定义完这个属性/任务后,就可以通过任务名来操作。接下来,我会详细的介绍一下任务的创建以及调用。

创建

首先说一下创建任务,第一种方法是很“规矩”的通过任务名来创建,这看起来和java中创建一个对象有点像:

def Task demo_task = task(demo_task)

第二种方式,是通过任务名和对该任务配置的Map对象来创建,具体和上面一样,只是创建时多了一个参数:

    def Task demo_task = task(demo_task,group:BasePlugin.BUILD_GROUP)

第三种方式,是最简单的也是最常见的闭包方式创建,这在前面讲过:

task demo_task{
//具体要做的事
}

因为第二个参数为闭包,所以可以直接写在外面这种形式,写起来还是挺爽的。

访问

创建好任务了,接下来就是使用这些任务。前面说过,任务就相当于一条属性,我们可以通过任务名,即属性名来访问相应的属性:

demo_task.doLast{
//...
}

前面还说了,任务属性本质是TaskContainer,这也相当于一个任务集合,集合中的键值key对应的时一个任务的任务名,我们可以用键值来访问。不过这个集合并不是一个Map,用[]操作符通过key值访问表面上看是对Map的访问,本质上其实是调用了tasks.get(key)这个方法,这是groovy中的一点知识。

tasks['demo_task'].doLast{
//...
}

除此之外,还可以通过get/find和路径或者任务名来访问。这其中的区别在于:

  • get访问时,如果获取不到任务会报异常,而find获取不到时直接返回null
  • 通过路径访问,参数为路径或任务名,而通过名字访问,参数必须是任务名。
属性

Task还有一个要点任务的各种属性的定义,常见的有分组和添加描述。分组说白了就是给任务分个类,添加的描述是为了我们更快的了解不同的任务具体的用途,二者都是为了我们更加方便使用Task而设计的,这些内容在我们编译的时候会打印出来:

def Task demo_task = task demo_task
demo_task.group = xxx//分组
demo_task.description = 'xxx'//添加的描述

除此之外,还有一个重要的属性:是、shouldRunAfter和mustRunAfter。这两个属性顾名思义,是让Task有个先后顺序,必须先执行完一个Task之后才能执行另外一个Task。比如:

task1.shouldRunAfter(task2)

这样定义了的话,会首先执行task2,之后才会执行task1。这里should和must的区别在于,should是应该会依次执行,个别情况下还是不会依顺序。而must是必须依次执行,是强制性的。
其他的属性,比如:enable,用于启用或禁用Task;类似的还有一个onlyif,可以传一个闭包进去,如果闭包返回true则执行该Task,否则不执行。

<<操作符

在Task的定义中,有时候会看到<<这个操作符:

task demo_task<<{
//...
}

这里<<操作符,其实就是doLast的意思,用了这个操作符就可以代替doLast了。这在源码中可以看到,<<操作符会在传入一个闭包后调用actions.add()操作,即把这个闭包传到一系列动作列表的末尾,也就是doLast了。那么这个actions到底是什么呢?接下来详细介绍一下。

工作流程

每一个Task都会拥有一个List类型的动作列表,这个列表中放入了我们的所有操作,在执行Task时会依次执行actions中的操作。在这个acions中,第一个操作是doFirst,在一开始就执行;最后一个操作是doLast,在最后执行;这之间有一个操作doSelf,会在Task执行的过程中执行。

Gradle的一些常见api都基本上讲完了,具体的细节可以看看官方文档,那里会写的比较清楚。接下来,我们来谈谈Gradle在Android工程具体的构建过程中如何使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值