《Android Gradle權威指南》之Gradle入門

本文摘自人民郵電出版社異步社區《Android Gradle權威指南》一文html


異步社區試讀地址: www.epubit.com.cn/book/detail…

第1章 Gradle入門

Gradle是一款很是優秀的構建系統工具,它的DSL基於Groovy實現,可讓你很方便地經過代碼控制這些DSL來達到你構建的目的。Gradle構建的大部分功能都是經過插件的方式來實現,因此很是靈活方便,若是內置插件不能知足你的需求你能夠自定義本身的插件。java


本章咱們就介紹Gradle的入門知識,在介紹以前,咱們先假定讀者已經具有如下知識。android


(1)瞭解而且會使用Java,精通最好。shell


(2)會獨立搭建Java開發環境。編程


(3)最好會使用Linux操做系統,好比Ubuntu。ubuntu


爲何會有這樣的假定呢?由於這本書是介紹Android Gradle開發構建的書,因此不會講Java的基本知識。但願讀者會用Linux操做系統的緣由,是由於本書的全部腳本、代碼、IDE等都是基於Ubuntu完成的,固然好比涉及Gradle安裝還會介紹一下Windows的安裝步驟,可是不會太多涉及Windows的東西,因此仍是但願讀者在閱讀本書前已經掌握了這些知識。api


1.1 配置Gradle環境


安裝以前確保已經安裝配置好Java環境,要求JDK 6以上,而且在環境變量裏配置了JAVA_HOME,查看Java版本能夠在終端輸入以下命令:緩存


java –version複製代碼

我這裏使用的是open jdk 1.8.0_91:bash


➜  ~ java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)複製代碼

1.1.1 Linux下搭建Gradle構建環境


這裏以Ubuntu 16.04發行版爲例介紹如何在Linux下搭建Gradle構建環境,其餘諸如CentOS大同小異,參考一下就能夠了。服務器


咱們這裏以Gradle 2.14.1版本爲準進行介紹。先到Gradle官網gradle.org/ 下載好Gradle SDK,直接下載地址爲downloads.gradle.org/distributio… SDK全部相關的內容,包括源代碼、文檔、示例等。若是由於網絡問題下載不了,可使用鏡像下載,鏡像首頁爲mirrors.flysnow.org/,該Gradle版本下…


① docs:API、DSL、指南等文檔。


② getting-started.html:入門連接。


③ init.d:gradle的初始化腳本目錄。


④ lib:相關庫。


⑤ LICENSE。


⑥ media:一些icon資源。


⑦ NOTICE。


⑧ samples:示例。


⑨ src:源文件。


要運行Gradle,必須把GRADLE_HOME/bin目錄添加到你的環境變量PATH的路徑裏才能夠。在Linux下,若是你只想爲當前登陸的用戶配置能夠運行Gradle,那麼能夠編輯~/.bashrc文件添加如下內容:


#這裏是做者的Gradle目錄,要換成你本身的
GRADLE_HOME=/home/flysnow/frame/gradle

PATH=${PATH}:${GRADLE_HOME}/bin
Export GRADLE_HOME PATH複製代碼

上面GRADLE_HOME是個人Gradle解壓後的目錄,這裏要換成你本身的。以上添加後保存,而後在終端輸入source ~/.bashrc,回車執行讓剛剛的配置生效。


若是你想讓全部用戶均可以使用Gradle,那麼你就須要在/etc/profile中添加以上內容,在這裏添加後,對全部用戶都生效,這種方式的添加,必需要重啓計算機才能夠。


好了,如今咱們已經配置好了,要驗證咱們的配置是否正確,是否能夠運行Gradle,咱們只須要打開終端,輸入gradle -v命令查看便可。若是能正確顯示Gradle版本號、Groovy版本號、JVM等相關信息,那麼說明你已經配置成功了。這裏以驗證個人配置爲例:


➜  ~ gradle -v
------------------------------------------------------------
Gradle 2.14.1
------------------------------------------------------------

Build time: 2016-10-20 03:46:36 UTC
Build number: none
Revision: b463d7980c40d44c4657dc80025275b84a29e31f

Groovy: 2.4.4
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM: 1.8.0_91 (Oracle Corporation 25.91-b14)
OS: Linux 4.4.0-38-generic amd64複製代碼

