1. 程式人生 > 其它 >ant構建專案遷移到gradle_你真的瞭解Gradle麼?

ant構建專案遷移到gradle_你真的瞭解Gradle麼?

技術標籤:ant構建專案遷移到gradle

be28c404f1849ce6e64ce7007d7f750d.gif

談起Gradle,那是Android工程預設的構建工具,在Android小夥伴之間可謂是無人不知,無人不曉。但是,真正理解Gradle的人卻不多。下面,小亭就和您聊聊Gradle比ant、maven等傳統構建工具好在哪兒,以及Gradle是個什麼東東,包括哪些內容。是您對Gradle構建工程有個整體的把握和理解。

d3a9dadb81a884cd84c764a85c00b9bd.png


Gradle與ant、maven的區別?

Gradle比ant、maven強大很多。ant和maven是XML配置。Gradle使用Groovy這種程式語言,所以可程式設計,更加靈活。因為是程式語言,所以可以開發外掛,有很多第三方外掛庫。


Gradle執行流程

Gradle的執行流程包括三部分:初始化、配置、執行。

初始化:解析所有project,構建project物件。執行settings.gradle檔案。

配置:解析所有project中的task,構建Task拓撲圖。

執行:執行所有task。

執行流程監聽:如果我們要監聽Gradle的執行流程,並在相應時機插入我們的處理邏輯,就需要以下這些介面。

beforeEvalueate {} 或者 gradle.beforeProject {} // 配置階段之前執行

afterEvaluate {} 或者 gradle.afterProject {} // 配置階段之後執行

gradle.buildFinished {} // 執行階段之後執行

gradle.addListener // 增加自定義監聽


Gradle組成

Gradle的組成包括三部分:Groovy、構建指令碼塊、Gradle api

Groovy語言是Gradle使用的程式語言,可程式設計,靈活方便。

構建指令碼塊:就是說我們要執行什麼功能,就要使用Groovy語言寫指令碼塊。

Gradle api是Gradle給我們提供的一套方便我們對構建過程進行程式設計處理的api。


Gradle API

包括project、task、屬性、file、gradle生命週期、其他。

Project

一個build.gradle對應一個Project物件。

Task

我們可以編寫Task,使其在Gradle執行的特定時間執行我們的邏輯。

定義:

task hello(group: ‘hello’, description:’hello task’) {
println ‘hello task!’ // 配置階段執行
doFirst {
println ‘the task group is:’ + group // 執行階段執行
}
}

示例:統計打包時長

def startBuildTime, endBuildTime
this.afterEvaluate { Project project ->
// 保證要找的task已經配置完畢
def preBuildTask = project.tasks.getByName(‘’preBuild)
preBuildTask.doFirst {
startBuildTime = System.currentTimeMillis()
}
def buildTask = project.tasks.getByName(‘build’)
buildTask.doLast {
endBuildTime = System.currentTimeMillis()
println “The build time is: ${endBuildTime - startBuildTime}”
}
}

延伸:我們可以根據統計出來的打包時長,刪除一些測試task,來優化構建時間。

task的執行順序:

構建一個apk需要用到好多task,那麼這些task哪個先執行,哪個後執行就是由task的執行順序決定的。

task task1 {
doLast {
println ’task1‘
}
}

task task2 {
doLast {
println ’task2‘
}
}

task task3(dependsOn: [task1, task2]) { // dependsOn還可以在閉包中寫
doLast {
println ’task3‘
}
}

task的輸入輸出:

task writeTask { //為Task指定輸入
inputs.property(‘versionCode’, this.versionCode)
inputs.property(‘versionName’, this.versionName)
//為Task指定輸出
outputs.file destFile
doLast {
def data = inputs.getProperties()
File file = outputs.getFiles().getSingleFile()
//將map轉化為實體物件
def versionMsg = new VersionMsg(data)
def stringWriter = new StringWriter()
def xmlBuilder = new MarkupBuilder(stringWriter)
if (file.text != null && file.text.size() <= 0) {
//檔案中沒有內容
xmlBuilder.releases {
release {
versionCode(versionMsg.versionCode)
versionName(versionMsg.versionName)
}
}
file.withWriter {writer -> writer.append(stringWriter.toString())}
}
}
}

將自定義Task掛接到構建過程中:

this.project.afterEvaluate { project ->
def buildTask = project.tasks.getByName(‘build’)
if (buildTask == null) {
throw GradleException(‘The build task is not found’)
}
buildTask.doLast {
writeTask.execute()
}
}

Settings

一個settings.gradle檔案對應一個Settings物件。gradle的初始化過程就是在執行這個檔案。

SourceSet

作用是對Gradle預設約定的檔案位置進行修改。Gradle要求約定大於配置,就是說如果我們沒有修改配置,那就按照預設的約定來。比如:從java資料夾下獲取原始碼,從res資料夾下獲取資源。但是,我們可以通過SourceSet修改程式碼、資源等的位置。

android {
……
sourceSets {
main {
jniLibs.srcDirs = [‘libs’] // 修改so庫存放位置
res.srcDirs = [‘src/main/res’,
‘src/main/res-ad’,
‘src/main/res-pay’] // 修改資源存放位置
}
}
}

外掛

1、定義外掛類

class ExamplePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
println ‘Hello ’ + project.name
project.extensions.create(‘自定義別名’, 自定義類)
}
}

自定義Task類要繼承自DefaultTask類。

class ExampleTask extends DefaultTask {
ExampleTask() {
group = ‘amy’
description = ‘example’
}

// 在gradle執行階段執行的程式碼
@TaskAction
void doAction() {
......
}
}

2、在配置檔案中指定外掛類

3、在build.gradle檔案中加入

apply plugin: ‘外掛名’

自定義別名 {
……
}

Android及Java外掛對Gradle的擴充套件

Android對Gradle的擴充套件主要是配置變體,在

android {
......
}

配置指令碼塊中的設定都是對變體的設定。我們也可以通過拿到Android工程的變體來獲取這些資訊。

Java對Gradle的擴充套件相比Android簡單很多,主要是打jar包一類的功能。


好了,以上就是Gradle的內容,通過上面的介紹,相信您對Gradle已經有了一個大致的瞭解。後續,我應該還會寫一個介紹構建apk所有task流程的文章,敬請各位小夥伴們期待吧。

圖片和內容源自網路分享,若有侵權,請聯絡刪除!

上海艾磊科技有限公司專門為企業提供IT諮詢,IT外包,系統整合,以及各類IT增值服務。其中增值服務包括OFFICE 365雲服務,鼎捷企業ERP管理軟體,雲備份,企業郵箱,無線覆蓋,上網行為管理,v*n架設,網路安全服務,INTERNET接入,裝置租賃, IP電話服務

3d6d96a8ad9d66cf2fb6ee5abec3688c.png