隨着Android Studio的遍佈,不斷增長的Android開發者也要開端了解和學習Gradle這款強壯的代碼構建東西了。我們在學習和了解一項新事物的時分,最疾速的辦法每每是與已知的事物進行比照,對於熟悉Makefile編譯機制的Linux程序員而言,知道和掌握Gradle最佳的辦法莫過於比照它們之間的區別了,這篇文章不許備詳細介紹Gradle的方方面面,而是但願通過與Makefile的比照幫助Gradle初學者更疾速地瞭解Gradle的基礎和原理。java
Makefile是一種辦理和編譯 Linux C/C++ 項目的東西,而Gradle也是一種代碼構建東西,只不過是對於Java言語的,它相同可以通過一些裝備文件和腳正本完結代碼的依靠、第三方庫的引進、編譯的主動化裝備等功能。android
首要說說Makefile,它是由一個個"規矩"構成,每一個"規矩"都是由"方針"、"依靠"、"指令"構成, 一個最簡略的Makefile以下所示:程序員
1app
2maven
3函數
4學習
5gradle
6網站
7ui
8
9
.PHONY: clean
all: hello
hello: hello.c
gcc -o hello hello.c
clean:
rm hello
這兒有三個"方針",分別是: "all","hello","clean"
當履行"make"指令時,編譯器會默許查找方針"all" ,假如沒有"all"則會查找Makefile文件的第一個方針。本示例中有"all"方針,它依靠"hello"方針,於是編譯器會轉而先構建"hello"方針,構建前, 編譯器會先檢查"hello"方針是否是需求更新(通過判別"hello"文件與它所依靠的源文件"hello.c"的修正時刻),假如需求,則履行後邊的指令,而需求編譯的源文件則是通過手動或許相關函數的方法添加到編譯指令的參數中去的。
這便是makefile最基地的構建思惟,通過一個個"方針"、"依靠"、"指令"來完結悉數項目的關聯和編譯。那麼,我們也依據這一思惟來看看Gradle是怎樣完結的。
1. Gradle是怎樣辨認源文件的 ?
Gradle是採起了一種"約好優於裝備"的思惟來完結這一點的,它通過"Plugin"來約好項目的方針和源文件的規劃,例如: Java Plugin 界說的源文件規劃如圖所示:
wKioL1Xdnk2QXnWeAAEXQAiYhPc987.jpg
由該圖可以很清楚地看到,Java Plugin 直接約好好了源文件的目錄構造,在Gradle中,通常把這些源碼目錄的裝備叫作"SourceSet",同理,Android供給的Android Plugin相同也界說了自個的源文件規劃,還加入瞭如 jni, AndroidManifest.xml 等目錄和文件。對於Gradle項目而言,需求在每一個代碼模塊的"build.gradle"文件中界說運用哪種Plugin, 例如:
1
2
3
4
5
6
7
8
//通常的Java項目
apply plugin: 'java'
//Android Application
apply plugin: 'com.android.application'
//Android Library
apply plugin: 'com.android.library'
2. Gradle是怎樣辨認編譯方針的 ?
在Gradle中,與Makefile的"方針"相對應的概念是"使命",即"task",Gradle的構建進程,便是履行一條一條"task"使命的進程, 相同,一個"task"也是可以依靠另外一個"task"的,這麼,通過這種依靠聯繫,就可以將悉數項目中各個"task"鏈接到一塊兒了。
與Makefile中手寫方針的方法不同,Gradle將一切的"task"的界說悉數交給Plugin來完結,由於每一種工程類型(Java項目、Android項目等),其構建進程都是迥然不一樣的,於是爲每一種類型的項目界說好了一種通用的Plugin,之後同類型的項目就可以直接運用該Plugin了,十分的靈活和便利。
當我們在項目中履行"gradle build"指令時,可以看到該項目運用的Plugin詳細界說了哪些"task",例如一個典型的Java Plugin界說的"task"以下所示:
1
2
3
4
5
6
7
8
9
10
11
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
固然,儘管同是Android類型的工程,但不同的項目究竟仍是有裝備上的區別,於是,Gradle的Plugin中也可以界說和導出一些特定的"元素"用於傳遞用戶自界說的裝備信息,例如: Google供給的 "com.android.application"Plugin 就界說了一個"android"元素,開發者可以在build.gradle中裝備該元素的細節,比方界說一些: "項目的ID"、"sdk的版本"、"是否是混雜"等等,例如:
1
2
3
4
5
6
7
8
9
10
11
12
13
android {
compileSdkVersion 21
buildToolsVersion "21.1.1"
defaultConfig {
applicationId "com.jhuster.test"
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName "1.0.0"
}
}
3. Gradle指令怎樣用 ?
gradle指令與make指令類似,都是用來履行編譯/整理使命的,make指令默許查找當時目錄下的Makefile文件,並且開端構建指令參數中所指定的"方針",例如:
1
2
$make all
$make clean
相同,gradle指令也是類似的用法,例如:
1
2
3
4
$gradle build //構建和打包悉數項目
$gradle clean //清除以前的構建
$gradle test //履行測驗
$gradle compileJava //編譯java
4. Gradle是怎樣引進第三方庫的 ?
對於Makefile而言,一般需求將第三方庫的源碼下載下來,編譯爲庫後,放入到工程目錄下,而後修正Makefile文件,在gcc/g++的編譯鏈接參數中引證該第三方庫的,例如:
1
2
hello: hello.c
gcc -o hello hello.c -L/libs/foo.a
而Gradle則是通過build.grade文件中的dependencies來裝備的,例如:
1
2
3
4
dependencies {
compile files('libs/foo.jar') //以jar的方法引證
compile project(':foo') //以library工程源碼的方法引證
}
別的,Gradle還支撐類似Ubuntu軟件源庫房的方法來引證第三方庫,開發者可以將自個的第三方庫上傳到一些支撐Gradle的基地庫房中,這麼,其餘人就可以通過裝備build.gradle直接完結對第三方庫的引證了,代碼構建的時分Gradle會主動完結第三方庫的下載和鏈接。比照經常使用的兩個個基地庫房: jcenter,mavenCentral。
例如: 我們引證jcenter庫房的okhttp庫,則build.gradle裝備以下:
1
2
3
4
5
6
7
8
9
allprojects {
repositories {
jcenter()
}
}
dependencies {
compile 'com.squareup.okhttp:okhttp:2.4.0'
}
5. 小結
Gradle真的很強壯很靈活,它將最基地的構建規都則交給了Plugin來完結,這麼,輕鬆完結了構建進程的通用性,開發者只需求重視事務邏輯,以及少許的裝備便可完結主動化編譯和佈置的進程,比較於Linux手寫makefile要便利許多。好了,對於Gradle和Makefile的簡略比照就介紹到這兒了,最後引薦一個網站給你們 http://www.keymb.com/