码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Android Gradle 插件】Gradle 构建机制 ④ ( Gradle 构建生命周期 | 初始阶段 | 配置阶段 | 执行阶段 )


    文章目录

    • 一、初始阶段
    • 二、配置阶段
      • 1、任务配置示例演示
      • 2、任务执行示例演示
      • 3、任务执行示例代码
    • 三、执行阶段


    Gradle 构建生命周期 :

    • 初始阶段 ( Initialization )
    • 配置阶段 ( Configuration )
    • 执行阶段 ( Execution )

    Gradle 构建生命周期 完整流程 : 下图中的函数 , 都可以作为 HOOK 点 , 监听拦截 Gradle 的执行流程 ;
    在这里插入图片描述
    参考

    • 【Android Gradle 插件】Gradle 构建生命周期 ① ( 分析构建脚本 | 执行初始化配置 | 执行 Gradle 任务 | Project#beforeEvaluate 函数 )
    • 【Android Gradle 插件】Gradle 构建生命周期 ② ( Gradle 类的添加构建生命周期监听器函数 | Gradle#addListener 函数 )
    • 【Android Gradle 插件】Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 )

    博客 , 添加 Gradle 生命周期中的监听器 , 以监听拦截生命周期的各个阶段执行情况 ;





    一、初始阶段



    初始阶段 ( Initialization ) : Gradle 构建启动后最开始执行的阶段 ;

    • 执行 settings.gradle 构建脚本 , 查看当前的工程有哪些子模块 , 工程的顶层配置有哪些 , 如 rootProject.name 工程名称 ;
    • 为每个 build.gradle 构建脚本 创建对应的 Project 实例对象 ;

    Gradle 构建 是 通过 调用 Gradle#buildStarted 函数 开启的 , 该函数 不属于 初始化阶段 ,

    下面开始 进入 初始化阶段 :

    首先 , 执行 settings.gradle 构建脚本 ;

    然后 , 执行 Gradle#settingsEvaluated 函数 , 验证 settings.gradle 中的配置 ;

    最后 , 执行 Gradle#projectsLoaded 函数 , 创建 Project 实例对象 ;


    下图是初始化阶段执行的过程 :

    在这里插入图片描述
    监听拦截初始化阶段 : 参考 【Android Gradle 插件】Gradle 构建生命周期 ② ( Gradle 类的添加构建生命周期监听器函数 | Gradle#addListener 函数 ) 二、Gradle#addBuildListener 函数 博客 , 调用 Gradle#addBuildListener 方法 , 添加 BuildListener 监听器 , 参考代码如下 :

    gradle.addBuildListener(new BuildListener() {
        @Override
        void buildStarted(Gradle gradle) {
            // 构建开始时回调该函数
        }
    
        @Override
        void settingsEvaluated(Settings settings) {
            // 分析 settings.gradle 函数完成后回调该函数
        }
    
        @Override
        void projectsLoaded(Gradle gradle) {
            
        }
    
        @Override
        void projectsEvaluated(Gradle gradle) {
    
        }
    
        @Override
        void buildFinished(BuildResult buildResult) {
            // 构建完成时回调的函数
        }
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    其中

    • BuildListener#settingsEvaluated 接口 就可以拦截 初始化阶段的 Gradle#settingsEvaluated 函数 ,
    • BuildListener#projectsLoaded 接口 就可以拦截 初始化阶段的 Gradle#projectsLoaded 函数 ,




    二、配置阶段



    配置阶段 ( Configuration ) 会解析 工程根目录 和 每个模块 下的 build.gradle 构建脚本 , 确定 任务分组 , 任务之间的 依赖关系 , 执行顺序 等 , 然后对任务进行配置 ; 注意这里 只对任务进行配置 , 不会执行任务 ;


    在 编写完 build.gradle 构建脚本 后 , 并 不会生成 Gradle 任务 , 在右侧的 Gradle 面板中找不到自定义的 Gradle 任务 , 需要点击 " Sync Now " 按钮 , 进行 配置阶段 操作 , 才会在右侧 Gradle 面板中 生成自定义的 Gradle 任务 , 并且 将指定的任务分配的指定的分组 , 任务间的依赖关系 , 执行先后顺序 也会进行处理配置 ;

    在这里插入图片描述
    如果没有配置 , 是不会再右侧 Gradle 面板显示自定义 Gradle 任务的 ;

    配置阶段执行内容 :

    在这里插入图片描述
    如果要对该 " 配置阶段 " 的构建过程进行拦截 , 参考 【Android Gradle 插件】Gradle 构建生命周期 ① ( 分析构建脚本 | 执行初始化配置 | 执行 Gradle 任务 | Project#beforeEvaluate 函数 ) 二、Project#afterEvaluate 函数 三、Project#beforeEvaluate 函数 博客章节 , 可以直接在 build.gradle 构建脚本中 调用上述 Project#beforeEvaluate 函数 和 Project#afterEvaluate 函数 ;


    1、任务配置示例演示


    在根目录的 build.gradle 构建脚本 中 , 定义一个任务

    task Hello {
        println "Hello"
    }
    
    • 1
    • 2
    • 3

    点击右上方的 " Sync Now " 进行同步 ,

    在这里插入图片描述
    发现在 配置工程 阶段 , 执行了 Hello 任务闭包中的代码 ,

    在 Build 面板中输出内容如下 : 下面的输出说明 , 配置阶段只配置任务 , 并没有执行任务 ;

    Starting Gradle Daemon...
    Gradle Daemon started in 2 s 669 ms
    
    > Configure project :
    Hello
    
    BUILD SUCCESSFUL in 11s
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述


    2、任务执行示例演示


    点击该 Gradle 任务左侧的 运行按钮 , 运行该任务 ;

    在这里插入图片描述

    运行 Hello 任务 , Build 面板输出如下内容 , 说明运行任务前 , 需要配置任务 ;

    16:46:20: Executing task 'Hello'...
    
    Executing tasks: [Hello] in project D:\002_Project\002_Android_Learn\MyApplication2
    
    
    > Configure project :
    Hello
    AGPBI: {"kind":"warning","text":"Please remove usages of `jcenter()` Maven repository from your build scripts and migrate your build to other Maven repositories.\nThis repository is deprecated and it will be shut down in the future.\nSee http://developer.android.com/r/tools/jcenter-end-of-service for more information.\nCurrently detected usages in: root project 'My Application', project ':app', project ':hello', ...","sources":[{}]}
    
    > Task :Hello UP-TO-DATE
    
    BUILD SUCCESSFUL in 496ms
    16:46:21: Task execution finished 'Hello'.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述


    3、任务执行示例代码


    修改构建脚本中的 Hello 任务 , 修改完毕后 , 点击右上角的 " Sync Now " 按钮 ,

    task Hello {
        println "Hello"
    
        doFirst {
            println "Hello doFirst"
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    输入结果如下 , 该 Hello 任务只进行了配置 , 没有运行任务 ;

    > Configure project :
    Hello
    
    BUILD SUCCESSFUL in 3s
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述





    三、执行阶段



    执行阶段 ( Execution ) 会在 配置阶段 的 任务配置 基础上 , 执行任务 ;


    执行阶段执行的任务如下 :
    在这里插入图片描述
    如果要对该过程进行拦截 , 可参考 【Android Gradle 插件】Gradle 构建生命周期 ③ ( BuildListener 构建监听器 | TaskExecutionGraphListener 任务执行图监听器 ) 博客进行 拦截 ;

  • 相关阅读:
    计算机物联网控制|5.5常规控制方案 5.6先进控制方案
    Rust6.2 An I/O Project: Building a Command Line Program (mini_grep)
    C++包装器
    虚幻引擎:代理
    认识进制
    Redis中间件学习笔记(四)(应用场景面试)
    基本算法-希尔排序
    natapp内网穿透技术【集成】
    安装 hbase(伪分布式)
    Java学习之封装
  • 原文地址:https://blog.csdn.net/han1202012/article/details/127572642
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号