Android Gradle Get Start

簡(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打包流程

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)題,歡迎指正。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 說(shuō)明 本文主要介紹和Gradle關(guān)系密切、相對(duì)不容易理解的配置,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    搬磚的小明閱讀 16,176評(píng)論 1 62
  • 在 Android Studio 構(gòu)建的項(xiàng)目中,基于 Gradle 進(jìn)行項(xiàng)目的構(gòu)建,同時(shí)使用 Android DS...
    Ant_way閱讀 7,603評(píng)論 0 16
  • 這一章主要針對(duì)項(xiàng)目中可以用到的一些實(shí)用功能來(lái)介紹Android Gradle,比如如何隱藏我們的證書(shū)文件,降低風(fēng)險(xiǎn)...
    acc8226閱讀 7,978評(píng)論 3 25
  • 說(shuō)在前面:Gradle中project是非常重要的,所以也會(huì)有非常多的API及其可配置的屬性,筆者也有許多不了解的...
    ywy_袁滾滾閱讀 20,128評(píng)論 2 29
  • http://www.itdecent.cn/p/7c288a17cda8 總的來(lái)說(shuō),Android的系統(tǒng)體系結(jié)...
    燕京博士閱讀 1,429評(píng)論 0 6

友情鏈接更多精彩內(nèi)容