簡(jiǎn)介
Gradle構(gòu)建腳本的書寫沒有基于傳統(tǒng)的XML文件,而是基于Groovy的領(lǐng)域?qū)S谜Z言(DSL)。Groovy是一種基于Java虛擬機(jī)的動(dòng)態(tài)語言。Gradle團(tuán)隊(duì)認(rèn)為,基于動(dòng)態(tài)語言的DSL語言與Ant或者任何基于XML的構(gòu)建系統(tǒng)相比,優(yōu)勢(shì)都十分顯著。
一、Gradle基礎(chǔ)
1、構(gòu)建生命周期
一個(gè)Gradle的構(gòu)建通常有如下三個(gè)階段。
- 初始化:項(xiàng)目實(shí)例會(huì)在該階段被創(chuàng)建。如果一個(gè)項(xiàng)目有多個(gè)模塊,并且每一個(gè)模塊都有其對(duì)應(yīng)的build.gradle文件,那么就會(huì)創(chuàng)建多個(gè)項(xiàng)目實(shí)例。
- 配置:在該階段,構(gòu)建腳本會(huì)被執(zhí)行,并為每個(gè)項(xiàng)目實(shí)例創(chuàng)建和配置任務(wù)。
- 執(zhí)行:在該階段,Gradle將決定哪個(gè)任務(wù)會(huì)被執(zhí)行。哪些任務(wù)被執(zhí)行取決于開始該次構(gòu)建的參數(shù)配置和該Gradle文件的當(dāng)前目錄。
2、構(gòu)建配置文件
Android的構(gòu)建文件中,有一些元素是必需的:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath'com.android.tools.build:gradle:3.0.1'
}
}
構(gòu)建腳本代碼塊在Android構(gòu)建工具上定義了一個(gè)依賴,就像Maven的artifact。這就是Android插件的來源,Android插件提供了構(gòu)建和測(cè)試應(yīng)用所需要的一切。每一個(gè)Android項(xiàng)目都應(yīng)該申請(qǐng)?jiān)摬寮?/p>
apply plugin: 'com.android.application'
如果你正在構(gòu)建一個(gè)依賴庫,那么你需要聲明'com.android.library',而不是‘com.android.application’。你不能在一個(gè)模塊中同時(shí)使用它們,因?yàn)檫@會(huì)導(dǎo)致構(gòu)建錯(cuò)誤。一個(gè)模塊可以是一個(gè)Android應(yīng)用模塊,或者是一個(gè)Android依賴模塊,但不能二者都是。
3、運(yùn)行基本構(gòu)建任務(wù)
使用terminal或命令提示符,可以導(dǎo)航到項(xiàng)目根目錄,運(yùn)行帶有tasks的GradleWrapper命令:
$ gradlew tasks
這將打印出所有可用的任務(wù)列表。如果你添加了--all參數(shù),那么你將獲得每個(gè)任務(wù)對(duì)應(yīng)依賴的詳細(xì)介紹。
$ gradlew assembleDebug
這個(gè)任務(wù)會(huì)為這個(gè)應(yīng)用創(chuàng)建一個(gè)debug版本的APK。
除了assemble外,還有其他三個(gè)基本任務(wù)。
- Check:運(yùn)行所有的檢查,這通常意味著在一個(gè)連接的設(shè)備或模擬器上運(yùn)行測(cè)試。
- Build:觸發(fā)assemble和check。
- Clean:清除項(xiàng)目的輸出。
二、認(rèn)識(shí)Gradle文件
1、Settings.gradle文件
對(duì)于一個(gè)只包含一個(gè)Android應(yīng)用的新項(xiàng)目來說,settings.gradle應(yīng)該是這樣的:
Include ':app'
settings文件在初始化階段被執(zhí)行,并且定義了哪些模塊應(yīng)該包含在構(gòu)建內(nèi)。在本例中,app模塊被包含在內(nèi)。單模塊項(xiàng)目并不一定需要setting文件,但是多模塊項(xiàng)目必須要有setting文件,否則,Gradle不知道哪個(gè)模塊應(yīng)包含在構(gòu)建內(nèi)。
2、Project級(jí)別的build.gradle文件
默認(rèn)情況下其包含如下兩個(gè)代碼塊:
buildscript { //實(shí)際構(gòu)建配置代碼塊
ext.kotlin_version = '1.2.10'
repositories { //依賴倉庫,每個(gè)倉庫意味著一系列的依賴包
jcenter() //JCenter是一個(gè)很有名的Maven庫
mavenCentral()
maven { url 'https://maven.google.com' }
google()
}
dependencies { //配置構(gòu)建過程中的依賴包
classpath 'com.android.tools.build:gradle:3.0.1'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects { //聲明那些需要被用于所有模塊的屬性,甚至可以在allprojects中創(chuàng)建task,這些任務(wù)最終被運(yùn)用到所有Module
repositories {
jcenter()
maven { url "https://jitpack.io" }
google()
}
}
請(qǐng)注意,只要你使用了allprojects,模塊就會(huì)被耦合到項(xiàng)目。這意味著,其很可能在沒有主項(xiàng)目構(gòu)建文件的情況下,無法獨(dú)立構(gòu)建模塊。最初,這看起來可能不是一個(gè)問題,但是如果你后面想要分離一個(gè)內(nèi)部依賴庫到自己的項(xiàng)目,那么你將需要重構(gòu)你的構(gòu)建文件。
3、Module級(jí)別的build.gradle文件
Module層的build.gradle文件的屬性只能應(yīng)用在Androidapp模塊,它可以覆蓋Project層build.gradle文件的任何屬性。
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion '25.0.3'
defaultConfig {
applicationId "com.qingmei2.gradle.demo"
minSdkVersion 14
targetSdkVersion 22
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile 'com.android.support:multidex:1.0.1'
}
記錄以下三點(diǎn):
插件
第一行用到了Android應(yīng)用插件,谷歌的Android工具團(tuán)隊(duì)負(fù)責(zé)Android插件的編寫和維護(hù),并提供構(gòu)建、測(cè)試和打包Android應(yīng)用以及依賴項(xiàng)目的所有任務(wù)。
Android
compileSdkVersion(必須):編譯應(yīng)用Android API的版本
buildToolsVersion(必須):構(gòu)建工具及編譯器的版本號(hào)
applicationId
該屬性覆蓋了manifest文件中的packagename,但applicationId和packagename有一些不同。在Gradle被用作默認(rèn)的Android構(gòu)建系統(tǒng)之前,AndroidManifest.xml中的packagename有兩個(gè)用途:作為一個(gè)應(yīng)用的唯一標(biāo)志,以及在R資源類中被用作包名。使用構(gòu)建variants,Gradle可更容易地創(chuàng)建不同版本的應(yīng)用。
- minSdkVersion 應(yīng)用最小API級(jí)別
- targetSdkVersion
targetSdkVersion用于通知系統(tǒng),該應(yīng)用已經(jīng)在某特定Android版本通過測(cè)試,從而操作系統(tǒng)不必啟用任何向前兼容的行為。
Dependencies
定義依賴包