最近發現有好多朋友問和Gradle相關的東西,于是決定寫一系列博客,簡單備用。
隨著項目的逐步擴大與Android市場上應用需求的多樣化,越來越多的應用需要集成眾多的三方庫與其它依賴,在Google推出的最新idea Android Studio中,引入Gradle用于項目構建工具,那么構建工具有什么優勢呢?
構建工具的主要優勢有以下幾點:
便捷性(Portability)自動化(Automation)可重復性(Repeatability)那么構建工具有很多(PS:ANT),為什么要選擇Gradle呢?
主要原因還是Google粑粑在Android Studio中選用Gradle作為idea的構建系統,事實上,Android Studio將整個應用的構建過程指派給了Gradle,當點擊”運行”按鈕時,Android studio會在運行過程中設置Gradle并在后臺監控,通過學習Gradle相關知識,我們可以擴展該默認行為以構建能力更強且經過適當測試的Android應用。Gradle使得開發人員只需通過點擊按鈕就可以自動構建和測試應用,針對依賴和變種的管理也更加方便。另外Gradle是一種用于編寫構建腳本的緊湊且強大的構建語言。
說了這么多,怎么安裝Gradle呢?
在Android Studio中,項目構建過程中會執行gradlew腳本,在沒有Gradle的情況下,從網絡端下載。在命令臺上我們可以使用如下方式安裝獨立的Gradle。
最新版的Gradle要求JDK或者JRE版本在1.7以上,所以先運行java -version查看JDK版本,過低先更新,隨后使用包管理工具進行安裝,在類Unix系統上使用SDKMAN,命令是sdk install gradle 3.3,在MAC上使用HomeBrew,命令是brew install gradle,在Windows上使用Chocolatey,命令是choco install gradle。隨后并不需要其他的手動安裝。
Gradle任務簡介
對于Gradle而言,它的一個優勢就是可擴展域模型,這個模型的核心就是任務(PS:task),任務是一種Grale可以推斷出的自約束工作單元,任務的關鍵是任務所進行的操作,比如我們會新建一個任務用于編譯某些java源文件,或者把一個文件從A目錄復制到B目錄又或者只是打印Hello,任務可以單獨執行操作也可以聲明對其他任務的依賴,Gradle會確保所有的這些依賴都在運行并確保它們所有的依賴性等等,任務還可以定義輸入和輸出,它所讀取及所寫入的文件,這使得Gradle能確定任務是否需要執行自己的工作或者所有的內容是否是最新狀態,在這種情況下,它不需要運行。
創建簡單任務
使用gradle -V命令查看Gradle版本,截圖如下:
隨后我們編寫一個build.gradle文件,內容如下:
task hello { doLast { 在當前目錄執行gradle -q hello,我們可以看到如下運行結果:通過上述運行結果我們可以看出,在這里這個腳本只是簡單定義了一個名為hello的task,當執行gradle hello時,Gradle先執行名為hello的task,隨后執行task中的動作,在這個task中所進行的動作就是輸出Hello world!-q的意思是簡潔輸出,不輸出日志,執行gradle hello的運行效果如下圖:
Gradle需要執行大量工作才能啟動,這主要是因為它需要調起java虛擬機實例,使用Gradle Demon可以縮短這一啟動時間,Gradle Demon是一種掛靠在操作系統后臺的進程,當Gradle使用Gradle Demon時,一個Gradle Demon已經啟動完成并長期運行于后臺,保證JBM實例處于活動狀態,隨后的Gradle都可以使用相同的實例運行,默認情況下,,當在命令行執行Gradle時,Android Studio會使用這種模式,但是必須明確指定啟用這種模式。
Gradle的前世
apply plugin: 'com.android.application'android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.example.zbtuo.opengltriangles" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.1.0' testCompile 'junit:junit:4.12'}上面是一個build.gradle的完整文件,從上述代碼可以看出這是一種類似于分拆式JSON的語法.在最后可以看到一個名為hello的任務,用于輸出”Hello world!”,Gradle文件是按照Gradle提供的特殊用途的構建語言編寫的,它基于一個叫Groovy的通用腳本編制語言,Groovy對一些功能進行了語法改進使我們可以編寫語言比使用java等代碼看起來更自然的構建腳本。其次Groovy與Java完美集成,這是Gradle平臺使用的編寫語言,在使用Gradle時需要了解的主要內容是Android和task等關鍵字所來源于的Gradle構建語言,但是這對了解此構建語言如何以Groovy和Java為基礎很有幫助。整個構建腳本具有所謂的委托對象,它會向構建腳本內的Groovy腳本編制語言公開Gradle構建語言。如果編寫了一個Gradle插件,則可以用任何語言編寫它并使用相同的委托對象。Gradle構建語言也稱為Gradle DSL或域特定語言。域特定語言是針對特定任務精心定制的語言,在這個案例中,我們所談到的域是Android構建,請注意描述構建和提供有關,如何讓構建實現的說明之間存在巨大的差異。Gradle DSL聲明為使你僅負責描述構建而且Gradle本身知道如何使其實現,這意味著你的構建腳本可能會短得多而且容易理解得多,但是在構建腳本內有一個可由你處理的完全成熟且強大的編程語言。我們衷心建議你保持構建腳本的聲明性并且盡量不要用低級邏輯污染它,這正是Gradle插件的用途,你可以采用Groovy,Java或Scala等任何JVM語言來編寫它們。
新聞熱點
疑難解答