前言
這三個(gè)知識(shí)點(diǎn)不難,但經(jīng)常用到,如果不看官方文檔,有時(shí)候并不知道怎么使用,出現(xiàn)問題也不知道原因,所以有必要做一個(gè)總結(jié)。由于每個(gè)知識(shí)點(diǎn)都不多,又有關(guān)聯(lián),所以放在同一節(jié)。
Gradle Wrapper
Gradle Wrapper(以下簡(jiǎn)寫為“Wrapper”)用于管理當(dāng)前項(xiàng)目的Gradle版本,Gradle官方強(qiáng)烈推薦使用Wrapper構(gòu)建項(xiàng)目。多人協(xié)作時(shí),必須規(guī)定項(xiàng)目的Gradle版本,并以此版本的Gradle作為項(xiàng)目的構(gòu)建工具,由于每個(gè)人在本地安裝的Gradle版本可能并不一致(也沒有必要一致),因此有必要在項(xiàng)目中統(tǒng)一管理Gradle版本。
Wrapper的文件結(jié)構(gòu)如下(項(xiàng)目根目錄中):
├── build.gradle
├── settings.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
包括一個(gè)gradle文件和兩個(gè)可執(zhí)行的腳本文件gradlew(macOS等平臺(tái)用)和gradlew.bat(Windows平臺(tái)用)。
-
gradle-wrapper.jar
。用于下載所需版本的Gradle。 -
gradle-wrapper.properties
。配置Gradle的版本號(hào)、本地存儲(chǔ)地址等。各屬性說明請(qǐng)見官方文檔。 -
gradlew
,gradlew.bat
。Wrapper的執(zhí)行腳本,用于替代gradle
命令來構(gòu)建項(xiàng)目。
注意:
gradle-wrapper.properties
中有一個(gè)distributionUrl
屬性,用于定義Gradle版本地下載URL,如distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-all.zip
,版本號(hào)后面有個(gè)“-all”,有時(shí)你也可能看到“-bin”,是什么意思呢?"-all"表示會(huì)下載此版本Gralde的所有的資源,包括二進(jìn)制運(yùn)行時(shí)文件、示例代碼和相關(guān)文檔。“-bin”表示只下載二進(jìn)制運(yùn)行時(shí)文件。
Wrapper 構(gòu)建項(xiàng)目時(shí),其工作流程如下:
- 檢查規(guī)定的Gradle版本,如果沒有則去服務(wù)器下載。
- 下載的Gradle版本存儲(chǔ)在Gradle的用戶目錄中。如macOS中默認(rèn)存儲(chǔ)所有的Gradle版本到
/Users/yourname/.gradle/wrapper/dists/
中。 - 使用解壓后的Gradle版本來構(gòu)建項(xiàng)目。
添加Wrapper
使用命令行添加Wrapper有兩種方式:
- 使用
gradle init
創(chuàng)建新項(xiàng)目,則會(huì)初始化一個(gè)帶有Wrapper的Gradle項(xiàng)目。 - 使用
gradle wrapper
在舊的項(xiàng)目中添加Wrapper。
wrapper
是Gradle的內(nèi)建任務(wù)
一般的IDE創(chuàng)建項(xiàng)目時(shí)都會(huì)自動(dòng)生產(chǎn)Wrapper文件,如Android Studio。
使用Wrapper執(zhí)行任務(wù)
用Wrapper腳本替換掉gradle
來執(zhí)行任務(wù)即可。以macOS平臺(tái)為例,在項(xiàng)目根目錄下執(zhí)行./gradlew [task name]
即可,如列出當(dāng)前項(xiàng)目的所有任務(wù),項(xiàng)目根目錄下執(zhí)行:
$ ./gradlew tasks
更新Wrapper
有兩種方式更新Wrapper
- 命令行方法。
.gradlew wrapper --gradle-version [要更新的版本號(hào)]
。 - 修改
gradle/wrapper/gradle-wrapper.properties
中的distributionUrl
屬性。
Gradle命令行
與Gradle交互有兩種方式,一是命令行界面,二是IDE的圖形界面,如Android Studio。IDE方式各有不同且未必包括所有的命令行指令,但命令行方式卻是不變的,因此需要學(xué)會(huì)基本的命令行指令,以不變應(yīng)萬變。
注意:在項(xiàng)目中使用命令行方式時(shí),推薦使用
./gradlew
orgradlew.bat
來代替gradle
。示例中為了方便,統(tǒng)一使用gradle
命令行指令可以自定義,參見declaring_and_using_command_line_options
指令形式
gradle [taskName...] [--option-name...]
說明
任務(wù)名(taskName)有多個(gè)時(shí),使用空格分開,如
gradle task1 task2
-
在多項(xiàng)目工程中,執(zhí)行某個(gè)項(xiàng)目的任務(wù)時(shí),可以用“:”將項(xiàng)目名添加到任務(wù)名之前,如
$ gradle projectName:taskName $ gradle :projectName:taskName
-
可選項(xiàng)(option-name)如果接收參數(shù),建議使用
=
拼接,如$ gradle task1 --console=plain
-
可選項(xiàng)規(guī)定一個(gè)行為時(shí),可使用
--no-
作為其全稱(long-form)前綴,來指定它的對(duì)立行為。如--build-cache --no-build-cache
-
可選項(xiàng)的全稱名稱常有簡(jiǎn)寫形式 ,如
--help -h
-
gradle build
。生成所有的輸出,并執(zhí)行所有的檢查。 -
gradle run
。生成應(yīng)用程序并執(zhí)行某些腳本或二進(jìn)制文件 -
gradle check
。執(zhí)行所有檢測(cè)類任務(wù)如tests、linting等 -
gradle clean
。刪除build文件目錄。 -
gradle projects
。查看項(xiàng)目結(jié)構(gòu)。 -
gradle tasks
。查看任務(wù)列表。查看某個(gè)任務(wù)詳細(xì)信息,可用gradle help --task someTask
-
gradle dependencies
。查看依賴列表。
部分常見命令行選項(xiàng)說明如下:
調(diào)試類
-
-?
,-h
,--help
。查看幫助信息。 -
-v
,--version
。查看版本信息。 -
-s
,--stacktrace
。執(zhí)行任務(wù)時(shí),打印棧信息。如gradle build --s
其他選項(xiàng)說明見官方文檔Debugging options
日志類
-
-q
,--quiet
。只打印errors類信息。 -
-i
,--info
。打印詳細(xì)的信息。
其他選項(xiàng)說明見官方文檔Logging options,更多關(guān)于日志類描述請(qǐng)見Logging。
性能類
用于優(yōu)化構(gòu)建的性能
-
--configure-on-demand
,--no-configure-on-demand
。是否開啟按需配置模式。 -
--build-cache
,--no-build-cache
。是否使用緩存。
其他選項(xiàng)說明見官方文檔Performance Options,更多關(guān)于性能優(yōu)化方面的描述請(qǐng)見 improving performance of Gradle builds here.
環(huán)境配置類
用于配置構(gòu)建時(shí)的環(huán)境
-
-c
,--settings-file
。如果不用默認(rèn)的settings.gradle
時(shí),可指定Setting文件。 -
-b
,--build-file
。指定構(gòu)建文件。 -
-Dorg.gradle.jvmargs
。設(shè)置JVM參數(shù)。
其他選項(xiàng)說明見官方文檔Environment options,更多關(guān)于環(huán)境配置方面的描述請(qǐng)見build environment
環(huán)境配置
配置構(gòu)建環(huán)境,主要配置Gradle構(gòu)建參數(shù)和對(duì)應(yīng)的JVM參數(shù),如代理策略等。其目的是為了多人協(xié)作時(shí),保持在一致的環(huán)境下進(jìn)行項(xiàng)目開發(fā)。
配置環(huán)境有幾種途徑,優(yōu)先級(jí)從高往低,列出如下:
- 命令行。
-
GRADLE_USER_HOME
目錄中的gradle.properties
文件。 - 項(xiàng)目根目錄中的
gradle.properties
文件。 - 環(huán)境變量。運(yùn)行Gradle環(huán)境的變量,如JAVA_HOME等。
配置環(huán)境其實(shí)是設(shè)置各種屬性參數(shù),以上四種方式對(duì)于某些屬性都可以配置。其中命令行和gradle.properties
文件方式支持所有屬性的配置。屬性有不同的級(jí)別,按照優(yōu)先級(jí)從高到底列出如下:
- 系統(tǒng)屬性(System properties)。
- Gradle屬性。
系統(tǒng)屬性
用于設(shè)置Gradle的JVM環(huán)境。
- 命令行方式。通過給屬性添加
-D
前綴來設(shè)置。如gradle -Dgradle.user.home=foo
-
gradle.properties
文件方式。根目錄中,為屬性添加systemProp.
前綴,如systemProp.gradle.wrapperUser=myuser
幾個(gè)系統(tǒng)屬性如下:
-
gradle.wrapperUser=(myuser)
。設(shè)置Wrapper下載Gradle版本的代理服務(wù)器的用戶名。 -
gradle.wrapperPassword=(mypassword)
。設(shè)置Wrapper下載Gradle版本的代理服務(wù)器的密碼。 -
gradle.user.home=(path to directory)
。設(shè)置Gradle用戶目錄地址。
Gradle屬性
Gradle屬性都有對(duì)應(yīng)的命令行方式,gradle.properties
文件屬性和對(duì)應(yīng)的命令行如下:
gradle.properties 文件屬性 |
命令行指令 |
---|---|
org.gradle.caching=(true,false) |
--build-cache , --no-build-cache
|
org.gradle.caching.debug=(true,false) |
? |
org.gradle.configureondemand=(true,false) |
--configure-on-demand , --no-configure-on-demand
|
org.gradle.console=(auto,plain,rich,verbose) |
--console=(auto,plain,rich,verbose) |
org.gradle.daemon=(true,false) |
--daemon , --no-daemon
|
org.gradle.daemon.idletimeout=(# of idle millis) |
-Dorg.gradle.daemon.idletimeout=(number of milliseconds) |
org.gradle.debug=(true,false) |
-Dorg.gradle.debug=(true,false) |
org.gradle.java.home=(path to JDK home) |
-Dorg.gradle.java.home |
org.gradle.jvmargs=(JVM arguments) |
-Dorg.gradle.jvmargs |
org.gradle.logging.level=(quiet,warn,lifecycle,info,debug) |
-Dorg.gradle.logging.level=(quiet,warn,lifecycle,info,debug) 或者 -q 、-w 、-i 、-d
|
org.gradle.parallel=(true,false) |
--parallel , --no-parallel
|
org.gradle.warning.mode=(all,none,summary) |
-Dorg.gradle.warning.mode=(all,none,summary) 或者--warning-mode=(all,none,summary)
|
org.gradle.workers.max=(max # of worker processes) |
--max-workers |
詳細(xì)說明請(qǐng)見Gradle properties
另外官網(wǎng)中有項(xiàng)目屬性和通過項(xiàng)目屬性配置任務(wù)的說明,這里不做描述,請(qǐng)見官網(wǎng)Project properties
示例-設(shè)置JVM參數(shù)
對(duì)于每個(gè)Java虛擬機(jī)進(jìn)程,Gradle默認(rèn)配置堆空間最大為1024MB(-Xmx1024m
)。-Xmx1024m根據(jù)項(xiàng)目大小,可以修改這一參數(shù)。如果使用了Gradle Daemon(org.gradle.daemon=true
,默認(rèn)開啟),則配置參數(shù)如下:
org.gradle.jvmargs=-Xmx2g -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
Java虛擬機(jī)參數(shù)設(shè)置參考Java HotSpot VM Options:Java 8及以上,Java 7參考。上面的參數(shù)說明如下:
-
-Xmx[size]
。設(shè)置虛擬機(jī)最大內(nèi)存空間。必須是1024的倍數(shù),且不能小于2MB,單位為k/K、m/M、g/G,默認(rèn)值隨系統(tǒng)配置而變。與XX:MaxHeapSize
等價(jià)。示例80MB:-Xmx83886080 -Xmx81920k -Xmx80m
-
-XX:MaxPermSize=[size]
。設(shè)置持久代最大空間,持久代用于存儲(chǔ)常量等,如果報(bào)java.lang.OutOfMemoryError: PermGen space
的異常,則需要增加這一空間。Java虛擬機(jī)內(nèi)存劃分請(qǐng)見Oracle官方文檔Generations
-XX:-HeapDumpOnOutOfMemoryError
。當(dāng)拋出java.lang.OutOfMemoryError
異常時(shí),將堆內(nèi)容存儲(chǔ)到文件中,用于調(diào)試。-
-Dfile.encoding=UTF-8
。虛擬機(jī)編碼格式。在參考文檔中并沒有找到``-Dfile.encoding`設(shè)置
示例-設(shè)置代理
國(guó)內(nèi)下載依賴和Google資源時(shí)有時(shí)候速度很慢,可以通過設(shè)置HTTP和HTTPS代理服務(wù)解決。在gradle.properties
中設(shè)置如下:
# http代理
systemProp.http.proxyHost=www.somehost.org
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=userid
systemProp.http.proxyPassword=password
systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost
# https代理
systemProp.https.proxyHost=www.somehost.org
systemProp.https.proxyPort=8080
systemProp.https.proxyUser=userid
systemProp.https.proxyPassword=password
systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost
如果沒有user和password,可以不用寫。
其他的代理參數(shù)可以參考Java文檔Networking Properties