Gradle系列(一):Groovy基礎
Gradle系列(二):AndroidStudio的Gradle簡介
Gradle系列(三):項目實踐
前言
在開發中我們接觸的較多的是build.gradle和settings.gradle,我們知道新的moduler要配置在setting.gradle中,新的依賴庫,包括項目的版本等要配置在app目錄下build.gradle,遠程倉庫以及插件地址要配置在根目錄的build.gradle。知道這些足夠配置一個基本項目了,但是我們常有下面幾個疑問:
- Gradle是什么? AndroidStudio中的GradlePlugin又是什么?
- 還有gradlew.bat是干嘛的,gradle在AndroidStudio中如何工作的?
第一個問題,我們需要了解關于gradle的三點:
構建工具包括 make,Ant,Maven,Lvy和現在的Gradle,差不多是一步步進化而來,前面幾種都是基于XML,不擅長if這類邏輯判斷,而Gradle基于Groovy有自己的語法。
Gradle與Android本身沒有任何關系,Gradle主要用于Java項目,不過還支持Android,C,C++。Gradle官方文檔:https://docs.gradle.org/current/release-notes
Google選用Gradle作為AS的構建工具,集成了一套插件叫Android Gradle Plugin,Gradle Plugin官方文檔:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Why-Gradle-
第二個問題,在此新建項目一探究竟
Android Studio中Gradle結構
在Android Studio新建項目,AS會自動下載安裝Gradle并且生成下面這樣的項目結構:
先看2號和4號,這里有個gradle wrapper的東西意為gralde包裝,是Android studio特有的,因為我們在本地的項目可能用了不同的Gradle版本(比如項目A用Gradle1.0,項目B用Gradle2.0),那么我們只安裝Gradle1.0或者Gradle2.0都是不行的,于是gradle wrapper可以來解決這個問題,不同的項目允許配置不同的Gradle版本,但是每個版本AS都會幫我們下載到本地(Windows默認在Administator文件夾),看下:
所以相當于在Android studio所有操作就是基于GradleWrapper,打開AS自帶的Terminal查看當前項目的Gradle版本:
Gradle的工作流程
在上面1,3,5號對應三個.gradle文件,在每個gradle開始處都加上Log打印,運行項目,看下這三處.gradle文件的執行順序:
先進入Settings.gradle初始化,弄清整個項目有多少project,可以在這對gradle添加額外屬性,那么在buiuld.gradle中就能拿到。
進入跟目錄的build.gradle,內容主要包含了兩個方面:一個是聲明倉庫的源,這里可以看到是指明的jcenter(), 之前版本則是mavenCentral(), jcenter可以理解成是一個新的中央遠程倉庫,兼容maven中心倉庫,而且性能更優。另一個是聲明了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.進入app的build.gradle,這個gradle分為application 和library兩個類型,區分是依據第一句的apply配置:
apply plugin: 'com.android.application'
//apply plugin: 'com.android.library'
- 注釋:apply是Project類下的一個方法,接受Map類型參數,key是"plugin"代表類型,value是"com.android.application",代表android gradle插件版本就是上面配置的 classpath 'com.android.tools.build:gradle:2.2.0'
PluginAware.apply(java.util.Map)
gradle構建基本知識
AndroidStudio以gradle為構建工具,我們只需輕點一下run,app就自動打包生成了,這個流程是什么樣的?下面先看幾個基本名詞:
-
buildTypes{}
這個方法參數是一個Closure,gradle默認提供了debug和release兩種編譯類型,具體的執行(包括編譯,打包,clean等)是由一個個task完成,這些task完全由Android Gradle Plugin決定,比如這個GradleDemo的所有Task:可以看出build這個目錄下有assembleDebug和assembleRelease兩個task(在buildTypes中增加自定義type,這個build下就會生成相應的task)
打開自帶的Terminal,用gradle執行task的命令格式為 :gradlew + taskName
gradlew clean:嘗試執行其中的clean這個task,可以看出整個build文件夾都被清空了
gradlew assembleDebug :編譯一個debug版本,在output生成了debug apk:
在buildType中自定義一個type:
編譯dml這個版本:gradlew assembleDml,在output中生成了app-dml-unsigned.apk(這個apk和debug release用的同樣的代碼,只不過是未簽名的本質上和debug apk一樣):
- productFlavors
用于多渠道打包,例如新增proA和proB兩個product:
productFlavors{
proA{}
proB{}
}
執行編譯所有的release包:
看下輸出:
也可以利用productName編譯特定的產品apk。
- dependencies
技巧:可以通過buildType或者productFlavors來差異化編譯依賴庫:
debugCompile(name: "$libName", ext: 'aar') //只在debug模式下才會編譯
由此可見,我們輕點一下run,背后其實就是執行了gradle腳本:assembleDebug,生成未簽名的apk。而編譯簽名包,也就是執行了有簽名文件gradle腳本:assembleRelease而已