Gradle系列(二):AndroidStudio的Gradle簡介

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的三點:

第二個問題,在此新建項目一探究竟

Android Studio中Gradle結構

在Android Studio新建項目,AS會自動下載安裝Gradle并且生成下面這樣的項目結構:

Paste_Image.png

先看2號和4號,這里有個gradle wrapper的東西意為gralde包裝,是Android studio特有的,因為我們在本地的項目可能用了不同的Gradle版本(比如項目A用Gradle1.0,項目B用Gradle2.0),那么我們只安裝Gradle1.0或者Gradle2.0都是不行的,于是gradle wrapper可以來解決這個問題,不同的項目允許配置不同的Gradle版本,但是每個版本AS都會幫我們下載到本地(Windows默認在Administator文件夾),看下:

Paste_Image.png

所以相當于在Android studio所有操作就是基于GradleWrapper,打開AS自帶的Terminal查看當前項目的Gradle版本:


Paste_Image.png

Gradle的工作流程

在上面1,3,5號對應三個.gradle文件,在每個gradle開始處都加上Log打印,運行項目,看下這三處.gradle文件的執行順序:

Paste_Image.png
  1. 先進入Settings.gradle初始化,弄清整個項目有多少project,可以在這對gradle添加額外屬性,那么在buiuld.gradle中就能拿到。

  2. 進入跟目錄的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)

Paste_Image.png

打開自帶的Terminal,用gradle執行task的命令格式為 :gradlew + taskName
gradlew clean:嘗試執行其中的clean這個task,可以看出整個build文件夾都被清空了
gradlew assembleDebug :編譯一個debug版本,在output生成了debug apk:

Paste_Image.png

在buildType中自定義一個type:

Paste_Image.png

編譯dml這個版本:gradlew assembleDml,在output中生成了app-dml-unsigned.apk(這個apk和debug release用的同樣的代碼,只不過是未簽名的本質上和debug apk一樣):

Paste_Image.png
  • productFlavors

用于多渠道打包,例如新增proA和proB兩個product:

    productFlavors{
        proA{}
        proB{}
    }

執行編譯所有的release包:

Paste_Image.png

看下輸出:

Paste_Image.png

也可以利用productName編譯特定的產品apk。

  • dependencies

技巧:可以通過buildType或者productFlavors來差異化編譯依賴庫:

debugCompile(name: "$libName", ext: 'aar') //只在debug模式下才會編譯

由此可見,我們輕點一下run,背后其實就是執行了gradle腳本:assembleDebug,生成未簽名的apk。而編譯簽名包,也就是執行了有簽名文件gradle腳本:assembleRelease而已

Paste_Image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容