Android構(gòu)建02-Groovy基礎(chǔ)

前言


Groovy是JVM語言,與Java語法類似祟辟,如果你熟悉kotlin的話闸度,你會發(fā)現(xiàn)它與kotlin更類似些此再。它可以作為Java平臺的腳本語言使用君仆。詳細(xì)介紹請見Groovy官網(wǎng)維基百科

提示:“Groovy基礎(chǔ)”這一部分建議不要花費太多時間娶视,能看懂語法隘蝎,尤其是閉包的語法,以及知道如何查閱API即可襟企。


語法


對于語法的學(xué)習(xí)嘱么,我這里就不詳細(xì)說了,請大家按照下面步驟去學(xué)習(xí):

  1. 瀏覽一遍官方文檔的語言規(guī)范顽悼,里面有示例曼振,很容易看懂。要知道Groovy語言規(guī)范大致講了哪些內(nèi)容蔚龙,以后遇到不懂的語法冰评,可以回來快速查閱。
  2. 另外木羹,也可以看下國人寫的入門博客:任玉剛 Gradle從入門到實戰(zhàn) - Groovy基礎(chǔ)甲雅、使用Groovy開發(fā)之新特性解孙。

重點看的部分

  1. 閉包Closures。定義抛人、使用弛姜、代理策略(owner, delegate and this)
  2. 語義Semantics。重點看Promotion and coercion妖枚、OptionalityTyping部分廷臼,尤其是和閉包相關(guān)的部分。


API文檔使用說明


Groovy API包括兩部分绝页,一部分是Groovy化的JDK API(groovy-jdk)荠商,另一部分是新增的純Groovy API(gapi)。

文檔入口:

  1. 官網(wǎng)Document->API documentation
    Groovy API入口
  1. 直接進入API文檔
    Groovy Api Document
Groovy化的JDK API

This document describes the methods added to the JDK to make it more groovy.

Groovy在JDK中增加了許多方法续誉,如在List增加了public List each(Closure closure)莱没、public List dropWhile(Closure condition)等方法,使其Groovy化屈芜。

查找API示例:查看Listpublic List each(Closure closure)方法詳情郊愧。

  1. 通過包(Package)查。java.util -> Interfaces -> List -> each(Closure closure)

  2. 通過索引(Index)查井佑。Index -> 頁面搜索each(groovy.lang.Closure)(MacChrome瀏覽器快捷鍵Command+F) -> 找到Method in interface java.util.List一項

最終結(jié)果如下:

List的each方法詳情

描述說是迭代一個List属铁,并將每個子項作為參數(shù)傳遞到閉包中進行處理。

新增的Groovy類 API

Groovy - An agile dynamic language for the Java Platform
(GroovyDoc for Groovy and Java classes)

上面說的是Groovy and Java classes文檔躬翁,包括Groovy類和原生Java類(可通過文檔中的類的鏈接查看)焦蘑。尤其要注意,這個文檔中的JDK API點擊后都會鏈接到原始的Java類盒发,而不是Groovy化的Java類例嘱。
查看某個API詳情的方法與上面的相同,略宁舰。


示例-Map語法


創(chuàng)建Gradle項目拼卵,并添加名為groovySyntax的任務(wù)

$ mkdir groovy-syntax
$ cd groovy-syntax
$ vi build.gradle

build.gradle文件

task(groovySyntax).doLast {
    println 'start groovy syntax task'
    doMap()
}

def doMap() {
    def emptyMap = [:]
    def test = ["id":1, "name":"zhangliang", "isMale":true]
    test["id"] = 2
    test.id = 900
    println test.id
    println test.isMale
    println test

    test.each { key ,value ->
        println "key=$key, value=$value"
    }

    test.each { entry ->
        println "entry->$entry,${entry.key}, ${entry.value}"
    }
}

執(zhí)行gradle groovySyntax,輸出如下

Starting a Gradle Daemon (subsequent builds will be faster)

> Task :groovySyntax
start groovy syntax task
900
true
{id=900, name=zhangliang, isMale=true}
key=id, value=900
key=name, value=zhangliang
key=isMale, value=true
entry->id=900,id, 900
entry->name=zhangliang,name, zhangliang
entry->isMale=true,isMale, true

BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed

