本節咱們從總體的角度來介紹一下Gradle。android
在Gradle中,定義了一個設置文件,用於初始化以及工程樹的配置。設置文件的默認的名字就是setting.gradle,此文件位於根工程目錄下。編程
setting.gradle 的做用就是爲了配置子工程。在Gradle中,多工程是經過工程樹表示的,至關於咱們在Android Studio下面看到的Project和Module概念同樣。根工程至關於Android Studio的Project,一個根工程能夠有多個子工程,也就是不少的Module,這樣就和Android Studio定義的Module概念對應上了。閉包
一個子工程(Module)只有在Setting文件裏配置了Gradle纔會識別,纔會在構建的時候被包含進去。函數
每一個Project都會有一個build.gradle文件,該文件是該Project構建的入口,能夠在這裏針對該Project進行配置,好比配置版本,須要哪些插件,依賴哪些庫等等。學習
既然每一個Project都會有一個build.gradle,那麼Root Project能夠獲取到全部的Child Project,因此在Root Project的Build文件裏面,咱們能夠對Child Project進行統一的配置,好比應用的插件,依賴的Maven中心庫等等。gradle
例如,咱們常常能在Root目錄下的build.gradle文件中看到以下配置:ui
...
allprojects {
repositories {
google()
jcenter()
}
}
...
這樣配置會很是方便,省去了咱們對每一個Project都去配置的狀況,特別是對於要管理不少的Project的大工程來講。google
在Gradle中,能夠有不少Project,你能夠定義建立一個Project用於生成一個jar,也能夠定義一個另一個Project用於生成一個war包,還能夠定義一個Project用於發佈上傳你的war等等。其實在Gradle裏面,你能夠將Poject理解爲在你的業務範圍內,抽象出來的一個個獨立的模塊,你能夠根據項目的狀況抽象歸類,最後這一個個的Project組成了你的整個Gradle構建。從咱們編程的角度來說,它們就是一個個獨立的模塊。好好利用他們,這樣你的代碼就可以作到低耦合,高內聚。spa
一個Project裏面由包含多個Task,也就是每一個Project是由多個Task組成的。那麼什麼是Task呢?這裏咱們能夠去一個項目的RootProject裏面的build.gradle查看,最多見的task以下:插件
task clean(type: Delete) {
delete rootProject.buildDir
}
具體的含義相信你們都能理解,這裏就不過多贅述了。
Task 是一個操做,一個原子性的操做,好比打個jar包,複製一份文件,編譯一次Java代碼,上傳一個jar到Maven中心庫等,這就是一個Task。
建立一個任務很簡單,前面不少例子咱們也都有演示:
task customTask1 {
doLast {
println 'customTask1:doLast'
}
doFirst {
println 'customTask1:doFirst'
}
}
輸出結果以下:
> Task :customTask1
customTask1:doFirst
customTask1:doLast
這裏的Task看着像一個關鍵字,其實它是Project對象的一個函數,原型爲create(String name,Closure configureClosure)。customTask1爲任務的名字,咱們能夠自定義,第二個參數是一個閉包,也就是咱們花括號裏面的代碼塊。
若是瞭解Groovy的相關知識,咱們能夠知道,若是最後一個參數是閉包的時候,能夠放到括號外面,而後方法的括號能夠省略,就生成了上面咱們的寫法,很簡潔。該閉包的做用就是用來對咱們建立的任務進行配置,例子中咱們用了任務的doFirst和doLast方法,分別在任務執行先後輸出一段文字。上面的任務咱們還能夠改成以下的方式來定義,做用是同樣的:
tasks.create("customTask1") {
doLast {
println 'customTask1:doLast'
}
doFirst {
println 'customTask1:doFirst'
}
}
除此以外,Task還有其餘方法和屬性可使用,須要咱們參考Gradle Task的API進一步學習。
Task之間是能夠有依賴關係的,這樣咱們就能夠控制哪些任務先於哪些任務執行;哪些任務執行後,其餘任務才能執行。好比,咱們運行jar任務以前,compile任務必定要執行過,也就是jar依賴compile。Android 的install任務必定要依賴package任務進行打包生成APK,才能安裝進設備裏面。
下面咱們來舉一個很是簡單的例子,說明一下:
task outHello {
println 'hello'
}
task outMain(dependsOn: outHello) {
doLast {
println 'main'
}
}
輸出以下:
renhui:android-gradle-book-code renhui$ gradle outMain
> Configure project :
hello
> Task :outMain
main
從例子中,咱們能夠看出,在建立任務的時候,經過dependsOn能夠指定其依賴的任務。
Project 和 Task 都容許用戶添加額外的自定義屬性,要添加額外的自定義屬性,可使用應用所屬的對應的ext便可實現。添加以後能夠經過ext屬性對自定義屬性讀取和設置,若是要同時添加多個自定義屬性,能夠經過ext代碼塊:
ext.age = 18
ext {
phone = 123455
address = '保定'
}
task outMain() {
println "年齡是:${age}"
println "電話是:${phone}"
println "年齡是:${address}"
}
輸出結果爲:
> Configure project :
年齡是:18
電話是:123455
年齡是:保定
相比局部變量,自定義屬性有更加普遍的做用域,你能夠跨Project,跨Task訪問這些自定義屬性。只要你能訪問這些屬性所屬的對象,你就能訪問到這些屬性。
自定義屬性不只僅侷限在Task和Project上,你能夠應用在SourceSet中,這樣等於每種SourceSet多了一個可供配置的屬性。而咱們在Android開發中,就常常會用到main SourceSet,當使用productFlavors定義多個渠道的時候,還會新增其餘不少的sourceSet。這塊的相關內容,能夠在之後的開發過程當中多留意和學習使用。