1. 程式人生 > >Gradle系列之三 Gradle概述以及生命週期

Gradle系列之三 Gradle概述以及生命週期

1 Gradle是一種程式設計框架

gradle主要由以下三部分組成

  • 1 groovy核心語法
  • 2 build script block
  • 3 gradle api

如下圖

2 Gradle的優勢

  • 1 更加的靈活,因為gradle是程式設計框架,所以功能要強大的多
  • 2 粒度性上,原始碼的編譯,資源的編譯,都是一個一個Task的,我們可以修改task來達到精細控制上
  • 3 擴充套件性上,gradle有外掛機制

以上所有的優勢其實全因為Gradle是一種程式設計框架

3 Gradle的生命週期

Gradle生命週期分為三個部分,如下:

  • 1 初始化階段: 解析整個工程中所有Project,構建所有的Project對應的project物件,這個階段主要就是解析setting.gradle檔案
  • 2 配置階段:解析所有的projects物件中的task,構建好所有的task拓撲圖,主要解析各個project下的build.gradle檔案
  • 3 執行階段:執行具體的的task及其依賴task 如下圖

4 Gradle的生命週期的監聽

在root build.gradle中,新增如下程式碼

/**
 * 配置階段開始前的監聽回撥
 */
this.beforeEvaluate {
    println '配置階段開始111...'
}

/**
 * 配置階段後的監聽回撥
 */
this.afterEvaluate {
    println '配置階段執行完畢222...'
}

/**
 * gradle執行完畢後的回撥
 */
this.gradle.buildFinished {
    println '執行階段執行完畢...'
}


//等同於 beforeEvaluate
this.gradle.beforeProject {

}

//等同於 afterEvaluate
this.gradle.afterProject {
    println '配置階段執行完畢333...'
}

然後執行 ./gradlew build,就會輸出相應的log

5 Project詳解

在gradle中,project就好像是android中的activity一樣,經常使用,所以project概述是一個很重要的概念

在android工程中,所有的lib,module都是一個project

檢視所有的project

./gradlew projects
//輸出如下
------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'gradledemo'
+--- Project ':app'
+--- Project ':mylib'
+--- Project ':test'
\--- Project ':utils'

可以看到當前工程下有5個 proejct,其中有一個根 project,剩下的4個是子project,可以看到project是樹的結構,根project的作用就是用來管理子project 如何管理呢?就是通過相應的api進行管理,後面有講到。每個project都對應一個輸出

每個project都有一個build.gradle檔案,build.gradle檔案也是project的標識

5.1 Project核心api

  • 1 gradle 生命週期api
  • 2 project相關api
  • 3 task相關api
  • 4 屬性相關api
  • 5 file相關api
  • 6 其它api

在gradle中,一個build.gradle檔案會被編譯成proejct位元組碼,所以在build.gradle中編寫的所有的程式碼相當於都是在proejct中類內部編寫的

輸出所有的proejct

//在根project下的build.gradle中,獲取所有的project,新增如下程式碼

//呼叫方法
getProjects()

//獲取所有的project
def getProjects(){
    println '------------'
    println 'Root Project'
    println '------------'

    //getAllprojects()返回所有的Project的set集合
    this.getAllprojects().eachWithIndex { Project project, int index ->
        if(index == 0){
            println "Root protject :'${project.name}'"
        }else{
            println "+--- project '${project.name}'"
        }
    }
}

//執行 ./gradlew clean,輸出如下:
------------
Root Project
------------
Root protject :'gradledemo'
+--- project 'app'
+--- project 'mylib'
+--- project 'test'
+--- project 'utils'

輸出所有的子project

//在根project的build.gradle中,輸出所有的子prject
//列印所有的子project
getAllSubprojects()

def getAllSubprojects(){
    getSubprojects().each { project ->
        println "---- ${project.name}"
    }
}

//輸出
---- app
---- mylib
---- test
---- utils

獲取父project的名字

//獲取根project的名字,在根project中呼叫返回null,在子project下呼叫打印出父project的名字
getParentProjectName()

def getParentProjectName(){
    def project = getParent()
    if(project != null ){
        println "父project的名字是: " + project.name
    }else {
        println '沒有父project'
    }
}

獲取根project的名字

getRootPro()
def getRootPro(){
    println "根project的名字是:" + getRootProject().name
}

//執行 ./gradlew clean ,輸出:
根project的名字是:gradledemo

在根project對子project進行配置

/**
 * 可以在根project下對所有的子project進行配置,如下程式碼
 * 任何在子project中的build.gradle檔案中可以配置的東西
 * 都可以在下面的程式碼中進行配置
 */

project("app") {
    apply plugin: 'com.android.application'
    group 'com.zhj'
    version '1.0.0'

    dependencies {

    }

    android {

    }
}


project('mylib') {
    apply plugin: 'com.android.library'
    group 'com.zhj'
    version '1.1.1'
    dependencies {

    }
}

為所有的project進行統一的配置

/**
 * 配置當前結點工程和它的所有的所有的subproject
 * 比如將所有的project的group配置為 'com.zhj'
 */
allprojects {
    repositories {
        google()
        jcenter()
    }

    group 'com.zhj'
}

//測試在allprojects中配置的group屬性
println "test工程的group是 : " + project('test').group

//輸出
test工程的group是 : com.zhj

只對子project進行配置

/**
 * 和allprojects不同的是,subprojects不包括當前工程,只包括子project
 */
subprojects { Project project ->
    if(project.hasProperty('com.android.library')){
        //將庫工程編譯的庫上傳到maven中
    }
}

gradle 中對project的管理是以樹的形式進行管理的,根project主要就是對子Project進行管理,可以查詢,可以獲取所有的子project,同時在子project中也可以獲取根proejct或者父project的資訊。同時,一個project對應於一個build.gradle檔案,build.gradle檔案也是判斷是不是project的標誌。project是很重要的概念,下面是官方的文件