一 作用
編譯,打包,依賴管理。
二 語言:Groovy
1 聲明變量和方法
def a = 1;
def b = "hello";
def int c = 3;
def sayHello(){
println("hello");
return 1;
}
1 變量類型名,方法類型名,分號,return都可以省略。
所以可以變成:
def a = 1
def b = "hello"
def c = 3
def sayHello(){
println("hello")
1
}
2 def和類型存在一個就可以,也可以都存在
//case1:
def a = 1
int a = 1
def int a = 1
//case2:
def sayHello(String msg){
println(msg)
1
}
def sayHello(msg){
println(msg)
1
}
int sayHello(msg){
println(msg)
1
}
3 但是groovy依然是強類型語言,類型轉換不一致時仍然會報錯。
4 groovy中的注釋和java中的注釋一致。
2 Groovy數(shù)據(jù)類型
groovy中數(shù)據(jù)類型有:
1 java中的基本類型
2 java中的對象
3 閉包
4 加強的List,Map等集合類型
5 加強的File,Stream等IO類型
變量默認修飾符為public,基本類型和對象和java中一樣,下面是有一些變換的類型。
1 String類型
String類型的特點是它的字符串拼接方式,用${},把變量放入{}中,加到其他字符串中間,就可以。
def a = "a"
def b = "b"
def c = "a:${a},b:$"
println(c)
result:
a:a,b:b
2 閉包
閉包作為Groovy中的一個類型,可以簡單理解成函數(shù)的另一種定義形式。
閉包可以指定參數(shù)和返回值,當然也可以不指定。
//指定參數(shù)和返回值
def test1 = {
String a,int b->"result is a=${a},b=$"
}
def test2 = {
a,b->"result is a=${a},b=$"
}
//只指定返回值def test3 = { "result is no input"}
//只指定參數(shù)def test4 = { a,b-> println(a+b)}
//既不指定參數(shù),又不指定返回值def test5 = { a = 2 b = 3 c = a+b println(c)}
//運行
def a = test1("test1",1)
println(a)
def b = test2("test2",2)
println(b)
def c = test2()
println(c)
test4(1,2)
test5()
//最后的輸出分別為
result is a=test1,b=1
result is a=test2,b=2
result is no input
3
5
當閉包中不指定參數(shù)時,閉包中默認存在一個it參數(shù),可以直接使用,也可以當做它不存在,不使用。
使用的例子:
def hiddenTest = {
println("the hidden parameter is ${it}")
}
//運行
hiddenTest("test")
//結果
the hidden parameter is test
3 List 和Map
關于Map和List,Groovy中添加了一些簡單的寫法,一些方法名上也做了一些改動。
可以直接在文檔中查閱,文檔不支持搜索,只能按照首字母索引的順序找。
http://docs.groovy-lang.org/latest/html/groovy-jdk/index-all.html
4 File,Stream,XmlParser
groovy中同樣提供了文件流的操作,和xml解析工具。也是做了一些簡化,同時增加了java中不存在的一些方法。
文檔
http://docs.groovy-lang.org/latest/html/groovy-jdk/index-all.html
3 Groovy中其他特性
1 對于class類型的數(shù)據(jù),可以省略 .class,下面兩種寫法效果完全一致
func(File.class)
func(File)
def func(Class clazz) {}
2 類中自動包含getter和setter,下面兩種寫法效果也是一致的
Book bk = new Book()
bk.id = 1
bk.name = "android art"
bk.press = "china press"
//可以簡寫為:
Book bk = new Book()
bk.with {
id = 1
name = "android art"
press = "china press"
}
4 簡化的三元表達式
def result = name != null ? name : "Unknown"
// 省略了name
def result = name ?: "Unknown"
5 簡化的非空判斷
if (order != null) {
if (order.getCustomer() != null) {
if (order.getCustomer().getAddress() != null) {
System.out.println(order.getCustomer().getAddress());
}
}
}
//可以簡寫為:
println order?.customer?.address
6 在Groovy中,可以使用assert來設置斷言,當斷言的條件為false時,程序將會拋出異常
def check(String name) {
// name non-null and non-empty according to Gro ovy Truth
assert name // safe navigation + Groovy Truth to check
assert name?.size() > 3
}
7 switch中判斷條件更靈活,可支持多種類型同時判斷
def x = 1.23
def result = ""
switch (x) {
case "foo":
result = "found foo" // lets fall through
case "bar":
result += "bar"
case [4, 5, 6, 'inList']:
result = "list"
break
case 12..30:
result = "range"
break
case Integer:
result = "integer"
break
case Number:
result = "number"
break
case { it > 3 }:
result = "number > 3"
break
default:
result = "default"
}
8 在Groovy中,==相當于Java的equals,,如果需要比較對個對象是否是同一個,需要使用.is()。
Object a = new Object()
Object b = a.clone()
assert a == b
assert !a.is(b)
4 編譯,運行Groovy
只需要在build.gradle中編寫task,然后用gradle命令,執(zhí)行這個task就可以
task(testname).doLast {
println "test"
aFun()
}
def aFun() {
println "have fun!"
System.out.println("test!");
}
運行
gradle testname
三 Gradle
1 gradle的編譯周期
提到gradle的編譯,兩個重要的概念是Project和Task
Project:對應build.gradle文件,每個build.gradle就是一個Project
Task:就是build.gradle中具體的task,就是一個個方法,每個Task中又有多個action
執(zhí)行的過程,就是依次執(zhí)行各個action,action之間會有依賴關系,gradle會按照依賴關系順序執(zhí)行。
gradle的編譯分為三個過程:
初始化階段:創(chuàng)建Project,有多個build.gradle就會創(chuàng)建多個Project
配置階段:執(zhí)行所有的配置文件,同時創(chuàng)建出所有Project中的所有Task
執(zhí)行階段:依次執(zhí)行各個Task,也就是依次執(zhí)行所有Task中的action
2 Gradle Files
下圖是gradle中一個最基本的配置

<input type="file" accept=".jpg, .jpeg, .png, .gif" style="display: none;">
settings.gradle: 哪些模塊會被編譯
頂層的build.gradle:對所有的module生效
每個module中的build.gradle:只對自己的module生效,如果和頂層build.gradle內(nèi)容沖突,會覆蓋頂層的build.gradle
頂層的build.gradle

<input type="file" accept=".jpg, .jpeg, .png, .gif" style="display: none;">
buildscript
指定了Android 編譯所需要的依賴包
repositories中指定代碼的Maven倉庫dependencies中指定具體的依賴
allprojects
這里面的配置將會應用到所有的module,只放所有module中一些公共的東西。
每個module中的build.gradle

apply plugin
這里制定了Android中用的的gradle插件,這個插件中提供很多Android中需要的Task方法
android
是插件中提供的一個Task,這里大塊里指定了所有Android有關的基本配置
defaultConfig:默認配置,如果在AndroidManefest.xml定義了同樣的字段,這里的會覆蓋xml中的
buildTypes:編譯類型,release和debug,不同的編譯類型對應不同的編譯命令
dependencies
定義該module中的所有依賴