感覺寫在一篇里面的話包券,篇幅會很長兰珍,所以拆成系列來寫,每一篇專注一個主題,這樣條理也會清晰一些。
首先找默,是完成這個系列的過程中所閱讀、參考的資料:
[1] Gradle for Android
[2] https://lippiouyang.gitbooks.io/gradle-in-action-cn/content/
[3] http://www.infoq.com/cn/articles/android-in-depth-gradle
[4] https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html
[5] https://docs.gradle.org/current/dsl/
[6] http://google.github.io/android-gradle-dsl/current/
然后顷蟀,進(jìn)入正題囤萤。
但是富雅,在講Gradle之前滚婉,還是先說說Groovy這門語言吧骇窍,畢竟主要的語法特點(diǎn)還是需要了解的。
Groovy是一種動態(tài)語言足画,它和Java一樣俘侠,也運(yùn)行于Java虛擬機(jī)中,你可以認(rèn)為Groovy擴(kuò)展了Java語言。
Groovy對自己的定義就是:
Groovy是在 java平臺上的禁谦、 具有像Python丧蘸, Ruby 和 Smalltalk 語言特性的靈活動態(tài)語言, Groovy保證了這些特性像 Java語法一樣被 Java開發(fā)者使用。
除了語言和Java相通外,Groovy有時候又像一種腳本語言陈症。
當(dāng)執(zhí)行Groovy腳本時吊说,Groovy會先將其編譯成Java類字節(jié)碼,然后通過JVM來執(zhí)行這個class文件。
-
基本語法特點(diǎn):
1.注釋標(biāo)記和Java一樣。
2.語句可以不用分號結(jié)尾。
3.支持動態(tài)類型威沫。即定義變量的時候可以不指定其類型屁商。
4.變量定義可以使用關(guān)鍵字def官还。注意屡谐,雖然def不是必須的顶伞,但是為了代碼清晰锨咙,建議還是使用def關(guān)鍵字骂倘。
5.函數(shù)定義時漾唉,可以不指定參數(shù)的類型料睛。
6.函數(shù)的返回值也可以是無類型的居扒。
7.函數(shù)返回值:Groovy的函數(shù)里玉吁,可以不使用return xxx來設(shè)置xxx為函數(shù)返回值悔常。如果不使用return語句的話,則函數(shù)里最后一句代碼的執(zhí)行結(jié)果被設(shè)置成返回值。
8.Groovy中函數(shù)調(diào)用的時候可以不加括號。
...
具體的例子可以參見http://www.infoq.com/cn/articles/android-in-depth-gradle遗嗽,然后自己寫幾個hello world的groovy腳本運(yùn)行試試娇豫。
-
I/O操作相關(guān)類的SDK地址
這些類在Gradle配置文件中可能會用到喲
java.io.File:
http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/File.html
java.io.InputStream:
http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/InputStream.html
java.io.OutputStream:
http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/OutputStream.html
java.io.Reader:
http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/Reader.html
java.io.Writer:
http://docs.groovy-lang.org/latest/html/groovy-jdk/java/io/Writer.html
java.nio.file.Path:
http://docs.groovy-lang.org/latest/html/groovy-jdk/java/nio/file/Path.html
-
閉包Closure
閉包袖肥,是一種數(shù)據(jù)類型历恐,它代表了一段可執(zhí)行的代碼。
def aClosure = {//閉包是一段代碼鸟辅,所以需要用花括號括起來..
String param1, int param2 -> //這個箭頭很關(guān)鍵再层。箭頭前面是參數(shù)定義蛋济,箭頭后面是代碼
println "this is code" //這是代碼渡处,最后一句是返回值醇份,
//也可以使用return畔濒,和Groovy中普通函數(shù)一樣
}
在Groovy中毅整,當(dāng)函數(shù)的最后一個參數(shù)是閉包的話艇潭,函數(shù)的調(diào)用可以省略圓括號蹋凝。(這點(diǎn)非常重要鳍寂,我們看到的build script里面各種script block其實(shí)都是方法調(diào)用情龄,這些方法都以closure作為參數(shù),所以直接省略方法調(diào)用的圓括號了)
比如:
def testClosure(int a1, String b1, Closure closure){
//do something
closure() //調(diào)用閉包
}
//那么調(diào)用的時候鞍爱,就可以免括號专酗!
testClosure 4, "test", {
println "i am in closure"
}
我習(xí)慣粗略地將閉包按照J(rèn)ava中的回調(diào)去理解:一個只有單一方法的接口。這種理解是從功能/作用的角度出發(fā)唯卖,兩者承擔(dān)的功能/作用是差不多的。
-
Groovy腳本是怎么實(shí)現(xiàn)的
Java中抽减,我們最熟悉的是類橄碾。但是我們在Java的一個源碼文件中,不能不寫class(interface或者其他....)法牲。
而Groovy可以像寫腳本一樣悼瓮,把要做的事情都寫在xxx.groovy中,比如叫test.groovy,然后通過
groovy test.groovy
直接執(zhí)行這個腳本。
這到底是怎么實(shí)現(xiàn)的呢玷室?
Groovy既然是基于Java的箩兽,就需要把test.groovy中的內(nèi)容轉(zhuǎn)換成一個Java類身坐。
- test.groovy被轉(zhuǎn)換成了一個Test類涯鲁,它繼承自Script類。
- 每一個腳本都會生成一個靜態(tài)main()函數(shù)肩祥,這樣檀蹋,當(dāng)我們執(zhí)行g(shù)roovy test.groovy的時候,其實(shí)就是用java去執(zhí)行這個main()函數(shù)坠七。
- 腳本中的所有代碼都會放到run()函數(shù)中拳魁。
- 如果腳本中定義了函數(shù),則函數(shù)會被定義在Test類中。
詳見:
http://www.infoq.com/cn/articles/android-in-depth-gradle
和
https://github.com/hehonghui/android-tech-frontier/blob/master/issue-19/gradle%E6%8A%80%E5%B7%A7%E4%B9%8B%E8%AF%AD%E6%B3%95%E6%B5%85%E8%B0%88.md
作為一門語言,Groovy是復(fù)雜的筋栋,是需要深入學(xué)習(xí)和鉆研的。一本厚書甚至都無法描述Groovy的方方面面。
從使用角度看,尤其是又限定在Gradle這個領(lǐng)域內(nèi)贞言,能用到的都是Groovy中一些簡單的知識义钉。