再探Gradle

首先經過文章咱們將能學習到什麼?編程

總結

  1. 首先要了解gradle是什麼,能作什麼(必定要從編程框架的角度去了解)
  2. 瞭解gradle和maven、ant之間的區別以及它的優點
  3. 瞭解gradle的生命週期

下面根據總結的內容開始講述api

gradle的基本概念

Gradle是一個基於Apache Ant和Apache Maven概念的項目自動化構建開源工具。
Gradle不只僅是一個工具,擁有本身的groovy語法,更擁有gradle api,此時不就更是一個編程框架的體現了嘛?
咱們經過下圖來了解下gradle的基本組成部分bash

因此,學好groovy語法是學好gradle的核心。

gradle的優點

  1. 靈活性
    Maven、Ant構建程序的時候沒法修改構建的過程,也就是工具給咱們提供了什麼,咱們就只能用什麼,可是Gradle不同,以Android開發爲例,咱們在建構apk包的時候,能夠經過構建gradle腳本在程序編譯執行的時候修改apk的包名,可是Maven或者Ant只能在構建完成後才能夠進行修改操做。
  2. 粒度性
    在使用Maven或者是Ant構建程序的時候,源代碼和腳本是獨立的,並且咱們也不知道工具內部作了什麼,就打包生成了apk。
    可是gradle就不一樣了,gradle資源的編譯、源代碼的編譯到生成apk,都是經過執行一個個Task任務生成的(且這些Task內部源碼都是開源的,若是想了解Gradle的執行過程的話,是能夠經過查看Task源碼來進行學習的),最後打包生成apk的全部邏輯,並且整個生成的過程都是能夠經過改變Task任務動態改變的,Tinker就是如此。
  3. 擴展性
    Gradle支持插件機制,能夠直接複用已有的插件。
  4. 兼容性
    Gradle不只僅擁有本身優點,而且還集成了Maven和Ant的功能,吸收了全部的構建工具的長處

總結:gralde相比於其餘工具備很是多的優點,最核心的緣由是由於Gradle是一個編程框架,固然要比xml配置要強大的多

gradle執行流程(生命週期)

一、生命週期的介紹
首先咱們來看一個命令的執行過程,以mac系統爲例框架

./gradlew clean

./gradlew build
複製代碼

執行過程分析:
一、首先短暫的Loading階段
二、而後執行一段時間的Configuring階段
三、執行完Configuring後再真正執行clean或者build操做maven

今日問答

Q1:在執行的時候,爲何會有前面兩步操做?
A1:loading和configuring其實就是gradle生命週期中的前兩個工具

Q2:爲何執行build操做的時候又執行了不少其餘的命令
A2:在執行clean或者是build操做的時候,其實就是在執行gradle中的Task任務,而Task之間有依賴性,因此必須將其餘依賴的Task的任務先執行完成再執行自身的Task,因此咱們在控制檯就會看到很大一堆的命令輸出了學習

下面咱們用一張圖來理解上面的執行的過程gradle

一、Loding階段也就是初始化階段(Initialization),也就是執行項目中的setting.gradle文件,解析該項目中的全部module,並構建出對應的project對象。ui

二、onfiguring就是配置階段(Configration),該階段就是解析每一個module中的build.gradle文件中的配置信息,在①和②執行的過程當中咱們能夠添加一個Hook,固然這個是經過API來進行操做的。this

三、最後就是執行階段,上面的兩步是第三步執行的前提條件,也就是執行咱們最終的clean、build命令操做。你在gradle命令中指定的Task任務,gradle就會將這個Task任務鏈上的全部任務所有按依賴順序執行一遍。

如今咱們最後來總結下爲何在build的任務的時候會輸出不少東西,見下圖

如圖所見,咱們執行build任務的時候,首先依賴了check和assemble任務,而他們又依賴了其餘的任務,因此最終在控制檯看到的時候就輸出了一大堆的東西

二、生命週期監聽
常見的監聽方法

//常見的一組 
/** *配置階段開始前的監聽回調 **/
this.beforeEvaluate {
     println '配置階段執行開始執行'
}
/** *配置階段完成後的監聽回調 **/
this.afterEvaluate {
   println '配置階段執行完成'
}
/** *gradle執行完成後的回調監聽 **/
this.gradle.buildFinished {
     println '執行階段執行完成'
}

//另一組
this.gradle.beforeProject {}
this.gradle.afterProject {}
this.gradle.buildFinished {}

//另一組
this.gradle.addListener()
this.gradle.addBuildListener()
this.gradle.addProjectEvaluationListener()
複製代碼

當前,咱們以前提到了初始化的過程,那個咱們也能夠在setting.gradle文件中添加以下打印語句

println '初始化階段開始執行'
複製代碼

經過添加上面的代碼後,咱們執行

./gradlew clean
複製代碼

獲得結果

經常使用的監聽方式就是使用第一種方式,在此咱們瞭解生命週期是頗有必要的,正如咱們學習Activity的時候須要瞭解它的生命週期同樣,順便問一句,大家還記得Activity的生命週期流程嗎?
相關文章
相關標籤/搜索