Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建開源工具,它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置, 項目配置簡單且任務擴展方便。java
Gradle 誕生前有兩個很是流行的自動化構建工具Ant和Maven,下列表格對比這兩個構建工具的優缺點:android
Gradle是基於Ant和Maven誕生的自動化構建工具,那麼它必需要同時擁有Ant和Maven的優點,也就是說Gradle具備以下特色:api
本節重點介紹下Gradle的基礎內容,包括運行機制和腳本內容的分析。bash
Gradle 工做流程分爲三個階段,以下圖所示: 閉包
Gradle有不少插件,這裏主要分析Android插件的腳本配置。app
setting.gradle工具
Setting.gradle中主要是聲明瞭哪些Gradle自動化構建的工程,內容以下所示:測試
include ':app', ':library1', ':library2’ 複製代碼
上面內容是包括三個Gradle工程,其中冒號能夠理解爲/,解釋爲構建工程的相對目錄gradle
根目錄build.gradleui
根目錄build.gradle是對全部Gralde工程均起做用的全局聲明,內容以下:
Android工程build.gradle
Android 工程中的build.gradle文件內容重點是android標籤裏面的特殊配置項,這裏貼一個簡單的配置:
apply plugin
表示當前Gradle工程構建過程須要使用到的插件,其中com.android.application表示的是使用Android項目的構建過程,固然也能夠引用其它插件,前提是在root project的build.gradle中的buildscipt中的dependencises中配置,這裏因爲配置了com.android.tools.build:gradle因此能夠直接使用Android插件
android
這個是Android工程特有的配置項,這裏介紹一下幾個基本配置選項:
compileSdkVersion: 編譯時使用的SDK版本
buildToolsVersion: 編譯時使用的編譯工具的版本
applicationId: 應用惟一標識
buildTypes: 編譯類型,通常默認deubg和release兩種,能夠自定義
Android裏面有不少配置選項,基本就能知足平常開發需求
dependencies
依賴標籤,主要是設置工程須要的外部庫,裏面有不少依賴方式,這個具體後面介紹
依賴主要是引用外部庫的過程,這裏須要說明兩點:倉庫以及依賴方式
repositories {
flatDir {
dirs 'libs' // aar目錄
}
}
複製代碼
這裏是把本地libs目錄看成倉庫使用
依賴遠程庫文件主要由三部分構成: group Name version
以下所示:
Android 主要使用BuildType和Product Flavor構建多種Variant
BuildType
BuildType默認有debug和release兩種:
Product Flavor
Product Flavor表示不一樣特色的產品,例如APK打包發佈時須要發不到不一樣的應用市場,開發者須要設置不一樣渠道的渠道號,有的時候還須要針對不一樣渠道的產品定製特殊的圖標或者界面。
./gradlew assemble
複製代碼
該命令會構建全部的的Variant,且產物的數量爲BuildTypes x Product Flavor, 若是想要只構建某一個或者一類的Variant,能夠執行以下構建命令:
./gradlew assemble + Product Name(可選) + BuildTypes(可選)
複製代碼
Task是Gradle中一個很是重要的工具,經過使用Task能完成一些特定的需求,本節主要從如下三個方面說明:
聲明Task有好幾種方式,下面展現一種直接定義的方式:
這裏注意輸出:
Configure project:app
Hello world
複製代碼
其中在Hello Task中定義的內容在Configure階段就輸出了,這裏再看下Gradle執行流程:
若是想要在build task階段執行Task,能夠將task定義以下:
上面簡單說明了Task的使用,這裏主要解析一下Task。
Task內部定義了不少屬性和動做,本質上是一個定義了不少方法和屬性的接口,全部的方法都已經被DefaultTask實現了,因此在Gradle中使用Task都是基於DefalutTask來實現的。 每一個Task中都包含了一個Action對象的集合,這個動做都會被按照順序執行,動做爲doLast和doFirst方法,這裏舉一個簡單的例子:
總結:
Task歸根結底是一個類,因此也能夠繼承task來完成一些特定動做,這裏不作自定義task的介紹,比較少用到,這裏主要介紹幾個經常使用的特定task,如copy,zip,delete,下面例舉刪除的task的使用:
Hook Task是指在項目構建的過程當中插入自定義任務,完成一些特定的需求,Hook的點有不少,主要能Hook兩個階段:
Hook Configure階段
Hook Build階段
本篇主要從總體上介紹一下Gradle,重點要理解Gradle的執行流程,以及build.gradle文件中的配置做用已經做用範圍,下一篇將重點介紹Gradle在Android中比較高級的用法。