这一系列暂不更新,相关技术讨论,请移步微信群,谢谢,但愿你们多多支持!java
这会是一个系列,因此若是你看完这篇文章,请看下列文章:segmentfault
Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )微信
Gradle for Android 第二篇( Build.gradle入门 )闭包
Gradle for Android 第三篇( 依赖管理 )学习
Gradle for Android 第四篇( 构建变体 )测试
Gradle for Android 第五篇( 多模块构建 )gradle
迄今为止,咱们已经学些了众多gradle构建的概念以及如何运行tasks。在这一章,咱们将对这些概念有一个更深的理解,而后开始构建咱们本身的tasks。一旦咱们掌握了如何编写自定义tasks,那么咱们就能够试着编写本身的插件,以达到在多个项目中复用的目的。spa
在咱们建立传统tasks以前,咱们有必要了解些Groovy的基本语法。由于这理解Groovy如何运行会使得咱们能更好的理解tasks和插件。理解Groovy一样帮助咱们理解Gradle如何工做,以及为何这些配置文件须要这样配置。插件
在这一章,咱们将会遵循如下主题:
理解Groovy
从新认识tasks
Hooking Android插件
编写自定义插件
大部分Android开发者也是名Java开发者,和Java对比,Groovy也是运行在JVM上。固然,若是你是名Java开发者,那么Groovy将会变得容易阅读,可是在编写你本身的Groovy代码以前,你必须对Groovy有一个全面的了解。
Groovy起源于Java,其运行在JVM上。其目标是创造更简单,更直接的语言,不只仅在脚本语言上或者编译语言上运行。经过这一章节,咱们将对Groovy和Java进行对比。
在Java中,打印一天String应该是这样的:
System.out.println("Hello, world!");
在Groovy中,你能够这么写:
println 'Hello, world!'
你应该主要到几点不一样之处:
没有了System.out
没有了方括号
列结尾没有了;
这个例子一样使用了单引号,你可使用双引号或者单引号,可是他们有不一样的用法。双引号能够包含插入语句。插入是计算一个字符串包含placeholders的过程,并将placeholders的值替换,这些placeholder能够是变量甚至是方法。Placeholders必须包含一个方法或者变量,而且其被{}包围,且其前面有$修饰。若是其只有一个单一的变量,能够只须要$。下面是一些基本的用法:
def name = 'Andy' def greeting = "Hello, $name!" def name_size "Your name is ${name.size()} characters long."
greeting应该是“ Hello,Andy”,而且 name_size 为 Your name is 4 characters long.string的插入可让你更好的动态执行代码。好比
def method = 'toString' new Date()."$method"()
这在Java中看起来很奇怪,可是这在groovy里是合法的。
Groovy里面建立类和Java相似,举个例子:
class MyGroovyClass { String greeting String getGreeting() { return 'Hello!' } }
注意到不管是类名仍是成员变量都没有修饰符。其默认的修饰符是类和方法为public,成员变量为private。
当你想使用MyGroovyClass,你能够这样实例化:
def instance = new MyGroovyClass() instance.setGreeting 'Hello, Groovy!' instance.getGreeting()
你能够利用def去建立变量,一旦你为你的类建立了实例,你就能够操做其成员变量了。get/set方法groovy默认为你添加 。你甚至能够覆写它。
若是你想直接使用一个成员变量,你能够这么干:
println instance.getGreeting() println instance.greeting
而这二种方式都是可行的。
和变量同样,你没必要定义为你的方法定义返回类型。举个例子,先看java:
public int square(int num) { return num * num; } square(2);
你须要将该方法定义为public,须要定义返回类型,以及入参,最后你须要返回值。
咱们再看下Groovy的写法:
def square(def num) { num * num } square 4
没有了返回类型,没有了入参的定义。def代替了修饰符,方法体内没有了return关键字。然而我仍是建议你使用return关键字。当你调用该方法时,你不须要括号和分号。
咱们设置能够写的更简单点:
def square = { num -> num * num } square 8
###闭包
闭包是一段匿名的方法体,其能够接受参数和返回值。它们能够定义变量或者能够将参数传给方法。
你能够简单的使用方括号来定义闭包,若是你想详细点,你也能够这么定义:
Closure square = { it * it } square 16
添加了Closure,让其更加清晰。注意,当你没有显式的为闭包添加一个参数,groovy会默认为你添加一个叫作it。你能够在全部的闭包中使用it,若是调用者没有定义任何参数,那么it将会是null,这会使得你的代码更加简洁。
在grade中,咱们常用闭包,例如Android代码体和dependencies也是。
在groovy中,有二个重要的容器分别是lists和maps。
建立一个list很容易,咱们没必要初始化:
List list = [1, 2, 3, 4, 5]
为list迭代也很简单,你可使用each方法:
list.each() { element -> println element }
你甚至可使得你的代码更加简洁,使用it:
list.each() { println it }
map和list差很少:
Map pizzaPrices = [margherita:10, pepperoni:12]
若是你想取出map中的元素,可使用get方法:
pizzaPrices.get('pepperoni') pizzaPrices['pepperoni']
一样的groovy有更简单的方式:
pizzaPrices.pepperoni
是否是简单到爆,瞬间感受Java太复杂的有木有。下一章咱们将学习Groovy在Gradle中的使用状况,相信你会喜欢!