上面的代碼和輸出結(jié)果不難理解蛮艰,分析如下:

  1. 方法沒有嵌套時腋腮,括號可以省略。println 'start groovy syntax task'test.each{...}寫全就是println('start groovy syntax task)'test.each({...})
  2. Map的定義參見語言規(guī)范-Map壤蚜。
  3. Map的方法each(Closure closure)的API文檔說明如下

Allows a Map to be iterated through using a closure. If the closure takes one parameter then it will be passed the Map.Entry otherwise if the closure takes two parameters then it will be passed the key and the value.
可以用一個閉包來迭代Map即寡,閉包的參數(shù)如果是一個就作為Map.Entry,如果兩個參數(shù)就作為keyvalue袜刷。


示例-修改Android項目輸出的APK名稱


Android開發(fā)中聪富,打包完后修改apk的名稱是一個比較常見的做法。之前開發(fā)的Android項目中著蟹,在app/build.gradle中加入了幾行代碼墩蔓,每次打包后自動修改apk的名稱梢莽,相關(guān)代碼如下:
app/build.gradle


...

// 利用git commit count 作為構(gòu)建號
static def gitBuildCode() {
    def cmd = 'git rev-list HEAD --first-parent --count'
    cmd.execute().text.trim().toInteger()
}

static def appName() {
    return "youchat"
}

// 修改輸出文件的名稱
android.applicationVariants.all { variant ->
    variant.outputs.all {
        if (outputFileName != null && outputFileName.endsWith('.apk')) {
            def endStr = outputFileName
            if (outputFileName.contains("debug")) {
                endStr = "debug.apk"
            } else if (outputFileName.contains("preRelease")) {
                endStr = "preRelease.apk"
            } else if (outputFileName.contains("release")) {
                endStr = "release.apk"
            }
            outputFileName = "${appName()}_${android.defaultConfig.versionName}_${gitBuildCode()}_${endStr}"
        }
    }
}

...

打包完后,可以得到類似下面的文件
app/build/outputs/apk/preRelease/youchat_7.5.0_999_preRelease.apk
上面的代碼邏輯比較簡單钢拧,簡單分析如下:

  1. 定義了兩個方法蟹漓。gitBuildCode ()方法沒有寫return關(guān)鍵字,因為在Groovy中源内,方法總會返回值的葡粒,如果沒有寫return,就返回最后一行產(chǎn)生的值膜钓。參見語言規(guī)范-Object orientation-Method

Methods in Groovy always return some value. If no return statement is provided, the value evaluated in the last line executed will be returned

  1. android.applicationVariants.all(Closure var1)variant.outputs.all(Closure var1)是Gradle DSL語法嗽交,可以查看它的javadoc

Executes the given closure against all objects in this collection, and any objects subsequently added to this collection. The object is passed to the closure as the closure delegate. Alternatively, it is also passed as a parameter.
迭代容器中所有的對象,并傳遞給閉包進行處理颂斜。

  1. variant.outputs.all(Closure var1)閉包中的代碼邏輯是很簡單的夫壁,只說下最后一行outputFileName的賦值語句,它使用了字符串插值語法${}沃疮,與kotlin里字符串模板是類似的盒让。


參考


  1. Groovy 官網(wǎng)
  2. Apache Groovy Documentation
  3. 任玉剛 Gradle從入門到實戰(zhàn) - Groovy基礎(chǔ)
  4. Gradle DSL Javadoc
  5. 使用Groovy開發(fā)之新特性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市司蔬,隨后出現(xiàn)的幾起案子邑茄,更是在濱河造成了極大的恐慌,老刑警劉巖俊啼,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肺缕,死亡現(xiàn)場離奇詭異,居然都是意外死亡授帕,警方通過查閱死者的電腦和手機同木,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跛十,“玉大人彤路,你說我怎么就攤上這事〗嬗常” “怎么了斩萌?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屏轰。 經(jīng)常有香客問我,道長憋飞,這世上最難降的妖魔是什么霎苗? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮榛做,結(jié)果婚禮上唁盏,老公的妹妹穿的比我還像新娘内狸。我一直安慰自己,他們只是感情好厘擂,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布昆淡。 她就那樣靜靜地躺著,像睡著了一般刽严。 火紅的嫁衣襯著肌膚如雪昂灵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天舞萄,我揣著相機與錄音眨补,去河邊找鬼。 笑死倒脓,一個胖子當(dāng)著我的面吹牛撑螺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播崎弃,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼甘晤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饲做?” 一聲冷哼從身側(cè)響起线婚,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎艇炎,沒想到半個月后酌伊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缀踪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年居砖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驴娃。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡奏候,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唇敞,到底是詐尸還是另有隱情蔗草,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布疆柔,位于F島的核電站咒精,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旷档。R本人自食惡果不足惜模叙,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞋屈。 院中可真熱鬧范咨,春花似錦故觅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至替蛉,卻和暖如春贯溅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背灭返。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工盗迟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人熙含。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓罚缕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怎静。 傳聞我的和親對象是個殘疾皇子邮弹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)蚓聘,斷路器腌乡,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 導(dǎo)語: 隨著技術(shù)的發(fā)展,不管是前端開發(fā)夜牡、服務(wù)端開發(fā)或者是移動端開發(fā)(移動也是前端的一個分支)中都會用到自動化構(gòu)建工...
    伊始雨深閱讀 3,022評論 0 4
  • Groovy :是一種動態(tài)語言与纽。 1:這種語言比較有特點,它和 Java 一樣塘装,也運行于 Java 虛擬機中急迂。簡單...
    PeytonWu閱讀 1,551評論 0 1
  • 說明 本文主要從實現(xiàn)原理和代碼層面介紹Gradle開發(fā)相關(guān)知識。關(guān)于本文中提到的蹦肴、Gradle中的基本概念等內(nèi)容僚碎,...
    jzj1993閱讀 7,901評論 1 33
  • 三花齊聚頂 一葉渡江來 繪畫:喬伊喬一
    石竹閱讀 601評論 6 6