什麼是Gradle,我打開idea,在設定裡面會有一個選項是build tools,這個選項裡有3個選項,ant,maven和gradle。
是以gradle就是build tools,簡稱建構工具。ant,maven和gradle就是java中常用的建構工具。
那什麼是建構工具呢,按照我的了解,建構工具就是把代碼變成應用的工具,比如gradle能把項目代碼變成apk檔案。這也就是應用和網頁其中一個不同的地方。
一.Product與task
第一次看到Android中預設配置的gradle我也看不懂,就完全不懂寫的是什麼,感覺亂亂的,深入了解後才看懂一些皮毛。
一個Android項目如果要編譯的話,至少要有一個子產品的build.gradle,而每個子產品的build.gradle就是Gradle 的一個Project,預設情況下我門有個app的build.gradle,這個就是一個Project。
一個Project裡頭包含多個task(任務),一個task又包含多個action。是以Gradle 抽象來說是由至少一個Project組成,Project由多個task組成,task由多個action組成。還有一點就是這個Project具體執行的task是由具體的Plugin決定的。比如我們app的build.gradle最上方會寫着apply plugin: 'com.android.application'
如果你用指令gradlew tasks tools ,你就可以檢視全部task,mac記得在前面加.\
有個我不清楚的地方是,有的人說是用gradle,但是我這是用gradlew才有效果,我不知道這兩個指令的差別。
順帶一說,常用的task有assemble、check、build、clean,task可以用指令來執行。
注意:如果你看到gradlew這個指令,那就是對建構工具進行操作的指令。
二.編譯過程
Android的編譯過程很複雜,不是我這種渣渣能看得懂的,我隻知道項目經過編譯後得到dex檔案和資源檔案。
編譯什麼的,一聽就有點不了解的意思。apk是通過代碼進行先編譯後打包得到的,這樣講就大概覺得編譯有點意思。
在别人寫的部落格中有說到,Gradle編譯分為三個階段:
(1)初始化階段:建立 Project 對象
(2)配置階段:建立project下的task
(3)執行階段:執行task
是以為什麼在子產品化中每個子產品能單獨編譯,因為每個子產品在初始化階段會得到一個Project 。

image.png
三.Android Gradle結構
Gradle在AS中有3個基本的組成,一個是settings.gradle,一個是總項目的build.gradle,還有各個子產品的build.gradle
1.settings.gradle
這個檔案很簡單,主要用來來配置多項目建構。通俗點講就是你要建構的項目中需要包含哪些子產品。
2.頂層build.gradle
一般檔案結構是這樣
官方也給出了各個部分作用
看看我們as給我們配的
buildscript {
repositories {
jcenter()//設定之後可以在項目中輕松引用jcenter上的開源項目
}
dependencies {
// 添加插件
classpath 'com.android.tools.build:gradle:2.2.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()//代碼托管庫:設定之後可以在項目中輕松引用jcenter上的開源項目
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
好吧,不裝逼了,其實我也很好奇為什麼會有兩個repositories
3.子產品中的build.gradle
//說明是app程式,執行的是app的task
apply plugin: 'com.android.application'
// android程式相關的配置
android {
compileSdkVersion 26//編譯的SDK版本
buildToolsVersion "26.0.1"//編譯的Tools版本
// 預設配置
defaultConfig {
applicationId "com.example.kylinarm.biyemonk"//應用程式的包名
minSdkVersion 158//支援的最低版本
targetSdkVersion 26//支援的目标版本
versionCode 1//需要建構的應用的版本
versionName "1.0"//需要建構的應用的版本名
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// 這個我在打包那說過,正式包和測試包的配置
buildTypes {
//正式包,你開心也可以多寫個debug測試包的配置
release {
minifyEnabled false//是否混淆(true為混淆)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆檔案
}
}
}
//依賴,這個沒什麼好說的
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
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:26.0.0-alpha1'
testCompile 'junit:junit:4.12'
compile project(':baselibrary')
compile project(':componentlibrary')
compile 'com.jakewharton:butterknife:5.1.1'
}
在android{}的配置中,不光隻有defaultConfig、buildTypes 這些,還有其它的,我這就不多說,用到再說,因為我總共也隻用過那幾種,并不知道全部的配置。
四.總結
這裡主要講的是淺談,gradle的知識内容很多,有些都出了一本書專門講gradle,我懂的也不多,就懂它的一個大概的一些基本的原理,某些功能比如說打包,我也是需要具體去查怎麼使用。
我總結對gradle的了解:
(1)gradle是一個build tools,主要功能是執行task
(2)Android配置中的配置内容要記住,因為它事關項目的建構
(3)gradle建構的一個過程,也就是它的生命周期