1.1.2 Windows下搭建Gradle構建環境


Windows下搭建Gradle環境和Linux很是類似,只不過方式不一樣。咱們經過右擊個人電腦,打開屬性面板,而後找到環境變量配置項,添加GRADLE_HOME環境變量,而後把GRADLE_HOME\bin添加到PATH系統變量裏保存便可。完成後打開CMD,運行gradle -v來進行驗證,總體效果和Linux差很少,這裏就再也不一一詳述。


1.2 Gradle版Hello World


環境搭建好了,那麼咱們就開始寫一個Hello World版的Gradle腳本。


新建好一個目錄,我這裏是android-gradle-book-code,而後在該目錄下建立一個名爲build.gradle的文件,打開編輯該文件,輸入如下內容:


task hello{
doLast{
println'Hello World!'
}
}複製代碼

打開終端,而後移動到android-gradle-book-code下,使用gradle -q hello命令來執行構建腳本:


$ gradle -q hello
Hello World!複製代碼

好了,如願以償地打印出來咱們想要的結果,下面咱們一步步分析結果產生的步驟和緣由。build.gradle是Gradle默認的構建腳本文件,執行Gradle命令的時候,會默認加載當前目錄下的build.gradle腳本文件。熟悉Ant的讀者感受和build.xml差很少,固然你也能夠經過 -b參數指定想要加載執行的文件。


這個構建腳本定義一個任務(Task),任務名字叫hello,而且給任務hello添加了一個動做,官方名字是Action,閱讀Gradle源代碼你會處處見到它,其實它就是一段Groovy語言實現的閉包。在這裏我以爲叫業務代碼邏輯或者回調實現更貼切一些,由於doLast就意味着在Task執行完畢以後要回調doLast的這部分閉包的代碼實現。


熟悉Ant的讀者,會以爲任務(Task)和Ant裏的Target(目標)很是類似。其實沒錯,如今能夠認爲它們基本上相同。


再看gradle -q hello這段運行命令,意思是要執行build.gradle腳本中定義的名爲hello的Task,-q參數用於控制gradle輸出的日誌級別,以及哪些日誌能夠輸出被看到。


看到println 'Hello World!'了嗎,它會輸出Hello World!,經過名字相信你們已經猜出來了,它其實就是System.out.println("Hello World!")的簡寫方式。Gradle能夠識別它,是由於Groovy已經把println()這個方法添加到java.lang.Object,而在Groovy中,方法的調用能夠省略簽名中的括號,以一個空格分開便可,因此就有了上面的寫法。還有一點要說明的就是,在Groovy中,單引號和雙引號所包含的內容都是字符串;不像Java中,單引號是字符,雙引號纔是字符串。


1.3 Gradle Wrapper


Wrapper,顧名思義,其實就是對Gradle的一層包裝,便於在團隊開發過程當中統一Gradle構建的版本,這樣你們均可以使用統一的Gradle版本進行構建,避免由於Gradle版本不統一帶來的沒必要要的問題。


在這裏特別介紹的目的是由於,咱們在項目開發過程當中,用的都是Wrapper這種方式,而不是咱們在1.1節裏介紹的本身下載ZIP壓縮包,配置Gradle的環境的方式。Wrapper在Windows下是一個批處理腳本,在Linux下是一個shell腳本。當你使用Wrapper啓動Gradle的時候,Wrapper會檢查Gradle有沒有被下載關聯,若是沒有將會從配置的地址(通常是Gradle官方庫)進行下載並運行構建。這對咱們每一個開發人員是很是方便的,由於你不用去專門配置環境了,只要執行Wrapper命令,它會幫你搞定一切。這種方式也方便咱們在服務器上作持續集成(CI),由於咱們不用在服務器上配置Gradle環境。


1.3.1 生成Wrapper


Gradle提供了內置的Wrapper task幫助咱們自動生成Wrapper所需的目錄文件,在一個項目的根目錄中輸入gradle wrapper便可生成:


$ gradle wrapper
:wrapper

BUILD SUCCESSFUL

Total time: 2.804 secs

This build could be faster, please consider using the Gradle Daemon: gradle.org/docs/2.14.1…複製代碼

生成的文件以下:


