敞开生长之旅!这是我参加「日新方案 12 月更文应战」的第3天,点击查看活动概况

详解Gradle构建进程

Gradle是项目构建东西,是Google官方推荐的Android项目编译东西。构建东西是可以让开发者以可履行和有序的使命来表达自动化的需求。便是将源代码生成可履行程序

Gradle构建进程

详解Gradle构建过程

根据在上图中所示,Gradle 的构建进程首要分为三个阶段:

  • 初始化阶段

  • 装备阶段

  • 履行阶段

监听Gradle初始化机遇

在这个初始化阶段中首要有两个机遇需求重视:

setting.gradle 履行结束的监听

//1.setting.gradle 履行结束的监听
gradle.settingsEvaluated {
    println "settings.gradle 初始化履行结束"
}

参加构建的Project目标创立结束的监听

//2.参加构建的Project目标创立结束的监听
gradle.projectsLoaded {
    Gradle gradle ->
        println "settings.gradle 一切在 settings 中 include 的 Project 都创立完成了"
}

监听Gradle装备阶段机遇

在 settings.gradle 中可以装备需求参加构建的 project ,并且在初始化阶段就现已创立好对应的 project 实例了。
Gradle 的装备阶段便是履行每一个 Project 对应的 build.gradle 的装备代码。

下面相关的API是关于装备的回调:

gradle.beforeProject

表明对每一个 project 在履行装备代码之前都会回调这个方法。

gradle.beforeProject {
    Project project ->
        println ">>>>>>>>gradle beforeProject " + project.name + " 装备开端前回调"
}

project.beforeEvaluate

当时 project在履行装备代码之前的回调

经过 gradle.afterProject 和 project.afterEvaluate 是差不多一下的。

this.afterEvaluate {
    project ->
        println project.name + " 装备结束监听"
}

gradle.projectsEvaluated

表明一切的 project 都履行完对应的 build.gradle 的装备代码,预备要去生成对应的 Task 依靠图。

gradle.projectsEvaluated {
    gradle ->
        println "一切的project都装备结束了,预备生成Task依靠联系"
}

gradle.taskGraph.whenReady

表明 “task 依靠联系现已生成”

gradle.taskGraph.whenReady {
    TaskExecutionGraph graph ->
        println "task 依靠联系现已生成"
}

监听Gradle履行阶段机遇

Gradle 在装备阶段中会履行每一个 project 的 build.gradle 的装备代码,并且终究生成每一个 Task 使命的依靠联系。下面到了履行阶段就会根据这个依靠联系去履行对应的 Task 使命。

gradle.taskGraph.beforeTask

每一个 Task 使命履行之前回调

gradle.taskGraph.beforeTask {
    Task task ->
        println "Project[${task.project.name}]--->Task[${task.name}] 在履行之前被回调"
}

gradle.taskGraph.afterTask

每一个 task 履行之后被回调

gradle.taskGraph.afterTask {
    task, TaskState taskState ->
        //第二个参数表明 task 的状况,是可选的参数
        println "Project[${task.project.name}]--->Task[${task.name}] 在履行结束,taskState[upToDate:${taskState.upToDate},skipped:${taskState.skipped},executed:${taskState.executed},didWork:${taskState.didWork}]"
}

Gradle 构建履行结束的回调

gradle.buildFinished

当一切的使命履行结束的回调

gradle.buildFinished {
    BuildResult buildResult ->
        println "构建结束"
}

核算 build 使命的履行时长

在 Android 中 build 的履行是最为复杂,也是履行时刻最久的一个 Task ,因为 build 这个使命依靠了许多其他的使命,第一个被依靠的使命是 preBuild ,因而我们期望在 preBuild 履行之前记载当时的时刻戳taskStartTime,在 build 履行结束之后记载当时的时刻戳taskEndTime,然后核算两个时刻戳的差值便是 build 使命的履行时长啦。

下面是具体的步骤:

  • 经过 project(“:app”) 对 app module 独自装备。
  • 经过 project.afterEvaluate 监听 project 装备结束。
  • 经过 getBuildTask 获取 preBuild 和 build 两个使命目标。
  • 监听 preBuild.doFirst 得到开端履行的时刻戳。
  • 监听 build.doLast 得到履行结束的时刻戳。
  • 最终得到两个时刻戳的差值便是该使命的履行市场。
  • 履行 build 使命。
//装备 app module
project(":app") {
    Project project ->
        project.afterEvaluate {
            //获取build task 使命
            Task buildTask = getBuildTask(project, ":app:build")
            //获取 preBuild 使命
            Task preBuildTask = getBuildTask(project, ":app:preBuild")
            def taskStartTime = 0
            def taskEndTime = 0
            //在preBuild task 中追加一个监听获取在preBuild履行之前的时刻戳的 action 
            preBuildTask.doFirst {
                taskStartTime = System.currentTimeMillis()
            }
            //在build task 中追加一个监听获取履行结束的时刻戳的 action 
            buildTask.doLast {
                taskEndTime = System.currentTimeMillis()
                println "build task 履行时刻:${taskEndTime - taskStartTime}"
            }
        }
}
/**
 * 获取该project对应的build使命
 * @param project
 * @return
 */
Task getBuildTask(Project project, String taskPath) {
    //获取该project办理task的容器
    TaskContainer taskContainer = project.getTasks()
    //拿到build的Task目标
    Task buildTask = taskContainer.getByPath(taskPath)
    return buildTask
}

履行build使命

./gradlew build

以上便是详解Gradle构建进程