Gradle面向Java應(yīng)用為主,是一個基于Apache Ant和Apache Maven概念的項目自動化構(gòu)建開源工具。它使用一種基于Groovy的特定領(lǐng)域語言(DSL)來聲明項目設(shè)置,目前也增加了基于Kotlin語言的kotlin-based DSL,當(dāng)前其支持的語言C++、Java、Groovy、Kotlin、Scala和Swift,拋棄了基于XML的各種繁瑣配置。
Gradle軟件簡介
Gradle是一個基于JVM的構(gòu)建工具,是一款通用靈活的構(gòu)建工具,支持maven, Ivy倉庫,支持傳遞性依賴管理,而不需要遠(yuǎn)程倉庫或者是pom.xml和ivy.xml配置文件,基于Groovy,build腳本使用Groovy編寫。
Gradle軟件特色
1、自由,開源。
2、易于移值。
3、基于聲明和基于約定的構(gòu)建。
4、可以結(jié)構(gòu)化構(gòu)建,易于維護(hù)和理解。
5、多種方式的依賴管理。
6、多項目構(gòu)建的支持。
7、腳本采用Groovy編寫,易于維護(hù)。
8、是第一個構(gòu)建集成工具。集成了Ant, maven的功能。
9、依賴型的編程語言。
10、有良好的擴(kuò)展性。有增量構(gòu)建功能來克服性能瓶頸問題。
11、通過Gradle Wrapper允許你在沒有安裝Gradle的機(jī)器上進(jìn)行Gradle構(gòu)建。
12、有高級的API允許你在構(gòu)建執(zhí)行的整個過程當(dāng)中,對它的核心進(jìn)行監(jiān)視,或者是配置它的行為。
安裝教程
1、安裝JDK,并配置JAVA_HOME環(huán)境變量。因為Gradle是用Groovy編寫的,而Groovy基于JAVA。另外,Java版本要不小于1.5。
2、下載本站提供的gradle最新版本,官方下載地址是:http://services.gradle.org/distributions ,用戶在這里下載你要的版本。
3、解壓。如果你下載的是gradle-xx-all.zip的完整包,它會有以下內(nèi)容:
二進(jìn)制文件
用戶手冊(包括PDF和HTML兩種版本)
DSL參考指南
API手冊(包括Javadoc和Groovydoc)
樣例
源代碼,僅供參考使用。
4、配置環(huán)境變量。配置GRADLE_HOME到你的gradle根目錄當(dāng)中,然后把%GRADLE_HOME%/bin(linux或mac的是$GRADLE_HOME/bin)加到PATH的環(huán)境變量。
linux用戶可以在~/.bashrc文件中配置。
配置完成之后,運(yùn)行g(shù)radle -v,檢查一下是否安裝無誤。如果安裝正確,它會打印出Gradle的版本信息,包括它的構(gòu)建信息,Groovy, Ant, Ivy, 當(dāng)前JVM和當(dāng)前系統(tǒng)的版本信息。
另外,可以通過GRADLE_OPTS或JAVA_OPTS來配置Gradle運(yùn)行時的JVM參數(shù)。不過,JAVA_OPTS設(shè)置的參數(shù)也會影響到其他的JAVA應(yīng)用程序。
環(huán)境變量配置
首先明確gradle跟maven一樣,也有一個配置文件,maven里面是叫pom.xml,而在gradle中是叫build.gradle。Android Studio中的android項目通常至少包含兩個build.gradle文件,一個是project范圍的,另一個是module范圍的,由于一個project可以有多個module,所以每個module下都會對應(yīng)一個build.gradle。這么說有點(diǎn)抽象,看下面這個圖:
這是一個android工程的project視圖,上面那個是module下的build.gradle文件。下面那個是project下的build.gradle文件。這兩個文件是有區(qū)別的,project下的build.gradle是基于整個project的配置,而module下的build.gradle是每個模塊自己的配置。下面看下這兩個build.gradle里面的內(nèi)容:
project#build.gradle:
注:大家可能很奇怪,為什么倉庫repositories需要聲明兩次,這其實是由于它們作用不同,buildscript中的倉庫是gradle腳本自身需要的資源,而allprojects下的倉庫是項目所有模塊需要的資源。所以大家千萬不要配錯了。
module#build.gradle:
defaultConfig中是一些基本配置,它會同時應(yīng)用到debug/release版本上,下面列舉了所有可配項及對應(yīng)的值:
buildTypes結(jié)點(diǎn)很重要,這里可以配置構(gòu)建的版本的一些參數(shù),默認(rèn)有兩個構(gòu)建版本release/debug,當(dāng)然你可以自定義一個構(gòu)建版本,比如叫foo,然后通過gradlew assembleFoo就可以生成對應(yīng)的apk了。
buildTypes里還有很多可配置項,下面列舉了所有可配項以及debug/release版本的默認(rèn)值:
現(xiàn)在大家對build.gradle已經(jīng)初步了解了,我們再看下其他一些與gradle相關(guān)的文件:
1.gradle.properties:
從名字上就知道它是一個配置文件,沒錯,這里面可以定義一些常量供build.gradle使用,比如可以配置簽名相關(guān)信息如keystore位置,密碼,keyalias等。
2.settings.gradle:
這個文件是用來配置多模塊的,比如你的項目有兩個模塊module-a,module-b,那么你就需要在這個文件中進(jìn)行配置,格式如下:
3.gradle文件夾:
這里面有兩個文件,gradle-wrapper.jar和gradle-wrapper.properties,它們就是gradle wrapper。gradle項目都會有,你可以通過命令gradle init來創(chuàng)建它們(前提是本地安裝了gradle并且配置到了環(huán)境變量中)。
4.gradlew和gradlew.bat:
這分別是linux下的shell腳本和windows下的批處理文件,它們的作用是根據(jù)gradle-wrapper.properties文件中的distributionUrl下載對應(yīng)的gradle版本。這樣就可以保證在不同的環(huán)境下構(gòu)建時都是使用的統(tǒng)一版本的gradle,即使該環(huán)境沒有安裝gradle也可以,因為gradle wrapper會自動下載對應(yīng)的gradle版本。
gradlew的用法跟gradle一模一樣,比如執(zhí)行構(gòu)建gradle build命令,你可以用gradlew build。gradlew即gradle wrapper的縮寫。
2.gradle倉庫:
gradle有三種倉庫,maven倉庫,ivy倉庫以及flat本地倉庫。聲明方式如下:
3.gradle任務(wù):
gradle中有一個核心概念叫任務(wù),跟maven中的插件目標(biāo)類似。
gradle的android插件提供了四個頂級任務(wù)
執(zhí)行任務(wù)可以通過gradle/gradlew+任務(wù)名稱的方式執(zhí),執(zhí)行一個頂級任務(wù)會同時執(zhí)行與其依賴的任務(wù),比如你執(zhí)行
它通常會執(zhí)行:
這時會在你項目的build/outputs/apk或者build/outputs/aar目錄生成輸出文件
注:linux下執(zhí)行構(gòu)建任務(wù)需要首先更改gradlew腳本的權(quán)限,然后才能執(zhí)行該腳本:
可以通過:
列出所有可用的任務(wù)。在Android Studio中可以打開右側(cè)gradle視圖查看所有任務(wù)。
更新日志
1、支持增量構(gòu)建,現(xiàn)在針對 Java 匯編、復(fù)制、歸檔有更優(yōu)秀的 up-to-date 檢查。還可以讓 Gradle 將任何任務(wù)輸入視為具有新的 @Classpath 注釋的類路徑。
2、Gradle 的本機(jī)構(gòu)建支持的用戶在此版本中獲得了一個重要的工具,是很多人比較熟悉的用于經(jīng)典多項目構(gòu)建的 buildDependents。現(xiàn)在可以將新的 assembleDependents 和 buildDependents 用于本機(jī)構(gòu)建。這對于你要確定自己的更改是否對依賴于它們的任何內(nèi)容產(chǎn)生不利影響非常有用。
3、如果你使用IDE,并且在構(gòu)建(特別是動態(tài)構(gòu)建)中有很多依賴項,那么可能會需要很長的導(dǎo)入時間。此版本中已解決了基礎(chǔ)問題,從而大大提高了導(dǎo)入時間。企業(yè)構(gòu)建的一個例子顯示了有100倍的改進(jìn)!
4、Kotlin 構(gòu)建腳本在 Windows 平臺上編譯腳本的錯誤已經(jīng)修復(fù),在Windows上嘗試此功能更容易。
5、用于聲明任務(wù)的快捷語法(通過<<)現(xiàn)在已被棄用。