├──gradle
│ └──wrapper
│ ├──gradle-wrapper.jar
│ └──gradle-wrapper.properties
├──gradlew
└──gradlew.bat複製代碼

gradlew和gradlew.bat分別是Linux和Windows下的可執行腳本,它們的用法和Gradle原生命令是同樣的,Gradle怎麼用,它們也就能夠怎麼用。gradle-wrapper.jar是具體業務邏輯實現的jar包,gradlew最終仍是使用Java執行的這個jar包來執行相關Gradle操做。gradle-wrapper.properties是配置文件,用於配置使用哪一個版本的Gradle等,稍後會詳細講解。


這些生成的Wrapper文件能夠做爲你項目工程的一部分提交到代碼版本控制系統裏(Git),這樣其餘開發人員就會使用這裏配置好的、統一的Gradle進行構建開發。


1.3.2 Wrapper配置


當咱們在終端執行gradle wrapper生成相關文件的時候,能夠爲其指定一些參數,來控制Wrapper的生成,好比依賴的版本等,如表1-1。


表1-1 Wrapper配置參數



















參數名

說明

--gradle-version

用於指定使用的Gradle版本

--gradle-distribution-url

用於指定下載Gradle發行版的url地址


使用方法爲gradle wrapper --gradle-version 2.4,這樣就意味着咱們配置Wrapper使用2.4版本的Gradle,它會影響gradle-wrapper.properties中的distributionUrl的值,該值的規則是http\://services.gradle.org/distributions/gradle-${gradleVersion}-bin.zip。


若是咱們在調用gradle wrapper的時候不添加任何參數,那麼就會使用你當前Gradle的版本做爲生成的Wrapper的gradle version。例如,你當前安裝的Gradle是2.8版本的,那麼生成的Wrapper也是2.8版本的。


1.3.3 gradle-wrapper.properties


該配置文件是gradle wrapper的相關配置文件,咱們上面執行該任務的任何配置都會被寫進該文件中。如今咱們來看看該文件的配置字段,如表1-2。


表1-2 gradle-wrapper.properties的配置字段































字段名

說明

distributionBase

下載的Gradle壓縮包解壓後存儲的主目錄

distributionPath

相對於distributionBase的解壓後的Gradle壓縮包的路徑

zipStoreBase

同distributionBase,只不過是存放zip壓縮包的

zipStorePath

同distributionPath,只不過是存放zip壓縮包的

distributionUrl

Gradle發行版壓縮包的下載地址


咱們比較關注的就是distributionUrl這個字段,這個決定你的gradle wrapper依賴哪一個Gradle版本。通常生成的都是這樣的https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip,我一般都會把bin改成all,這樣在開發過程當中,就能夠看到Gradle的源代碼了。


基於Gradle 2.14.1默認生成的gradle-wrapper.properties以下:


#Wed Sep 16 23:14:52 CST 2016
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-bin.zip複製代碼

distributionUrl是下載Gradle的路徑,若是運行./gradlew的時候計算機一直被卡着不動,多是由於官方的Gradle地址被封閉了,建議把該地址換成別的鏡像地址。


1.3.4 自定義Wrapper Task


前面咱們講了,gradle-wrapper.properties是由Wrapper Task生成的,那麼咱們是否能夠自定義配置該Wrapper task來達到咱們配置gradle-wrapper.properties的目的呢?答案是確定的。在build.gradle構建文件中錄入以下腳本:


task wrapper(type: Wrapper) {
gradleVersion = '2.4'
}複製代碼

這樣咱們再執行gradle wrapper的時候,就會默認生成2.4版本的wrapper了,而不用使用--gradle-version 2.4進行指定了。一樣,你也能夠配置其餘參數:


task wrapper(type: Wrapper) {
gradleVersion = '2.4'
archiveBase = 'GRADLE_USER_HOME'
archivePath = 'wrapper/dists'
distributionBase = 'GRADLE_USER_HOME'
distributionPath = 'wrapper/dists'
distributionUrl = 'http\://services.gradle.org/distributions/gradle-2.4-all.zip'
}複製代碼

以上是我本身配置的一些值,也能夠修改爲你本身的。


1.4 Gradle日誌


