Gradle系列之三 Gradle概述以及生命週期
1 Gradle是一種程式設計框架
gradle主要由以下三部分組成
- 1 groovy核心語法
- 2 build script block
- 3 gradle api
注:本章所有的程式碼都在 https://github.com/jiulu313/gradledemo.git
如下圖
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是很重要的概念,下面是官方的文件