Android Studio之Gradle和Gradle外掛的區別
什麼是Gradle?什麼是Gradle外掛?
Gradle 對應:gradle-wrapper.properties中的distributionUrl=https/://services.gradle.org/distributions/gradle-2.10-all.zip
Gradle外掛 對應:build.gradle中依賴的classpath 'com.android.tools.build:gradle:2.1.2'
Gradle:
- 一個構建系統,構建專案的工具,用來編譯Android app,能夠簡化你的編譯、打包、測試過程。
- 維基百科是這樣解釋的:Gradle是一個基於Apache Ant和Apache Maven概念的專案自動化建構工具。它使用一種基於Groovy的特定領域語言來宣告專案設定,而不是傳統的XML。當前其支援的語言限於Java、Groovy和Scala,計劃未來將支援更多的語言。
構建工具就是對你的專案進行編譯、執行、簽名、打包、依賴管理等一系列功能的合集,那如何理解構建工具?我們以前用 Eclipse開發Android程式,而Eclipse最初是用來做Java 開發的,Googl為了能在 Eclipse 上進行Android 開發,開發了ADT 外掛(Android Developer Tools),正是因為有了 ADT ,我們才可以在 Eclipse 上進行編譯、執行、簽名、打包等一系列流程。而這背後的工作都是 ADT 的功勞,ADT 就是我們的構建工具。
一般來說,構建工具除了以上提到的編譯、執行、簽名、打包等,還具備依賴 管理的功能,什麼是依賴管理呢?我們以前在 Eclipse 上開發 Android 引用第三方庫,一般都是先下載 jar 檔案,然後把 jar 檔案新增到 libs 目錄。但假設第三方庫有更新,需要下載最新的 Jar 檔案替換掉原來的,非常繁瑣,可以說這種方式只有依賴,而沒有管理。
Gradle 引用第三方庫方式是這樣的: compile 'com.android.support:support-v4:24.0.1'
我們直接可以看到源地址,升級的話直接改下版本號就可以了,這就是所謂的依賴管理。傳統的構建工具有 Make、Ant、Maven、Ivy等,而 Gradle 是新一代的自動化構建工具,它是一個獨立的專案,跟 AS、Android 無關,官方網站:https://gradle.org/
類似 Ant、Maven這類構建工具都是基於 xml 來進行描述的,很臃腫,而 Gradle 採用的是一種叫做 Groovy 的語言,語法跟 Java 語法很像,但是是一種動態語言,而且在 Java 基礎上做了不少改進,用起來更加簡潔、靈活,而且 Gradle 完全相容 Maven、Ivy,這點基本上宣佈了 Maven、Ivy 可以被拋棄了,Gradle 的推出主要以 Java 應用為主,當然目前還支援 Android、C、C++。Gradle 跟 Android Studio 其實沒有關係,但是 Gradle 官方還是很看重 Android 開發的,Google 在推出 AS 的時候選中了 Gradle 作為構建工具,為了支援 Gradle 能在 AS 上使用,Google 開發了一個 AS 的外掛叫 Android Gradle Plugin ,所以我們能在 AS 上使用 Gradle 完全是因為這個外掛的原因。在專案的根目錄有個 build.gradle 檔案,裡面有這麼一句程式碼:
classpath 'com.android.tools.build:gradle:2.1.2'
這個就是依賴 gradle 外掛的程式碼,後面的版本號代表的是 android gradle plugin 的版本,而不是 Gradle 的版本,這個是 Google 定的,跟 Gradle 官方沒關係。關於 android gradle plugin 的更多資訊可以到這裡檢視,這裡列舉了 android gradle plugin 每個版本的具體變化與具體功能:http://tools.android.com/tech-docs/new-build-system
Gradle外掛:
- 我們在AS中用到的Gradle其實應該被叫做Android Plugin for Gradle,它本質就是一個AS的外掛,它一邊呼叫 Gradle本身的程式碼和批處理工具來構建專案,一邊呼叫Android SDK的編譯、打包功能,從而讓我們能夠順暢地在AS上進行開發。
- Gradle外掛跟 Android SDK BuildTool有關聯,因為它還承接著AndroidStudio裡的編譯相關的功能,這也是我們要在專案的 local.properties 檔案裡寫明Android SDK路徑、在build.gradle 裡註明 buildToolsVersion 的原因。
- Gradle外掛是獨立於Android Studio執行的,所以它的更新也是與Android Studio分開的。Gradle外掛會有版本號,每個版本號又對應有一個或一些 Gradle發行版本(一般是限定一個最低版本),也就是我們常見的類似gradle-3.1-all.zip這種東西;
如果這兩個版本對應不上了,那你的工程構建的時候就會報錯。
對應關係如下(官網連結:https://developer.android.google.cn/studio/releases/gradle-plugin.html#updating-plugin):
外掛版本 | Gradle版本 |
---|---|
1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
1.5.0 | 2.2.1 - 2.13 |
2.0.0 - 2.1.2 | 2.10 - 2.13 |
2.1.3 - 2.2.3 | 2.14.1+ |
2.3.0+ | 3.3+ |
3.0.0+ | 4.1+ |
3.1.0+ | 4.4+ |
Android Studio 3.0 之後自動將外掛版本升級到3.0.0,所以我們也需要對應地把Gradle升級到4.1才行
- Gradle Wrapper:意為 Gradle 的包裝,它的作用是簡化Gradle本身的安裝、部署。不同版本的專案可能需要不同版本的Gradle,手工部署的話比較麻煩,而且可能產生衝突,所以需要Gradle Wrapper幫你搞定這些事情。Gradle Wrapper是Gradle專案的一部分。
假設我們本地有多個專案,一個是比較老的專案,還用著 Gradle 1.0 的版本,一個是比較新的專案用了 Gradle 2.0 的版本,但是你兩個專案肯定都想要同時執行的,如果你只裝了 Gradle 1.0 的話那肯定不行,所以為了解決這個問題,Google 推出了 Gradle Wrapper 的概念,它在你每個專案都配置了一個指定版本的 Gradle ,你可以理解為每個 Android 專案本地都有一個小型的 Gradle ,通過這個每個專案你可以支援用不同的 Gradle 版本來構建專案。
,接下來就是教大家用命令列測試下,請大家在終端或者 AS 帶的終端上切換到所在專案的目錄,然後輸入 ./gradlew -v (win使用者直接輸入 gradlew -v) ,即可以檢視當前專案所用的 gradle 的版本,gradlew 即為 gradle wrapper 的縮寫,如果你是第一次執行命令列,那麼會出現一個下載的提示,緊接著會列印一個個的點,這個過程很漫長,依賴你的網速,時間幾分鐘到幾十分鐘不等。
有人有疑問,我 AS 上明明已經可以正常執行該專案的,說明 Gradle 已經下載過了,為什麼命令列還要再下載一次?我也一直有這個疑問,理論上是不該再下載的,但是事實他就是要重新下載一次,我猜測可能是bug吧。
如果下載完成輸入 ./gradlew -v 出現如下結果,證明你的專案是ok的,否則就是你的專案配置有問題了。
參考:
https://www.jianshu.com/p/6f3c34b36037
https://mp.weixin.qq.com/s?__biz=MzA4NTQwNDcyMA==&mid=2650661971&idx=1&sn=3fb69537bbc5fbb14d152ba6381c3b83