在這裏單獨介紹Gradle日誌是爲了便於咱們在遇到問題的時候,可以根據日誌信息分析和解決問題。Gradle的日誌和Java、Android的差很少,也分一些級別,用於分類顯示日誌信息,這樣咱們只需根據不一樣的狀況顯示不一樣類別的信息,不至於被大量的日誌搞得暈頭轉向。


1.4.1 日誌級別


上面提到Gradle的日誌級別和咱們使用的大部分語言的差很少。除了這些通用的以外,Gradle又增長了QUIET和LIFECYCLE兩個級別,用於標記重要以及進度級別的日誌信息,如表1-3。


表1-3 日誌級別



































級別

用於

ERROR

錯誤消息

QUIET

重要消息

WARNING

警告消息

LIFECYCLE

進度消息

INFO

信息消息

DEBUG

調試信息


表1-3明確列出了6種日誌級別以及它們的做用,如今咱們就看一下怎樣使用它們。要使用它們,顯示咱們想要顯示級別的日誌,就要經過命令行選項中的日誌開關來控制。


#輸出QUIET級別及其之上的日誌信息
$ gradle -q tasks
#輸出INFO級別及其之上的日誌信息
$ gradle -i tasks複製代碼

如下列出全部經過命令行開關選項能夠控制的級別,在命令行裏只需加上這些選項便可控制使用,如表1-4。


表1-4 日誌開關選項



























開關選項

輸出的日誌級別

無選項

LIFECYCLE及其更高級別

-q或者 --quiet

QUIET及其更高級別

-i或者 --info

INFO及其更高級別

-d或者 --debug

DEBUG及其更高級別,這通常會輸出全部日誌


1.4.2 輸出錯誤堆棧信息


在使用Gradle構建的時候,不免會有這樣或者那樣的問題致使你的構建失敗,這時就須要你根據日誌分析解決問題。除了以上的日誌信息以外,Gradle還提供了堆棧信息的打印,相信你們用過Java語言的都會很熟悉錯誤堆棧信息,它能幫助咱們很好地定位和分析問題。


默認狀況下,堆棧信息的輸出是關閉的,須要咱們經過命令行的堆棧信息開關打開它,這樣在咱們構建失敗的時候,Gradle纔會輸出錯誤堆棧信息,便於咱們定位分析和解決問題,如表1-5。


表1-5 錯誤堆棧開關選項























命令行選項

用於

無選項

沒有堆棧信息輸出

-s或者 --stacktrace

輸出關鍵性的堆棧信息

-S或者--full-stacktrace

輸出所有堆棧信息


通常推薦使用-s而不是-S,由於-S輸出的堆棧太多太長,很是很差看;而-s比較精簡,能夠定位解決咱們大部分的問題。


1.4.3 本身使用日誌信息調試


在編寫Gradle腳本的過程當中,咱們有時候須要輸出一些日誌,來驗證咱們的邏輯或者一些變量的值是否正確,這時候咱們就可使用Gradle提供的日誌功能。


一般狀況下咱們通常都是使用print系列方法,把日誌信息輸出到標準的控制檯輸出流(它被Gradle定向爲QUIET級別日誌):


println'輸出一段日誌信息'複製代碼

除了print系列方法以外,你也可使用內置的logger更靈活地控制輸出不一樣級別的日誌信息:


logger.quiet('quiet日誌信息.')
logger.error('error日誌信息.')
logger.warn('warn日誌信息.')
logger.lifecycle('lifecycle日誌信息.')
logger.info('info日誌信息.')
logger.debug('debug日誌信息.')複製代碼

這裏實際上是調用的Project的getLogger()方法獲取的Logger對象的實例。


1.5 Gradle命令行


Gradle命令行單獨用一節講解的目的是,想提倡你們儘量使用命令行,而不要太依賴於各類IDE。雖然IDE很方便,可是,若是你換了一家公司,不使用這個IDE,若是讓你作自動構建沒有IDE可用,所有都是基於命令行的。這個就像咱們第一次學習編程語言時老師沒說讓你用IDE,而是直接用記事本或者其餘文本工具寫程序,目的就是讓咱們不要太依賴第三方工具,這樣才能以不變應萬變。那麼IDE該不應用,有沒有必要,這個是確定的,必定要用,由於它能提升工做效率。可是用以前你要知道若是不借助IDE作一件事,好比執行Gradle一個Task,在Android Studio下很簡單,雙擊那個Task就能夠執行了,可是若是沒有Android Studio,你也要知道如何在命令行下運行它。咱們要知其因此然,否則你的開發水平很難提升。


