1. Wrapper
看完直接說結(jié)論:
結(jié)論一:Wrapper與Gralde間是解耦的
Wrapper可以理解為一個(gè)Gradle的代理:代理Gradle的安裝和調(diào)用。
沒有Wrapper你照樣可以在系統(tǒng)上安裝Gradle,但你需要自己去維護(hù)和管理Gradle升級(jí)等操作。當(dāng)然這不是重點(diǎn),重點(diǎn)是你需要維護(hù)整套Gradle的環(huán)境:比如配置環(huán)境變量等,裝上并不代表就能用了。還有麻煩的地方,當(dāng)你把Gradle加入到自己的項(xiàng)目工程中時(shí),你同樣要?jiǎng)谏褓M(fèi)力的配置一翻。
使用Wrapper后,你可以安心的托管了。比如以后升級(jí),你無需自己去下載,而是直接修改下配置文件,交給Wrapper去打理就好了。Wrapper會(huì)維護(hù)自己的一套機(jī)制,你之前在安裝的所有版本的Gradle,Wrapper都會(huì)完全無視,即使你要的版本已經(jīng)被你之前手動(dòng)安裝過了,一旦使用Wrapper后,還是會(huì)下載那個(gè)版本到它指定的目錄中。
之前說過,Wrapper是Gralde的代理,執(zhí)行Gradle的task時(shí):
對于每一個(gè)/gradle <task>指令,都可以使用/gradlew <task>指令去替代。
所以說了這么多,Wrapper到底是什么?
Wrapper其實(shí)就是一定文件的集合。包含:一個(gè)核心JAR,1個(gè)配置文件和2個(gè)腳本文件。
配置文件(gradle/wrapper/gradle-wrapper.properties):配置Gradle的下載、解壓的路徑,下載的地址等信息。
JAR(gradle/wrapper/gradle-wrapper.jar):Wrapper自身的代碼,Wrapper能做什么,發(fā)揮什么樣的作用完全來自這個(gè)JAR。
腳本文件(gradlew.bat和gradlew,分別對應(yīng)兩種操作系統(tǒng)):用于執(zhí)行Gradle的task(注意是調(diào)用Gradle的,不是Wrapper的)。操作方式:/gradlew <task>。
如果:刪除Windows下某個(gè)項(xiàng)目中的gradlew.bat文件,然后執(zhí)行gradlew指令時(shí),會(huì)提示:gradlew 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序或批處理文件。 恢復(fù)后就正常了。
什么是Gradle distributions?
這個(gè)詞在開頭的三篇文章中經(jīng)常出現(xiàn),它表示的很簡單:就是Gradle自己的版本/們(注意,還是與Wrapper無關(guān))。
如果使用Wrapper,Gralde distribution就會(huì)被下載到gradle/wrapper/gradle-wrapper.properties所配置的路徑下,下載完畢后會(huì)自動(dòng)解壓。

wrapper.properties里的distributionUrl的值就是具體distribution的下載地址。wrapper/dists目錄指的就是distribution的目錄。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
distribution分bin和 all兩種版本,all等于bin+src
all包含:
bin
docs
init.d
lib
media
samples
src
bin包含:
bin
init.d
lib
media
lib下面是組成Gralde的各種JAR。
bin下面就2個(gè)文件gradle和gradle.bat兩個(gè)。是不是如Wrapper的gradlew和gradlew.bat似曾相識(shí)?
沒錯(cuò),這兩個(gè)就是分別在兩種系統(tǒng)下執(zhí)行Gradle task的腳本文件~。
結(jié)論二:Gradle / Wrapper與Android Studio間是解耦的
經(jīng)過上面的講解,基本上可以推出這個(gè)結(jié)論了。
AS在創(chuàng)建Android工程時(shí)會(huì)自動(dòng)創(chuàng)建Wrapper,并且指定Android Plugin for Gradle插件進(jìn)行支持。
這樣的話,我們連 將Wrapper配置到項(xiàng)目工程中的 這個(gè)動(dòng)作都可以省略了。很顯然AS這么做是為了給廣大開發(fā)者節(jié)省時(shí)間。
當(dāng)然,你也可以不這么做,正如官方文檔所言:
Gradle和Android Plugin for Gradle插件獨(dú)立于Android Studio運(yùn)行。這意味著,您可以在Android Studio內(nèi)、使用計(jì)算機(jī)上的命令行工具或在未安裝Android Studio的計(jì)算機(jī)(例如持續(xù)性集成服務(wù)器)上構(gòu)建Android應(yīng)用。如果您不使用Android Studio,可以學(xué)習(xí)如何從命令行構(gòu)建和運(yùn)行您的應(yīng)用(資料3)。無論您是從命令行、在遠(yuǎn)程計(jì)算機(jī)上還是使用Android Studio構(gòu)建項(xiàng)目,構(gòu)建的輸出都相同。
最后,還有一個(gè)很小的或者無關(guān)緊要的點(diǎn),在AS根目錄下會(huì)有一個(gè).gradle的文件夾,當(dāng)執(zhí)行任何gradlew,/gradlew <task>指令時(shí)就會(huì)生成該文件夾(如果沒有)。據(jù)說是Gradle(不是Wrapper)的編譯系統(tǒng),版本由Wrapper指定。
.gradle文件夾是否似曾相識(shí)? 沒錯(cuò),wrapper.properties里的GRADLE_USER_HOME也就是Gralde distributions的path路徑,默認(rèn)就是以.gradle文件夾結(jié)尾的(見資料2)。
但這跟上面所說的工程根目錄下的.gradle文件夾沒有一毛錢關(guān)系。
2. 什么是DSL
DSL(Domain Specified Language)領(lǐng)域?qū)S谜Z言:DSL說明。
3. Groovy
Groovy是一種基于JVM(Java虛擬機(jī))的敏捷開發(fā)語言,它結(jié)合了Python、Ruby和Smalltalk的許多強(qiáng)大的特性,Groovy 代碼能夠與 Java 代碼很好地結(jié)合,也能用于擴(kuò)展現(xiàn)有代碼。由于其運(yùn)行在 JVM 上的特性,Groovy 可以使用其他 Java 語言編寫的庫。
Groovy 是用于Java虛擬機(jī)的一種敏捷的動(dòng)態(tài)語言,它是一種成熟的面向?qū)ο?/strong>編程語言,既可以用于面向?qū)ο缶幊蹋?strong>又可以用作純粹的腳本語言。使用該種語言不必編寫過多的代碼,同時(shí)又具有閉包和動(dòng)態(tài)語言中的其他特性。
Groovy是JVM的一個(gè)替代語言(替代是指可以用 Groovy 在Java平臺(tái)上進(jìn)行 Java 編程),使用方式基本與使用 Java代碼的方式相同,該語言特別適合與Spring的動(dòng)態(tài)語言支持一起使用,設(shè)計(jì)時(shí)充分考慮了Java集成,這使 Groovy 與 Java 代碼的互操作很容易。(注意:不是指Groovy替代Java,而是指Groovy和Java很好的結(jié)合編程。