Gradle系列之基礎篇

定義

Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建開源工具,它使用一種基於Groovy的特定領域語言(DSL)來聲明項目設置, 項目配置簡單且任務擴展方便。java

構建工具的前世此生

Gradle 誕生前有兩個很是流行的自動化構建工具Ant和Maven,下列表格對比這兩個構建工具的優缺點:android

image

Gradle是基於Ant和Maven誕生的自動化構建工具,那麼它必需要同時擁有Ant和Maven的優點,也就是說Gradle具備以下特色:api

  • 包含依賴管理器,方便引用外部依賴庫
  • 具備默認的構建任務週期
  • 靈活的自定義構建邏輯

Gradle基礎

本節重點介紹下Gradle的基礎內容,包括運行機制和腳本內容的分析。bash

Gradle工做流程

Gradle 工做流程分爲三個階段,以下圖所示: 閉包

image

  • initialization
    Gradle初始化階段會到root工程根目錄找到setting.gradle文件,全部在該文件中聲明的工程均是Gradle自動化構建的工程
  • configure
    Gradle初始化事後就會根據setting.gradle中配置的全部工程目錄下找build.gradle文件,而後分析build.gradle文件,肯定須要執行的任務以及任務的順序
  • build 根據configure階段肯定的Task執行順序執行Task任務
腳本分析

Gradle有不少插件,這裏主要分析Android插件的腳本配置。app

setting.gradle工具

Setting.gradle中主要是聲明瞭哪些Gradle自動化構建的工程,內容以下所示:測試

include ':app', ':library1', ':library2’ 複製代碼

上面內容是包括三個Gradle工程,其中冒號能夠理解爲/,解釋爲構建工程的相對目錄gradle

根目錄build.gradleui

根目錄build.gradle是對全部Gralde工程均起做用的全局聲明,內容以下:

image

  • buildscript 該標籤是編譯腳本的做用域,也就是對Gradle的配置,其中repositories是Gradle構建腳本的倉庫聲明,其中dependencies也是Gradle構建腳本所須要的,這裏明顯是Android工程的Gradle構建工具
  • repositories 倉庫的意思,就是聲明依賴庫的地址,allprojects聲明的是全部Gradle工程中引用外部庫的地址,當有一些lib庫放在私有倉庫裏,須要在這裏面添加私有倉庫;其中buildscript中的聲明的是Gradle構建工具須要依賴的倉庫
  • task 這裏默認聲明瞭一個task,這個Task是用於刪除Gradle構建過程生成的文件,Task用法後面再具體說

Android工程build.gradle

Android 工程中的build.gradle文件內容重點是android標籤裏面的特殊配置項,這裏貼一個簡單的配置:

image

  1. apply plugin
    表示當前Gradle工程構建過程須要使用到的插件,其中com.android.application表示的是使用Android項目的構建過程,固然也能夠引用其它插件,前提是在root project的build.gradle中的buildscipt中的dependencises中配置,這裏因爲配置了com.android.tools.build:gradle因此能夠直接使用Android插件

  2. android
    這個是Android工程特有的配置項,這裏介紹一下幾個基本配置選項:

    compileSdkVersion: 編譯時使用的SDK版本
    buildToolsVersion: 編譯時使用的編譯工具的版本
    applicationId: 應用惟一標識
    buildTypes: 編譯類型,通常默認deubg和release兩種,能夠自定義

    Android裏面有不少配置選項,基本就能知足平常開發需求

  3. dependencies
    依賴標籤,主要是設置工程須要的外部庫,裏面有不少依賴方式,這個具體後面介紹

依賴

依賴主要是引用外部庫的過程,這裏須要說明兩點:倉庫以及依賴方式

  • 倉庫
    Gradle中倉庫聲明主要使用repositories,除了使用遠程倉庫,還可使用本地倉庫,如在工程中依賴aar時,就是使用的本地倉庫:
repositories {    
    flatDir {        
        dirs 'libs'   // aar目錄
      }
}
複製代碼

這裏是把本地libs目錄看成倉庫使用

  • 依賴
    依賴方式比較多,Gradle3.0後又對依賴方式進行了修改,這裏列出不一樣版本以及不一樣依賴方式之間的差異:
    image
    須要注意以下幾點:
  1. implementation和api主要差異是可見性,api的可見性更強
  2. 上面的依賴方式每每結合Flavor使用構建不一樣的Variant

依賴遠程庫文件主要由三部分構成: group Name version
以下所示:

