Gradle基礎

Gradle是基與Groovy的腳本配置的構筑工具,用與構筑Java及Android應用.

Gradle

Gradle是個構筑工具,本身是一個框架,提供了一系列的API,使用中則是執行.Gradle腳本文件,借助與其中的配置來進行構筑.
簡單的來說,.Gradle文件就是使用Groovy語言配置及調用Gradle的API的腳本

對與Gradle而言,一個Project是一個執行單元,一個Project對應了一個build.gradle腳本.一個App或一個Library都算是一個Project.

GradleWrapper

一個使用Gradle的項目,如果在沒有安裝Gradle或對應的版本不對的環境時,需要手動去配置環境.為了避免這個情況,在項目中自帶了Gradle的運行環境配置.
就是gradle\wrapper目錄.其配置文件為gradle-wrapper.properties.

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

項目中gradlewgradlew.bat就是不同平臺下的gradle命令行.他使用的是指定的gradle環境.
1 首先會在指定的路徑下wrapper/dists下查找是否有對應版本的環境
2 如果沒有則會根據gradle-wrapper.properties中的distributionUrl下載對應的版本.

路徑優先級如下

  • GRADLE_USER_HOME
  • GRADLE_HOME
  • 如果使用AndroidStudio會在OffLine Work指定的目錄
  • User/.gradle

如上面的distributionUrl,實際上就是下載gradle-3.3-all.zip到指定路徑的wrapper/dists/gradle-3.3-all/亂碼/目錄下.如C:\Users\花京院\.gradle\wrapper\dists\gradle-3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9
這個亂碼目錄自動生成的.下載時會生成.lck文件.下載完成時會生成.ok文件.
所以,如果不能翻墻或下載很慢時,可以停止下載,從下載速度好的鏡象網址中下載對應的版本放在該目錄下,并新建一個空txt文件,改名成.ok文件.如gradle-3.3-all.zip.ok

為了更好的使用Gradle,可以注意兩點

  • 配置GRADLE_USER_HOME路徑
  • gradle-wrapper.properties中的distributionUrl地址改成鏡象的地址.
    https\://services.gradle.org/distributions/gradle-3.3-all.zip改為http\://mirrors.flysnow.org/gradle/gradle-3.3-all.zip

一個不錯的鏡象網址

Project

Project是一個接口,是Gradle的核心.通過Project來訪問所有的Gradle的功能.Projectbuild.gradle是一一對應的關系.
一個項目必須有一個builde.gradle.它對應的Project叫做rootProjcet.這個Project對其它Project提供基礎性及公共性的配置.它會創建一個Settings的實例并根據setting.gradle來配置這個實例.

  • Project里含有一個容器TaskContainer接口.用與創建,存取及管理所有的Task.
  • Project里含有一個容器ConfigurationContainer接口,來管理對應的項目配置
  • Project里含有一個DependencyHandler接口用與管理項目的依賴
  • Project里含有一個RepositoryHandler接口用來注冊和管理依賴所需的Repository.

屬性property

Project可以聲明很多屬性,沒有類型限制.有多種來源

  1. Project自身帶的屬性
  2. 額外屬性(extra properties),每個Project都持有一個Map用來存放額外屬性.這個Map的聲明為ext.所以可用ext.屬性名來訪問或用ext.屬性名=xxx來賦值
  3. 通過插件添加到extensionsextension,可以做為同名的只讀屬性
  4. 通過插件添加convention屬性,插件可以通過Projectconvention對象添加屬性和方法
  5. Project的屬性

Project的動態方法

Project中的方法有多個來源.

  1. Project自身的方法
  2. builde.gradle中聲明的方法
  3. 通過插件提供的額外方法
  4. 把Task當成方法,通過把Task名當成方法名來調用Task中的Action或閉包.
  5. Project的方法,頂層直到rootProject
  6. 閉包形式的屬性(property).可以把屬性當成方法調用.

TASK

task在gradle里可以看成是一個執行任務.除了自定義的task,其它的task都是通過pluging引入的.像編譯,打包,安裝這些都是定義好的task.

windows調用task的方法是gradle或gradlew task名 ,在linux或mac下是./gradle或gradlew task名

task在Gradle中是個接口,其默認實現類為DefaultTask.其它的實現類都是繼承與此.

創建Task

可以通過TaskContainer對象的create方法來創建Task.但通常是使用task關鍵字來創建Task

使用task關鍵字創建task實際上是使用了Project對象的task方法來創建的.共有四個重載方法.調用此方法會創建task并保存在其中的TaskContainer里.方法如下

Task task(String name)
Task task(String name, Closure configureClosure) //Cloure就是閉包
Task task(Map<String,?> args,String name)
Task task(Map<String,?> args,String name,Closure configureClosure)
//例子
task hello
task hello {xxx} //groovy語法
task hello(type:jar)
task hello(type:jar) {xxx}   //gradle的DSL

doFirst和doLast

task執行任務是基與Action接口的.基內部維護了一個List,通過List<Action<? super Task>> getActions()方法可獲取這個容器.在執行Task時就是遍歷這個容器,調用每個Action

Task添加Action的方法就是doFirstdoLast.添加至List的頭和尾.這說明該List是LinkedList

參數有兩種,一種為Action<? extend Task>,另一種為閉包.通常使用閉包這種簡便的方式

在gradle提供的DSL中對doLast提供了一個簡化寫法

task hello <<{
  xxx
}
//等同與
task hello {
  doLast {
    xxx
  }
}

讀懂Gradle腳本

