Gradle 是一款非常優(yōu)秀的構(gòu)建系統(tǒng)工具,它的 DSL 基于 Groovy 實現(xiàn),可以讓你很方便的通過代碼控制這些DSL來達到你構(gòu)建的目的,其構(gòu)建的大部分功能都是通過插件的方式來實現(xiàn),所以非常靈活方便,如果內(nèi)置插件不能滿足你的需求你可以自定義自己的插件。
配置Gradle環(huán)境
Linux下搭建 Gradle 構(gòu)建環(huán)境
Gradle 可運行在所有主流的操作系統(tǒng)上,只需要安裝一個 Java JDK 或 JRE 8或更高版本即可。
運行 java -version 將檢查 Java 環(huán)境:
$ java -version
java version "1.8.0_121"
先到 Gradle 官網(wǎng) https://gradle.org/ 下載 Gradle。這里區(qū)分 binary-only 版或者 complete 版(with docs and sources)
將發(fā)行版 zip 文件解壓縮到你選擇的目錄中,例如:
$ mkdir /opt/gradle
$ unzip -d /opt/gradle gradle-6.3-bin.zip
配置你的 PATH / 環(huán)境變量包含解壓縮發(fā)行版的 bin 目錄,例如:
GRADLE_HOME=/opt/gradle/gradle-6.3
PATH=$PATH:${GRADLE_HOME}/bin
export GRADLE_HOME PATH
要運行 Gradle,必須把 GRADLE_HOME/bin 目錄添加到你的環(huán)境變量 PATH 的路徑里才可以。在 Linux 下,如果你只想為你當前登陸的用戶配置可以運行Gradle,那么可以編輯~/.bashrc文件添加以下內(nèi)容:然后在終端輸入 source ~/.bashrc 回車執(zhí)行讓剛剛的配置生效。
如果你想讓所有用戶都可以使用gradle,那么你就需要在/etc/profile中添加以上內(nèi)容,在這里添加后,對所有用戶都生效,這種方式的添加,必須要重啟電腦才可以
輸入gradle -v命令查看即可,如果能正確顯示gradle版本號、Groovy版本號、JVM等相關(guān)信息,那么說明你已經(jīng)配置成功了.
Window下搭建Gradle構(gòu)建環(huán)境
環(huán)境變量配置項,添加 GRADLE_HOME 環(huán)境變量,然后把GRADLE_HOME\bin添加到PATH系統(tǒng)變量里保存即可。完成后打開CMD運行g(shù)radle -v來進行驗證,整體和Linux差不多,這里就不在一一詳述。
Mac下搭建Gradle構(gòu)建環(huán)境
同 Linux 類似。在終端中輸入:open -e ~/.bash_profile,打開.bash_profile文件
GRADLE_HOME=/Users/ale/opt/gradle/gradle-7.2
export GRADLE_HOME
export PATH=$PATH:$GRADLE_HOME/bin
Reload your terminal to see this change reflected or run the following command:
$ source ~/.bash_profile
Verify your installation
$ gradle -v
Gradle 版 Hello World
新建好一個目錄,然后在該目錄下創(chuàng)建一個名為 build.gradle 的文件,打開編輯該文件,輸入以下內(nèi)容:
task hello{
doLast{
println'Hello world!'
}
}
cd 到對應(yīng)目錄,使用 gradle -q hello 命令來執(zhí)行構(gòu)建腳本:
gradle -q hello
看到gradle -q hello這段運行命令,意思是要執(zhí)行build.gradle腳本中定義的名為hello的Task,-q參數(shù)用于控制gradle輸出的日志級別,哪些日志可以輸出被看到。
看到println 'Hello World!'了嗎,它會輸出Hello World!,通過名字相信大家已經(jīng)猜出來了,它其實就是System.out.println("Hello World!")的簡寫方式。Gradle 可以識別它,是因為 Groovy 已經(jīng)把println() 這個方法添加到 java.lang.Object,而在Groovy中,方法的調(diào)用可以省略簽名中的括號,以一個空格分開即可,所以就有了上面的寫法。還有一點要說明的就是在Groovy中,單引號和雙引號所包含的內(nèi)容都是字符串,不像 Java 中,單引號是字符,雙引號才是字符串。
Gradle Wrapper
Wrapper,顧名思義,其實就是對Gradle的一層包裝,便于在團隊開發(fā)過程中統(tǒng)一Gradle構(gòu)建的版本,這樣大家都可以使用統(tǒng)一的Gradle版本進行構(gòu)建,避免因為Gradle版本不統(tǒng)一帶來的不必要的問題。
Gradle提供了內(nèi)置的 wrapper task 幫助我們自動生成 wrapper 所需的目錄文件,在一個項目的根目錄,輸入gradle wrapper即可生成。

