這一系列暫不更新,相關技術討論,請移步微信羣,謝謝,但願你們多多支持!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中的使用狀況,相信你會喜歡!