如上說的,Gradle腳本是基與Gradle的API.所以腳本中基本上都是在調用Gradle的API.
因為腳本使用的是Groovy語言,那么明白Groovy對了解腳本有很大的幫助.這里只說幾個要點

  • Groovy是基與Java的.可以看成是Java言的簡寫形式.也就是說可以把Groovy完全替換成Java代碼.
  • 在Groovy中所有的都是對象,基本數據類型對應的是其對象類,容器使用的是ListMap,容器的聲明是[],每個元素以,分隔.
  • 在groovy中Map的定義是[key:value],key必須是字符串,如果不用''""包含則會自動轉成對應的字符串,如果key想使用變量引用,則需要加上(),當方法參數時如果只有一個鍵值對時可以省略[ ]
def map=[k:`v`]
//這里key是"k",value是"v"
def key="k"
def map=[key:'value']
//這里key是"key"而不是k
def map=[(key):"value"]
//這里的key是'k'
  • Groovy中不需要聲明類型,但是所有的參數都是有類型的.其頂層是Object.聲明一個變量或方法都用def關鍵字
  • Groovy中有閉包,閉包是被{}包裹的可執行代碼.可以看成是一個Runable,不過可以傳遞參數,如果不設置參數,則有一個默認的參數,在閉包中用it表示.類型會自動推導
  • Groovy里方法調用是可以鏈式調用的.方法名+空格+參數表示一個方法調用.省略了括號,在鏈式調用中方法名+()表示調用空參的方法.如果鏈式調用為奇數,最后一個參數視為成員變量,如
    from a into b
    from(a).into(b);
    
    from a,b init() name
    from(a,b).init().name;
    
    from {} into {} name
    from({}).into({}).getName();
    
  • Groovy里頂層方法調用可以省略括號,參數間以,分隔.但參數是方法調用的話是不能省略括號的.
    from(a)//可以寫成from a
    from(a,get(b)) //不能寫成 from a,get b,必須寫成from a,get(b)
    
  • 方法參數中含有閉包的可以把閉包放到括號外,并省略括號及,
    from(a,{})
    from a {}
    

閉包

閉包是一個被{}包含的可執行代碼.在Java中是沒有閉包存在的,因為Groovy最終會轉化為Java代碼.實際上閉包會被轉化成對應的對象.原理類似與Java8的Lamda.

比如說在對容器進行遍歷時調用foreach方法.就可以傳入一個閉包對容器的元素進行操作.這個閉包是沒有傳遞參數的.在閉包中這個元素可以用it來調用.可以理解為創建了一個Runable,含有一個成員變量it.這個變量就是遍歷時對應的元素

調用Gradle的方法,傳入一個閉包.可以簡單的理解為需要傳入一個指定的繼承Runable的對象或者說是匿名內部類,它的run()方法由自己來實現.這在Gradle里叫委托.

在Gradle里需要傳入閉包的方法都是委托指定的對象.所以在閉包中可以直接調用該對象的方法.具體的閉包對應的對象及其可調用的方法就需要查看Gradle的API文檔.

解析幾個常見的腳本


apply plugin: 'com.android.library'
apply from: 'config.gradle'

實際上都是在調用Gradle的API,apply(Map map)方法,在方法調用時可以通過空格來省略方法的括號.實際可以寫成
apply([plugin:'com.android.library'])

上面的代碼也可以合起來寫
apply [plugin: 'com.android.library',from:'config.gradle']


android {
    compileSdkVersion 24
    buildToolsVersion '24.0.1'

    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName '1.0'

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
  1. 這里首先調用了android方法,參數是個閉包A.這里是創建了一個Android對象.閉包內的內容為對其的配置
  2. A中調用compileSdkVersion,buildToolsVersion,defaultConfigbuildTypes方法.前兩個方法為Android對象的方法,后兩個方法的參數為閉包B和C
  3. B中調用了四個方法,C中調用了閉包D,在D中調用了release方法,參數為閉包E
  4. E中調用了minifyEnabledproguardFiles方法
  5. proguardFiles方法的參數為proguard-rules.pro字符串及方法getDefaultProguardFile('progurad-android.txt')方法的返回值

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:support-v4:19.1.0'
}
  1. 這里調用了dependencies方法,閉包中為其配置
  2. compile為添加依賴的方法.
  3. fileTree(include: ['*.jar'], dir: 'libs')做為compile方法的參數.fileTree是個方法,參數為一個List用來表示添加的類型和一個Map用來表示文件路徑,
  4. 'com.android.support:support-v4:19.1.0'為依賴的名稱.構建時會通過RepositoryHandler在注冊的Repository里查找.

task clean(type: Delete) {
    delete rootProject.buildDir
}
  1. 聲明了一個cleantask.
  2. task的類型為Delete,所以在閉包中可以使用對應的方法delete
  3. 刪除的路徑為rootProject.buildDir變量保存的路徑
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容

  • 這篇文章講給大家帶來gradle打包系列中的高級用法-自己動手編寫gradle插件。我們平常在做安卓開發時,都會在...
    呆萌狗和求疵喵閱讀 15,998評論 22 80
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,781評論 18 139
  • 安裝Gradle 確保安裝你的電腦了Java7或以上版本 在這里下載最新的Gradle distribution ...
    小吉快跑呀閱讀 825評論 0 3
  • Android Studio作為Android應用開發的官方IDE,默認使用Gradle作為構建工具,所以對于An...
    feil0n9wan9閱讀 1,683評論 1 6
  • 今天看的文章是講“投資的剛需是避險”,也沖破了我們在腦海中的傳統觀念,“要有冒險精神”是我們從小就耳濡目染的,要做...
    lanlana閱讀 313評論 0 0