1.5.1 記得使用幫助


命令行下的工具都有命令。若剛開始咱們不會用或者不知道有什麼命令或者參數,咱們能夠經過幫助來了解。基本上全部的命令行工具都有幫助,查看幫助的方式也很簡單,基本上都是在命令後跟-h或者--help,有的時候會有-?,以Gradle Wrapper爲例:


./gradlew -?
./gradlew -h
./gradlew –help複製代碼

1.5.2 查看全部可執行的Tasks


有時候咱們不知道如何構建一個功能,不知道執行哪一個Task,這時候就須要查看哪些Task可執行,都具有什麼功能。經過運行./gradlew tasks命令,輸出以下:


:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Help tasks
----------
components - Displays the components produced by root project 'flysnow'. [incubating]
dependencies - Displays all dependencies declared in root project 'flysnow'.
dependencyInsight - Displays the insight into a specific dependency in root project'flysnow'.
help - Displays a help message.
model - Displays the configuration model of root project 'flysnow'. [incubating]
projects - Displays the sub-projects of root project 'flysnow'.
properties - Displays the properties of root project 'flysnow'.
tasks - Displays the tasks runnable from root project 'flysnow'.

To see all tasks and more detail, run gradle tasks --all

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL

Total time: 2.321 secs

This build could be faster, please consider using the Gradle Daemon: gradle.org/docs/2.14.1…複製代碼

從輸出中咱們能夠看到,Gradle會以分組的方式列出Task列表,好比構建類的有init、wrapper,幫助類的有help、tasks等。


1.5.3 Gradle Help任務


除了上面咱們說的每一個命令行都有幫助外,Gradle還內置了一個help task,這個help可讓咱們瞭解每個Task的使用幫助,用法是 ./gradlew help –task。好比 ./gradlew help --task tasks,就能夠顯示tasks任務的幫助信息:


:help
Detailed task information for tasks

Path
:tasks

Type
TaskReportTask (org.gradle.api.tasks.diagnostics.TaskReportTask)

Options
--all Show additional tasks and detail.

Description
Displays the tasks runnable from root project 'android-gradle-book-code' (some
of the displayed tasks may belong to subprojects).

Group
help

BUILD SUCCESSFUL複製代碼

從幫助信息中咱們能夠看到這個Task有什麼用,是什麼類型,屬於哪一個分組,有哪些可使用的參數。好比這裏就有--all參數,能夠查看不少額外的詳細信息。


1.5.4 強制刷新依賴


咱們一個功能不可避免地會依賴不少第三方庫。像Maven這類工具都是有緩存的,由於不可能每次編譯的時候都要從新下載第三方庫,緩存就是這個目的,先使用緩存,沒有再下載第三方庫。默認狀況下Maven這類工具會控制緩存的更新,可是也有例外,好比Version,裏面的代碼變了,還有就是聯調測試時使用的snapshot版本。以上兩種狀況咱們在實際項目中都遇到過,最後就是經過強制刷新解決的。強制刷新很簡單,只要在命令行運行的時候加上--refresh-dependencies參數就能夠,這是IDE很難作到的(須要你瞭解配置)。因此,命令行的優點就體現出來了,很是簡單:


./gradlew --refresh-dependencies assemble複製代碼

其餘還有不少有用的命令、參數以及Tasks,就不一一介紹了,你們能夠經過上面講的兩種幫助方法來了解。


1.5.5 多任務調用


有時候咱們須要同時運行多個任務,好比在執行jar以前先進行clean,那麼咱們就須要先執行clean對class文件清理,而後再執行jar生成一個jar包。經過命令行執行多個任務很是簡單,只須要按順序以空格分開便可,好比./gradlew clean jar,這樣就能夠了。有更多的任務時,能夠繼續添加。


1.5.6 經過任務名字縮寫執行


有的時候咱們的任務名字很長,若是在執行的時候所有寫一遍也挺費時間,爲此Gradle提供了基於駝峯命名法的縮寫調用,好比connectCheck,咱們執行的時候可使用./gradlew connectCheck,也可使用./gradlew cc這樣的方式來執行。

相關文章
相關標籤/搜索