Gradle 構建:從入門到實戰

ColletteChu 7年前發布 | 43K 次閱讀 Gradle 項目構建

前言

本文章主要針對Gradle講解,從入門到實戰(Android Studio),讓你快速上手Gradle。

一、什么是構建工具?

一個可編程的工具,能夠以可執行和有序的任務來表達滿足需要的自動化過程。

以Java為例,要得到一個簡單可運行的Jar文件,需要下面幾步:

  1. 編譯源代碼

  2. 運行測試(前提是你有測試)

  3. 拷貝Class文件到目標目錄

  4. 打包Class文件為Jar文件

這是一個完整的可自動化的過程,在沒有構建工具之前,是由誰來做?IDE。一個強大的IDE,以上的步驟都只需要按幾個按鈕,這讓開發人員的生活變得很美好,完全集中在寫出優秀的代碼。

二、Java世界的構建工具

在Java的世界里,目前在被使用的常用構建工具有三個:Ant,Maven,Gradle。

Ant的核心是由Java編寫,采用XML作為構建腳本,這樣就允許你在任何環境下,運行構建。Ant基于任務鏈思想,任務之間定義依賴,形成先后順序。缺點是使用XML定義構建腳本,導致腳本臃腫,Ant自身沒有為項目構建提供指導,導致每個build腳本都不一樣,開發人員對于每個項目都需要去熟悉腳本內容,沒有提供在Ant生態環境內的依賴管理工具。

Maven團隊意識到Ant的缺陷,采用標準的項目布局,和統一的生命周期,采用約定由于配置的思想,減少構建腳本需要的編寫內容,活躍的社區,可以方便找到合適的插件,強大的依賴管理工具。缺點是采用默認的結構和生命周期,太過限制,編寫插件擴展麻煩,XML作為構建腳本。

如果有一個構建工具可以折中,同時擁有Ant和Maven的優點,是不是很爽?告訴你有,那就是Gradle。

三、Gradle 構建

Gradle是一個基于Apache Ant和Apache Maven概念的項目自動化建構工具。它使用一種基于Groovy的特定領域語言來聲明項目設置,而不是傳統的XML。

1、Gradle-Wrapper

Gradle可以在沒有安裝Gradle的情況下使用,這時候就需要Gradle Wrapper了。Gradle Wrapper其實就是一個腳本文件,它會在沒有安裝Gradle的情況下為我們下載Gradle,之后我們就可以使用gradlew命令,像使用gradle一樣來使用Gradle了。

創建項目完畢之后,會發現我們的項目中有如下一些文件:

gradlew (Unix Shell 腳本)

gradlew.bat (Windows批處理文件)

gradle/wrapper/gradle-wrapper.jar (Wrapper JAR文件)

gradle/wrapper/gradle-wrapper.properties (Wrapper屬性文件)

我們就可以像使用gradle命令一樣使用gradlew了。Gradle Wrapper會自動為我們下載合適的Gradle版本。默認情況下,下載位置是$USER_HOME/.gradle/wrapper/dists,如果設置了GRADLE_USER_HOME環境變量,那么就會下載到GRADLE_USER_HOME/wrapper/dists下。

上面是gradle-wrapper.properties文件中的內容,可以直接編輯文件修改Wrapper的版本,或者使用

gradle wrapper --gradle-version 3.2.1來設置Wrapper的版本

2、 build的生命周期

Gradle的構建腳本生命周期具備三大步,如下:

可以看見,生命周期其實和上面構建腳本Build script的執行流程是可以關聯上的。(上面關于Task方面的內容本文中不會使用。)

3、設置腳本Settings script

在對工程進行配置(譬如多項目樹構建)時Settings實例與settings.gradle文件一一對應,它用來進行一些項目設置的配置。這個文件一般放置在工程的根目錄。譬如:

多模塊項目,就是在settings.build 中添加模塊名稱。 例如:

4、頂層build.gradle文件

構建的時候默認會配置上一個JCenter() 倉庫,也可以加上其他的倉庫,比如,BRVAH這個第三方框架,就沒有放在JCenter里面,因為這個倉庫發布的流程比較復雜,時間也比較久,所以就發布在https://jitpack.io 倉庫上,所以在使用BRVAH的時候就要在allprojects 中添加jitpack倉庫地址。

進入實戰

1.BuildConfig和資源

通過配置靈活切換不同環境的 接口地址

相信用eclipse開發的時候我們都是用的以下這種方法來切換接口地址的:

這種寫法應該都不陌生,那在Gradle構建中,有沒有可能用更好的方法來解決這個問題咧?

答案是有可能的!

自SDK工具版本升級到17之后,構建工具都會生成一個叫作BuildConfig的類,該類包含一個按照構建類型設置值的DEBUG常量,可以定義其他的一些屬性,Gradle提供了一個buildConfigField 方法 ,下面就是頂一個String類型的BASE_URL常量,值為"http://debug.example.com/api”。

這里要注意的是添加String類型的數據的時候要添加轉義的引號,不然是創建不成功的,例如:

在這里還有一個問題,如果開發的是一個多模塊項目,那么在library中定義這種屬性,默認是不區分debug和release版本的。缺省情況下,無論你選用什么Build variant ,庫工程都只會打出release包,這是由于Gralde語言的限制造成的,但如果想強制使用debug,可以如下指定:

2. Gradle修改資源文件信息

配置不同環境的資源文件

同樣的Gradle也提供了一個resValue() 方法,下面就是定義了一個app_name的string資源。

但是上面這種定義是錯誤的,build的時候會報以下這種錯誤:

提示定義了重復的資源,所以在用resValue()的時候不要在.xml文件定義相同名字的資源數據。

3.gradle.properties 文件

解決頻繁同步問題

相信大家在嘗試上面的方法的時候有這樣一個問題,那就是我們每修改一下.gradle文件,AS工具就提示要”Sync Now”,這樣是不是有點麻煩了咧? 下面就可以用到gradle.properties文件來進一步的優化。

4.Gradle配置生成apk文件名

防止release覆蓋問題,便于保存歷史release記錄

參考資料:

http://blog.csdn.net/yanbober/article/details/49314255

http://benweizhu.github.io/blog/2015/01/31/deep-into-gradle-in-action-1/

http://blog.csdn.net/u011054333/article/details/53999590

http://blog.csdn.net/xude1985/article/details/51548245

 

 

來自:http://mp.weixin.qq.com/s?__biz=MzIwMzYwMTk1NA==&mid=2247483668&idx=1&sn=ff2612a607378053cbe8476e94af5a4f&chksm=96cda059a1ba294f715cc3b126541127bee9da877c7f2ad982e82c85f5e35e6a21a5934994d7&mpshare=1&scene=23&srcid=022076xydDBBtAMqcWko1Du1#rd

 

 本文由用戶 ColletteChu 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!