由於gradle很多函數都是閉包,需要查api文檔才能確定參數,這時候需要官方文檔了:
http://docs.groovy-lang.org/latest/html/groovy-jdk/index-all.html
http://www.groovy-lang.org/api.html
個人總結
1、gradle版本
在Android studio的terminal中輸入:
發現gradle和gradlew的版本不一致,而gradle與gradle-wrapper中配置的版本一致:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
所以在Android studio中,使用gradlew。
在項目根目錄下的build.gradle文件中配置有:
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
}
這裏也有一個對gradle版本的配置,他其實是Android官方對gradle 的一個插件開發,便於開發者在Android環境下更容易的使用gradle構建項目。
用一段通俗易懂但是不是非常專業的話描述一下三者的概念、區別和聯繫。
- Gradle是個構建系統,能夠簡化你的編譯、打包、測試過程。熟悉Java的同學,可以把Gradle類比成Maven。
- Gradle Wrapper的作用是簡化Gradle本身的安裝、部署。不同版本的項目可能需要不同版本的Gradle,手工部署的話比較麻煩,而且可能產生衝突,所以需要Gradle Wrapper幫你搞定這些事情。Gradle Wrapper是Gradle項目的一部分。
- Android Plugin for Gradle是一堆適合Android開發的Gradle插件的集合,主要由Google的Android團隊開發,Gradle不是Android的專屬構建系統,但是有了Android Plugin for Gradle的話,你會發現使用Gradle構建Android項目尤其的簡單。
2、各文件作用
- build.gradle
每一個 build.gradle 腳本文件被 Gradle 加載解析後,都會對應生成一個 Project 對象,在腳本中的配置方法其實都對應着 Project 中的API,Project 類的主要結構(節選部分常用):
- gradle.properties
在與 build.gradle 文件同級目錄下,定義一個名爲 gradle.properties 文件,裏面定義的鍵值對,可以在 Project 中直接訪問。
//gradle.properties裏定義屬性值
company="hangzhouheima"
username="hjy"
在 build.gradle 文件裏可以這樣直接訪問:
println "company = ${company}"
println "username = ${username}"
- settings.gradle
多項目構建
前面我們介紹的例子,都是單獨執行某一個 build.gradle 文件。但是我們在 Android 應用開發中,一個 Project 可以包含若干個 module ,這種就叫做多項目構建。在 Android Studio 項目中,根目錄都有一個名叫 settings.gradle 的文件,然後每個 module 的根目錄中又有一個 build.gradle 文件,Gradle 就是通過 settings.gradle 來進行多項目構建的。
3、屬性
- Gradle屬性
在與 build.gradle 文件同級目錄下,定義一個名爲 gradle.properties 文件,裏面定義的鍵值對,可以在 Project 中直接訪問。
//gradle.properties裏定義屬性值
company="hangzhouheima"
username="hjy"
在 build.gradle 文件裏可以這樣直接訪問:
println "company = ${company}"
println "username = ${username}"
- 擴展屬性
還可以通過 ext 命名空間來定義屬性,我們稱之爲擴展屬性。
ext {
username = "hjy"
age = 30
}
println username
println ext.age
println project.username
println project.ext.age
必須注意,默認的擴展屬性,只能定義在 ext 命名空間下面。對擴展屬性的訪問方式,以上幾種都支持。
4、Extension
//先定義一個普通的java類,包含2個屬性
class Foo {
int age
String username
String toString() {
return "name = ${username}, age = ${age}"
}
}
//創建一個名爲 foo 的Extension
getExtensions().create("foo", Foo)
//配置Extension
foo {
age = 30
username = "hjy"
}
task testExt << {
//能直接通過 project 獲取到自定義的 Extension
println project.foo
}
上面這個例子中,foo 就是我們自定義的 Extension 了,它裏面能配置的屬性與類 Foo 中的字段是一致的,在 build.gradle 中可以直接通過 project.foo 來訪問。每個 Extension 實際上與某個類是相關聯的,在 build.gradle 中通過 DSL 來定義,Gradle 會識別解析並生成一個對象實例,通過該類可以獲取我們所配置的信息。
之前有講過 Project 有個擴展屬性是通過 ext 命名空間配置的,可以看到 ext 與這裏是類似的,不同的是 ext 可以配置任何鍵值對的屬性值,而這裏只能識別我們定義的 Java 類裏的屬性值。
參考:
Gradle從入門到實戰 - Groovy基礎
Android Gradle學習(一):Gradle基礎入門
Android組件化開發實踐(一):爲什麼要進行組件化開發?
Gradle W3Cschool