Gradle系列(一):Groovy基礎(chǔ)
Gradle系列(二):AndroidStudio的Gradle簡(jiǎn)介
Gradle系列(三):項(xiàng)目實(shí)踐
前言
在開(kāi)發(fā)中我們接觸的較多的是build.gradle和settings.gradle,我們知道新的moduler要配置在setting.gradle中,新的依賴庫(kù),包括項(xiàng)目的版本等要配置在app目錄下build.gradle,遠(yuǎn)程倉(cāng)庫(kù)以及插件地址要配置在根目錄的build.gradle蛾找。知道這些足夠配置一個(gè)基本項(xiàng)目了失仁,但是我們常有下面幾個(gè)疑問(wèn):
- Gradle是什么雷激? AndroidStudio中的GradlePlugin又是什么璧疗?
- 還有g(shù)radlew.bat是干嘛的皆的,gradle在AndroidStudio中如何工作的悲敷?
第一個(gè)問(wèn)題究恤,我們需要了解關(guān)于gradle的三點(diǎn):
構(gòu)建工具包括 make,Ant,Maven,Lvy和現(xiàn)在的Gradle衣陶,差不多是一步步進(jìn)化而來(lái)柒爵,前面幾種都是基于XML,不擅長(zhǎng)if這類邏輯判斷义锥,而Gradle基于Groovy有自己的語(yǔ)法探遵。
Gradle與Android本身沒(méi)有任何關(guān)系窟赏,Gradle主要用于Java項(xiàng)目,不過(guò)還支持Android箱季,C涯穷,C++。Gradle官方文檔:https://docs.gradle.org/current/release-notes
Google選用Gradle作為AS的構(gòu)建工具藏雏,集成了一套插件叫Android Gradle Plugin拷况,Gradle Plugin官方文檔:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Why-Gradle-
第二個(gè)問(wèn)題,在此新建項(xiàng)目一探究竟
Android Studio中Gradle結(jié)構(gòu)
在Android Studio新建項(xiàng)目掘殴,AS會(huì)自動(dòng)下載安裝Gradle并且生成下面這樣的項(xiàng)目結(jié)構(gòu):
先看2號(hào)和4號(hào)赚瘦,這里有個(gè)gradle wrapper的東西意為gralde包裝,是Android studio特有的奏寨,因?yàn)槲覀冊(cè)诒镜氐捻?xiàng)目可能用了不同的Gradle版本(比如項(xiàng)目A用Gradle1.0起意,項(xiàng)目B用Gradle2.0),那么我們只安裝Gradle1.0或者Gradle2.0都是不行的病瞳,于是gradle wrapper可以來(lái)解決這個(gè)問(wèn)題揽咕,不同的項(xiàng)目允許配置不同的Gradle版本,但是每個(gè)版本AS都會(huì)幫我們下載到本地(Windows默認(rèn)在Administator文件夾)套菜,看下:
所以相當(dāng)于在Android studio所有操作就是基于GradleWrapper亲善,打開(kāi)AS自帶的Terminal查看當(dāng)前項(xiàng)目的Gradle版本:
Gradle的工作流程
在上面1,3,5號(hào)對(duì)應(yīng)三個(gè).gradle文件,在每個(gè)gradle開(kāi)始處都加上Log打印逗柴,運(yùn)行項(xiàng)目蛹头,看下這三處.gradle文件的執(zhí)行順序:
先進(jìn)入Settings.gradle初始化,弄清整個(gè)項(xiàng)目有多少project,可以在這對(duì)gradle添加額外屬性渣蜗,那么在buiuld.gradle中就能拿到屠尊。
進(jìn)入跟目錄的build.gradle,內(nèi)容主要包含了兩個(gè)方面:一個(gè)是聲明倉(cāng)庫(kù)的源袍睡,這里可以看到是指明的jcenter(), 之前版本則是mavenCentral(), jcenter可以理解成是一個(gè)新的中央遠(yuǎn)程倉(cāng)庫(kù)知染,兼容maven中心倉(cāng)庫(kù),而且性能更優(yōu)斑胜。另一個(gè)是聲明了android gradle plugin的版本,android studio 1.0正式版必須要求支持gradle plugin 1.0的版本嫌吠。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
3.進(jìn)入app的build.gradle止潘,這個(gè)gradle分為application 和library兩個(gè)類型,區(qū)分是依據(jù)第一句的apply配置:
apply plugin: 'com.android.application'
//apply plugin: 'com.android.library'
- 注釋:apply是Project類下的一個(gè)方法辫诅,接受Map類型參數(shù)凭戴,key是"plugin"代表類型,value是"com.android.application"炕矮,代表android gradle插件版本就是上面配置的 classpath 'com.android.tools.build:gradle:2.2.0'
PluginAware.apply(java.util.Map)
gradle構(gòu)建基本知識(shí)
AndroidStudio以gradle為構(gòu)建工具么夫,我們只需輕點(diǎn)一下run,app就自動(dòng)打包生成了肤视,這個(gè)流程是什么樣的档痪?下面先看幾個(gè)基本名詞:
-
buildTypes{}
這個(gè)方法參數(shù)是一個(gè)Closure,gradle默認(rèn)提供了debug和release兩種編譯類型邢滑,具體的執(zhí)行(包括編譯腐螟,打包,clean等)是由一個(gè)個(gè)task完成困后,這些task完全由Android Gradle Plugin決定乐纸,比如這個(gè)GradleDemo的所有Task:可以看出build這個(gè)目錄下有assembleDebug和assembleRelease兩個(gè)task(在buildTypes中增加自定義type,這個(gè)build下就會(huì)生成相應(yīng)的task)
打開(kāi)自帶的Terminal摇予,用gradle執(zhí)行task的命令格式為 :gradlew + taskName
gradlew clean:嘗試執(zhí)行其中的clean這個(gè)task汽绢,可以看出整個(gè)build文件夾都被清空了
gradlew assembleDebug :編譯一個(gè)debug版本,在output生成了debug apk:
在buildType中自定義一個(gè)type:
編譯dml這個(gè)版本:gradlew assembleDml侧戴,在output中生成了app-dml-unsigned.apk(這個(gè)apk和debug release用的同樣的代碼宁昭,只不過(guò)是未簽名的本質(zhì)上和debug apk一樣):
- productFlavors
用于多渠道打包,例如新增proA和proB兩個(gè)product:
productFlavors{
proA{}
proB{}
}
執(zhí)行編譯所有的release包:
看下輸出:
也可以利用productName編譯特定的產(chǎn)品apk救鲤。
- dependencies
技巧:可以通過(guò)buildType或者productFlavors來(lái)差異化編譯依賴庫(kù):
debugCompile(name: "$libName", ext: 'aar') //只在debug模式下才會(huì)編譯
由此可見(jiàn)久窟,我們輕點(diǎn)一下run,背后其實(shí)就是執(zhí)行了gradle腳本:assembleDebug本缠,生成未簽名的apk斥扛。而編譯簽名包,也就是執(zhí)行了有簽名文件gradle腳本:assembleRelease而已