簡(jiǎn)介
什么是gradle
Gradle其實(shí)是一套平臺(tái)和規(guī)范,為打包提供的規(guī)范。而Android的打包,是Google寫(xiě)的一個(gè)Gradle插件。
gradle在做什么
編譯好的代碼,只是一堆散裝的.jar 、.so 、.xml文件。要將它們以正確的目錄結(jié)構(gòu),合并成一個(gè)apk。
所以,通常在gradle中,我們需要根據(jù)工程結(jié)構(gòu)配置路徑,然后配置工程信息,并干預(yù)合成apk的過(guò)程。
Gradle的生命周期
初始化
Gradle可以構(gòu)建一個(gè)和多個(gè)項(xiàng)目。在初始化階段,Gradle會(huì)確定哪些項(xiàng)目參與構(gòu)建,并且為這些項(xiàng)目創(chuàng)建一個(gè)Project實(shí)例。
此時(shí),settings.gradle會(huì)被執(zhí)行。settings.gradle中會(huì)包含:
include ':app'
include ':xxx'
include ':xx2'
監(jiān)聽(tīng)
gradle.buildStarted{
println "【settings.gradle】 初始化執(zhí)行開(kāi)始"
}
gradle.settingsEvaluated {
println "【settings.gradle】 初始化執(zhí)行結(jié)束"
}
gradle.projectsLoaded {
println '【settings.gradle】初始化結(jié)束'
}
gradle.addBuildListener(new BuildListener() {
@Override
void buildStarted(Gradle gradle) {
println '【settings.gradle】 初始化執(zhí)行開(kāi)始'
}
@Override
void settingsEvaluated(Settings settings) {
println '【settings.gradle】 初始化執(zhí)行結(jié)束'
}
@Override
void projectsLoaded(Gradle gradle) {
println '【settings.gradle】初始化結(jié)束'
}
})
配置
執(zhí)行build.gradle:
println 'build.gradle的配置階段'
// 調(diào)用Project的dependencies(Closure c)聲明項(xiàng)目依賴
dependencies {
// 閉包中執(zhí)行的代碼
println 'dependencies中執(zhí)行的代碼'
}
// 創(chuàng)建一個(gè)Task
task test() {
println 'Task中的配置代碼'
// 定義一個(gè)閉包
def a = {
println 'Task中的配置代碼2'
}
// 執(zhí)行閉包
a()
doFirst {
println '這段代碼配置階段不執(zhí)行'
}
}
輸出結(jié)果:
build.gradle的配置階段
dependencies中執(zhí)行的代碼
Task中的配置代碼
Task中的配置代碼2
我是順序執(zhí)行的
:buildEnvironment
我們可以看到配置階段,會(huì)執(zhí)行build.gradle中包括依賴,task配置等代碼。但不會(huì)執(zhí)行task中doFirst,doLast的內(nèi)容。
最終,配置階段結(jié)束后,會(huì)形成Task依賴拓樸圖,這個(gè)圖是一個(gè)有向無(wú)環(huán)圖。
監(jiān)聽(tīng)
gradle. beforeEvaluate{
println 'build.gradle 配置執(zhí)行開(kāi)始'
}
gradle. afterEvaluate {
println 'build.gradle 配置執(zhí)行結(jié)束'
}
gradle.addBuildListener(new BuildListener() {
@Override
void beforeEvaluate(Gradle gradle) {
println '配置執(zhí)行開(kāi)始'
}
@Override
void afterEvaluate(Gradle gradle) {
println '配置執(zhí)行結(jié)束'
}
})
除此之外,還有gradle.projectsEvaluated,gradle.taskGraph.whenReady兩個(gè)回調(diào),就不寫(xiě)代碼了。
執(zhí)行
Gradle為在配置階段創(chuàng)建和配置的任務(wù)再次篩選需要執(zhí)行的任務(wù)的子集,這個(gè)子集的篩選是由在命令行下傳遞給Gradle的任務(wù)名和目錄決定的,子集中的每個(gè)任務(wù)都會(huì)被執(zhí)行。
監(jiān)聽(tīng)
每個(gè)任務(wù)在執(zhí)行時(shí),都會(huì)
gradle.taskGraph.beforeTask,gradle.taskGraph.afterTask當(dāng)整個(gè)gradle構(gòu)建完成時(shí),會(huì)回調(diào)gradle.buildFinish。
apk打包流程

小結(jié)
在Android開(kāi)發(fā)中,很多情況下,我們的邏輯并不能寫(xiě)在代碼中。因?yàn)闊o(wú)用的分支和資源,將產(chǎn)生額外的APK大小。我們應(yīng)該將一部分不依賴網(wǎng)絡(luò)的業(yè)務(wù)邏輯,放在編譯期完成,根據(jù)需要打出不同的APK包。
所有編譯期的工作,就是由Gradle來(lái)完成的。我們可以根據(jù)需要,通過(guò)Gradle配置不同的資源和邏輯。甚至可以通過(guò)Gradle Transform修改.class到.dex的邏輯。
未來(lái)的Android開(kāi)發(fā),會(huì)越來(lái)越傾向于,以SDK作為零件,項(xiàng)目則主要進(jìn)行組裝。Gradle就是這個(gè)組裝過(guò)程的核心技術(shù)。所以學(xué)好Gradle對(duì)Android開(kāi)發(fā)來(lái)說(shuō),還是非常重要的。
如有問(wèn)題,歡迎指正。