gradlew 和 gradlew.bat 分別是 Linux 和 Window 下的可執(zhí)行腳本,他們的用法和gradle原生命令是一樣的,gradle 怎么用,他們也就可以怎么用。gradle-wrapper.jar是具體業(yè)務(wù)邏輯實現(xiàn)的jar包,gradlew 最終還是使用 java 執(zhí)行的這個jar包來執(zhí)行相關(guān) gradle 操作。gradle-wrapper.properties 是配置文件,用于配置使用哪個版本的 gradle 等。
這些生成的wrapper文件可以作為你項目工程的一部分提交到代碼版本控制系統(tǒng)里(git),這樣其他開發(fā)人員就會使用這里配置好的統(tǒng)一的gradle進行構(gòu)建開發(fā)。
自定義Wrapper Task
前面我們講了,gradle-wrapper.properties 是由 wrapper task 生成的,那么我們是否可以自定義配置該 Wrapper task 來達到我們配置 gradle-wrapper.properties的目的呢,答案是肯定的。我們可以在 build.gradle 構(gòu)建文件中錄入如下腳本:

這樣我們再執(zhí)行g(shù)radle wrapper的時候,就自定義了其他和默認生成 2.4 版本的wrapper
Gradle日志
日志級別

# 輸出 quiet 級別及其以上的日志
gradle -q tasks
# 輸出 info 級別及其以上的日志
gradle -i tasks
輸出錯誤堆棧信息
在使用 Gradle 構(gòu)建的時候,難免會有這樣或者那樣的問題導(dǎo)致你的構(gòu)建失敗,這時就需要你根據(jù)日志分析解決問題。除了以上的日志信息之外,Gradle還提供了堆棧信息的打印,用過 Java 語言的相信大家都會很熟悉錯誤堆棧信息,他能幫助我們很好的定位和分析問題。
默認情況下,堆棧信息的輸出是關(guān)閉的,需要我們通過命令行的堆棧信息開關(guān)打開它,這樣在我們構(gòu)建失敗的時候,Gradle才會輸出錯誤堆棧信息,便于我們定位分析和解決問題。

在編寫 Gradle 腳本的過程中,我們有時候需要輸出一些日志,來驗證我們的邏輯或者一些變量的值是否正確,這時候我們就可以使用Gradle提供的日志功能。
通常情況下我們一般都是使用print系列方法,把日志信息輸出到標準的控制臺輸出流(它被Gradle定向為QUIET級別日志)。
除了 print 系列方法之外,你也可以使用內(nèi)置的 logger 更靈活的控制輸出不同級別的日志信息。

logger 說是內(nèi)置,其實是調(diào)用的 Project 的 getLogger() 方法獲取的 Logger 對象的實例。
Gradle命令行
記得使用幫助
命令行下的工具都有命令,剛開始我們不會用或者不知道有什么命令或者參數(shù),這沒事,但是我們可以通過幫助來了解,基本上所有的命令行工具都有幫助,查看幫助的方式也很簡單,基本上都是在命令后跟-h或者--help,有的時候會有-?,以Gradle Wrapper為例:

查看所有可執(zhí)行的Tasks
有時候我們不知道如何構(gòu)建一個功能,不知道執(zhí)行哪個Task,這時候就需要查看哪些Task可執(zhí)行,都具備什么功能,通過運行./gradlew tasks命令
gradle help 任務(wù)
除了上面我們說的每個命令行都有幫助外,Gradle還內(nèi)置了一個help task,這個help可以讓我們了解每一個task的使用幫助,
用法是 ./gradlew help --task <task name>,
比如 ./gradlew help --task tasks,就可以顯示tasks任務(wù)的幫助信息:
強制刷新依賴
我們一個功能不可避免的會依賴很多第三方庫,像 Maven 這類工具都是有緩存的,因為不可能每次編譯的時候都要重新下載第三方庫,緩存就是這個目的,先使用緩存,沒有再下載。默認情況下Maven這類工具會控制緩存的更新,但是也有例外,比如 Version 一樣,但是里面的代碼變了;還有就是聯(lián)調(diào)測試時使用的snapshot 版本。以上兩種情況我們在實際項目中都遇到過,最后就是通過強制刷新解決的。
強制刷新很簡單,只要在命令行運行的時候加上--refresh-dependencies 參數(shù)就可以,這是IDE很難做到的(需要你了解配置),所以命令行的優(yōu)勢就體現(xiàn)出來了,非常簡單。
gradle --refresh-dependencies assemble
多任務(wù)調(diào)用
有時候我們需要同事運行多個任務(wù),比如在執(zhí)行Jar之前先進行 clean,那么我們就需要先執(zhí)行 clean 對 class文件清理,然后再執(zhí)行jar生成一個jar包。通過命令行執(zhí)行多個任務(wù)非常簡單,只需要按順序以空格分開即可,比如 gradle clean jar,這樣就可以了,有更多的任務(wù)時,可以繼續(xù)添加。
通過任務(wù)名字縮寫執(zhí)行執(zhí)行
有的時候我們的任務(wù)名字很長,Gradle提供了基于駝峰命名法的縮寫調(diào)用,比如 connectCheck,我們執(zhí)行的時候可以使用 gradlew connectCheck, 也可以使用 gradlew cc這樣的方式來執(zhí)行。
參考
本文純屬自學(xué)歷程 + 一些記錄,絕大部分內(nèi)容來自原書 Android Gradle權(quán)威指南。覺得對你有用,請支持原書。