Gradle學習

一 作用

編譯,打包,依賴管理。

二 語言: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的編譯,兩個重要的概念是ProjectTask

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中一個最基本的配置

image

<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

image

<input type="file" accept=".jpg, .jpeg, .png, .gif" style="display: none;">

buildscript

指定了Android 編譯所需要的依賴包

repositories中指定代碼的Maven倉庫dependencies中指定具體的依賴

allprojects

這里面的配置將會應用到所有的module,只放所有module中一些公共的東西。

每個module中的build.gradle

image

apply plugin

這里制定了Android中用的的gradle插件,這個插件中提供很多Android中需要的Task方法

android

是插件中提供的一個Task,這里大塊里指定了所有Android有關的基本配置

defaultConfig:默認配置,如果在AndroidManefest.xml定義了同樣的字段,這里的會覆蓋xml中的

buildTypes:編譯類型,release和debug,不同的編譯類型對應不同的編譯命令

dependencies

定義該module中的所有依賴

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 用過android studio的對gradle應該都不陌生了,gradle文件的基本配置大同小異,略做了解使用應...
    微涼一季閱讀 27,575評論 18 185
  • Gradle 是一款構建系統(tǒng)工具,它的 DSL 基于 Groovy 實現(xiàn)。Gradle 構建的大部分功能都是通過插...
    任教主來也閱讀 3,255評論 3 6
  • 本篇主要是個人學習gradle的筆記總結 一.開始之前 1. 為什么學習Gradle 采用DSL(Doma...
    zyq_neuq閱讀 1,619評論 2 12
  • Gradle 學習筆記 以下內(nèi)容,理論部分大部分是gradle和groovy的官方文檔的解釋,實例部分是自己的嘗試...
    唐一川閱讀 3,822評論 2 5
  • Android默認使用Gradle[https://www.gradle.org/]作為構建工具。 Why Gra...
    goodl閱讀 1,087評論 0 1

友情鏈接更多精彩內(nèi)容