image
Group:com.android.Support
Name:appcompat-v7
Version:25.1.0

Variant

Android 主要使用BuildType和Product Flavor構建多種Variant

  • BuildType
    BuildType默認有debug和release兩種:

    image
    BuildType構建類型其實頗有用,好比配置簽名,測試連接,以及混淆等,對平常測試開發頗有幫助,以下就定義了在不一樣的構建類型裏面定義了不一樣的訪問鏈接:
    image

  • Product Flavor
    Product Flavor表示不一樣特色的產品,例如APK打包發佈時須要發不到不一樣的應用市場,開發者須要設置不一樣渠道的渠道號,有的時候還須要針對不一樣渠道的產品定製特殊的圖標或者界面。

    1. 設置不一樣Product Flavor:
      上圖設置了不一樣的ProductFlavor,內容是不一樣渠道的渠道號,這樣在構建不一樣的產品時,渠道號就直接被修改了
    2. 生成不一樣的Product 源集
      定製特定的功能,能夠將功能獨立出來,而後根據不一樣的Product實現,生成不一樣的Product源集須要瞭解下列規則:
    • java文件:java文件須要在product具體包名下生成,不可在main中也生成,不然會出現類被定義2次的錯誤
    • drawable和layout文件:會直接覆蓋main源集中相同名稱的資源
    • value目錄文件:合併內容
    1. 構建Variant
      上述步驟是配置不一樣的Variant,當配置完成後,就能夠執行編譯命令,通常編譯的時候,會使用以下命令構建:
    ./gradlew assemble
    複製代碼

    該命令會構建全部的的Variant,且產物的數量爲BuildTypes x Product Flavor, 若是想要只構建某一個或者一類的Variant,能夠執行以下構建命令:

    ./gradlew assemble + Product Name(可選) + BuildTypes(可選)
    複製代碼
Task

Task是Gradle中一個很是重要的工具,經過使用Task能完成一些特定的需求,本節主要從如下三個方面說明:

  • Task使用
  • Task解析
  • Hook Task
Task使用

聲明Task有好幾種方式,下面展現一種直接定義的方式:

image
直接執行gradle命令運行:
image

這裏注意輸出:

Configure project:app
Hello world
複製代碼

其中在Hello Task中定義的內容在Configure階段就輸出了,這裏再看下Gradle執行流程:

image

若是想要在build task階段執行Task,能夠將task定義以下:

image
任務執行結果以下:
image
能夠看出這裏任務是在Task執行階段運行,這裏的<<符號表明doLast的意思,具體後面說明

Task解析

上面簡單說明了Task的使用,這裏主要解析一下Task。
Task內部定義了不少屬性和動做,本質上是一個定義了不少方法和屬性的接口,全部的方法都已經被DefaultTask實現了,因此在Gradle中使用Task都是基於DefalutTask來實現的。 每一個Task中都包含了一個Action對象的集合,這個動做都會被按照順序執行,動做爲doLast和doFirst方法,這裏舉一個簡單的例子:

image
這裏定義了一個Hello的Task,裏面聲明瞭不少doFirst和doLast的閉包,執行結果以下:
image
這裏說明一下:

  1. 沒有在閉包doLast和doFirst中定義的將會在Gradle的Configure階段執行
  2. 閉包doLast和doFirst在Gradle中的Build Task階段執行
  3. doLast和doFirst同種聲明從上往下優先級遞增

總結:
Task歸根結底是一個類,因此也能夠繼承task來完成一些特定動做,這裏不作自定義task的介紹,比較少用到,這裏主要介紹幾個經常使用的特定task,如copy,zip,delete,下面例舉刪除的task的使用:

image

HooK Task

Hook Task是指在項目構建的過程當中插入自定義任務,完成一些特定的需求,Hook的點有不少,主要能Hook兩個階段:

image
Configure階段和Build階段進行Hook,這裏簡單舉兩個例子,後面會在進階篇重點講解

  • Hook Configure階段

    image
    上面是在構建Task有向圖的時候忽略一些Task,這裏直接忽略AndroidTest任務

  • Hook Build階段

    image
    這裏是對編譯的產物進行處理

總結

本篇主要從總體上介紹一下Gradle,重點要理解Gradle的執行流程,以及build.gradle文件中的配置做用已經做用範圍,下一篇將重點介紹Gradle在Android中比較高級的用法。

相關文章
相關標籤/搜索