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构建过程的详细内容,更多关于Gradle构建过程的资料请关注Devmax其它相关文章!

详解Gradle构建过程的更多相关文章

  1. android – 使用Gradle构建本机代码时会删除符号

    )或者我错过了什么?解决方法符号位于:src/main/obj/local所以添加到build.grade:然后转到DebugConfiguration->调试器并添加到Symbol目录:应用程序/建立/中间体/jniLibs之后我能够调试我的本机代码.

  2. Android studio – Faild to resolve:com.android.support:design:26.0.1错误

    我有一个错误叫:我的androidstudio版本是3.0beta1.我的gradle文件如下:我想把“设计”放到我的项目中,但我不能这样做.我该怎么做?解决方法尝试改变和或者不要更改为bulidToolsversion更改依赖项

  3. android-studio – IDEA中Gradle自动完成的位置在哪里?

    解决方法对于Groovy插件,它可能是Cucumber.我知道Gradle使用Groovy的一些技术和语法,所以我尝试在第一次尝试时安装一些Groovy插件并取得成功.安装此插件的步骤:>在MacOS上:首选项…

  4. Android L上片段的Lint错误:“此方法不会覆盖任何内容”

    klwQWQ6Z!

  5. 在Android中启用MultiDex支持以在Eclipse中实现65K方法

    我正在尝试在eclipse中构建Multidexapk,但无法成功.我尝试了以下步骤,在Android应用程序中配置Multidex支持:>我已将位于/extras/android/support/multidex/的Multidex库添加到我的项目中.>由于我的应用程序具有自定义应用程序类,我已将android.support.multidex.MultiDexApplication类扩展到我的

  6. Android Studio导入模块Gradle构建错误

    我试图在AndroidStudio(GameBaseUtils)中添加一个目录作为依赖项.我已经看到其他SO答案只是为他们的特定问题发布正确的gradle配置,但是我不明白我如何能够根据我的情况调整他们的答案.这是我做的:第一步:文件–>导入模块–>导航到目录并选择它.第二步–文件–>项目结构–>模块–>选择我的应用程序–>依赖关系–>将模块添加为我的项目的依赖项.现在我的代码没有任何红线表示导入

  7. Android Studio 3.0 – 对于externalNativeBuild,Gradle Sync失败

    当我迁移到Androidstudio3.0时,我得到以下回溯我的build.gradle就在这里.任何帮助深表感谢!

  8. android-gradle – Android espresso-contrib gradle build失败

    我正在尝试学习androidespresso..我遵循了一些基本的教程,它工作正常.但现在我想在android导航抽屉上做一些测试.为此,我需要使用gradle依赖androidTestCompile’com.android.support.test.espresso:espresso-contrib:2.2.2′,但它导致与其他依赖项冲突.我的gradle文件:错误是这样的:紧随其后:linkf

  9. android – 依赖项 – >无法创建’AppPlugin’类型的插件

    我正在尝试继续研究我的一个旧项目,它已经有一年的历史了,当时工作正常,但是现在我已经更新了AndroidStudio,它甚至无法构建.我收到一个错误,说我有两次相同的dex文件:为了解决这个问题,我可以简单地做’gradledependencies’来查找罪魁祸首,并排除故障文件,但这是我遇到实际问题的地方.当我’gradledependencies’时,我收到以下错误:这是我的完整build.g

  10. Android Studio:Gradle Build运行3分钟

    请提供有关如何解决此问题的任何建议.谢谢:)解决方法我发现了为什么会这样.这是因为我在onCreate函数()中解析XML,并且因为XML有70,000行,所以编译器需要很长时间.但是将文件移动到“assets”文件夹后,问题就解决了.这是我的错误,与gradle设置无关,但如果有人遇到类似的问题,我建议你尝试我上面列出的所有内容,你的gradle构建应该运行得更快.

随机推荐

  1. Flutter 网络请求框架封装详解

    这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. Android单选按钮RadioButton的使用详解

    今天小编就为大家分享一篇关于Android单选按钮RadioButton的使用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

  3. 解决android studio 打包发现generate signed apk 消失不见问题

    这篇文章主要介绍了解决android studio 打包发现generate signed apk 消失不见问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

  4. Android 实现自定义圆形listview功能的实例代码

    这篇文章主要介绍了Android 实现自定义圆形listview功能的实例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. 详解Android studio 动态fragment的用法

    这篇文章主要介绍了Android studio 动态fragment的用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. Android用RecyclerView实现图标拖拽排序以及增删管理

    这篇文章主要介绍了Android用RecyclerView实现图标拖拽排序以及增删管理的方法,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

  7. Android notifyDataSetChanged() 动态更新ListView案例详解

    这篇文章主要介绍了Android notifyDataSetChanged() 动态更新ListView案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

  8. Android自定义View实现弹幕效果

    这篇文章主要为大家详细介绍了Android自定义View实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  9. Android自定义View实现跟随手指移动

    这篇文章主要为大家详细介绍了Android自定义View实现跟随手指移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. Android实现多点触摸操作

    这篇文章主要介绍了Android实现多点触摸操作,实现图片的放大、缩小和旋转等处理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部