ant構建專案遷移到gradle_你真的瞭解Gradle麼?
技術標籤:ant構建專案遷移到gradle
談起Gradle,那是Android工程預設的構建工具,在Android小夥伴之間可謂是無人不知,無人不曉。但是,真正理解Gradle的人卻不多。下面,小亭就和您聊聊Gradle比ant、maven等傳統構建工具好在哪兒,以及Gradle是個什麼東東,包括哪些內容。是您對Gradle構建工程有個整體的把握和理解。
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電話服務