Android Gradle开发与应用 (四) : Gradle构建与生命周期

1. 前言

前几篇文章,我们对Gradle中的基本知识,包括Gradle项目结构、Gradle WrapperGradleUserHomeGroovy基础语法、Groovy语法概念、Groovy闭包等知识点,这篇文章我们接着来介绍Gradle构建过程中的知识点。

2. Project : Gradle中构建过程的基本单位

在Gradle构建工具中,Project是一个核心概念,它代表了一个独立的构建单元,对应到项目结构中的一个模块或者子模块(每个build.gradle文件代表一个Project)。

在Gradle的构建模型中,一个Project可以包含多个子Project,形成一个树状结构。根Project用于统筹管理所有的子Project,而每个子Project都对应一个输出,例如APK文件、aar文件或jar文件等。

一个build(构建过程)由一个或多个project组成。每个project可以有多个task。

3. Task : Gradle中最小的构建单元

Task字面翻译就是任务的意思,是Gradle中最小的构建单元,每个Task代表构建过程中的一项具体工作或操作,比如编译Java源代码、打包JAR文件、运行测试、生成文档等,每一个Task都属于一个Project。

你可以将Gradle构建过程想象成一系列相互依赖的任务集合,这些任务按照特定的顺序和条件执行,共同完成构建流程。

在Gradle脚本(通常是build.gradle或settings.gradle.kts等文件)中,通过task关键字或者tasks.create()方法来定义一个Task。定义时可以为任务指定名称、组(group)、描述(description)以及闭包(closure)或动作(action),闭包内包含任务实际执行的操作逻辑。

// 定义一个简单的Task并设置其组和描述
task helloTask (group: 'example', description: 'Prints a hello message') {doLast {println 'Hello from Gradle Task!'}
}

在build.gradle中,一切无主的方法,都回去Project上查找。
如果你好奇task这个方法存在于哪里的话,点击task,会直接跳转到Project.class的源码去。

在这里插入图片描述
你会发现,所谓的这么一个task,定义的API,本质上就是Project的一个方法而已。

gradle中一个很重要的feature是,gradle中的task是活的,而不是死的。
task可以在配置阶段动态创建。

4. Lifecycle : Gradle的生命周期

4.1 任务图

Gradle 会在执行任何任务之前构建任务图。
在构建中的所有项目中,任务形成有向无环图 (DAG)。
pFY4HKO.png

4.2 构建阶段

Gradle 构建工具的生命周期可以细分为三个主要阶段:
在这里插入图片描述

  • 初始化 (Initialization)

    • 检测settings.gradle(.kts)文件是否存在
    • 根据settings.gradle(.kts)文件创建Settings对象 (Settings实例和settings .gradle(.kts)文件相对应)
    • 根据Settings对象确定哪些子项目将参与构建过程
    • 为每个项目创建对应的 Project 实例 (build.gradle(.kts)和Project相对应),并建立整个多项目构建的结构
  • 配置 (Configuration)

    • 进入配置阶段后,Gradle会根据每个Project加载其目录下对应的build.gradle(.kts)
    • Gradle 会加载每个项目中的 build.gradlebuild.gradle.kts 文件,根据其中的脚本定义来配置各个项目。
    • 在此阶段,Gradle 解析所有任务、依赖关系以及自定义插件等设置,并创建相应的Task对象。
    • 用户可以通过扩展点如pluginsdependenciestasks块来自定义构建行为。
  • 执行 (Execution)

    • Gradle 按照任务间的依赖关系来调度执行任务,确保前置任务成功完成后才会执行后续依赖于它的任务。
    • 执行阶段包括编译源代码、打包资源、运行测试、生成工件(如JAR、WAR文件)等操作。
    • 任务的执行可以并行进行。

Gradle 的强大之处在于它允许开发者在上述每个阶段插入定制的行为,例如通过添加钩子函数(如beforeSettingsprojectsEvaluated等)来扩展其功能。此外,在执行阶段,Gradle 使用增量构建技术来提高构建效率,仅处理自上次构建以来发生变化的部分。

在Gradle中,创建一个Settings实例是构建生命周期的第一步。Settings实例负责确定哪些项目应该包含在构建中,并为每个项目创建一个Project实例。这通常是通过解析settings.gradle或settings.gradle.kts文件来完成的,这些文件位于项目的根目录下。

5. Hook : Gradle中的钩子函数

Gradle中的Hook函数(也称为生命周期回调)允许你在构建生命周期的不同阶段插入自定义逻辑。这些Hook函数允许你扩展和定制Gradle的行为,以满足特定的构建需求。以下是一些Gradle中常用的Hook函数:

  • 构建初始阶段(Initialization
    • settingsEvaluated : 完成项目的配置阶段之后调用 (只能定义在 seting.gradleinit.gradle 脚本中)
    • projectsLoaded : 所有项目加载之后调用 (只能定义在 setting.gradleinit.gradle 脚本中)
  • 配置阶段(Configuration
    • beforeProject : 每个项目完成配置之前调用 (只能定义在 setting.gradleinit.gradle 脚本中)
    • afterProject : 每个项目完成配置之后调用
    • projectEvaluated : 所有项目全部完成配置之后调用
    • afterEvaluate : 整个配置阶段完成后调用
    • taskGraph.whenReady : 全部任务图已经构建完成可以就绪后调用
  • 执行阶段(Execution
    • taskGraph.beforeTask : 执行每一个任务之前调用
    • taskGraph.afterTask : 每一个任务执行完成之后调用
    • buildFinished : 整个构建全部结束后调用

6. Gradle系列文章

Android Gradle 开发与应用 (一) : Gradle基础-CSDN博客
Android Gradle开发与应用 (二) : Groovy基础语法-CSDN博客
Android Gradle开发与应用 (三) : Groovy语法概念与闭包-CSDN博客
Android Gradle开发与应用 (四) : Gradle构建与生命周期-CSDN博客
基于Gradle 8.2,创建Gradle插件-CSDN博客
Android Gradle插件开发_实现自动复制文件插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/721711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘大气颗粒物与VOCs:PMF源解析技术全解析

在现今日益严峻的环境问题中,大气颗粒物和臭氧污染尤为突出,它们不仅深刻影响着全球气候和生态环境,更对人体健康构成了严重威胁。为了有效应对这一挑战,我们首先需要深入了解颗粒物和臭氧的来源,特别是臭氧的前体物之…

遥测终端助力城市内涝积水监测,守护城市生命线!

近年来,随着全球气候的变化和城市化进程的加速,强降雨事件频发,导致城市内涝问题日益严重。道路低洼处、下穿式立交桥和隧道在强降雨时常常产生大量积水,给人们的出行带来极大不便,严重时甚至威胁人民的生命安全和造成…

JVM运行时数据区——方法区

文章目录 1、栈、堆、方法区的交互关系2、方法区的理解2.1、方法区的官方描述2.2、方法区的基本理解2.3、JDK中方法区的变化 3、设置方法区大小与OOM3.1、设置方法区内存的大小3.2、方法区内存溢出 4、方法区的内部结构4.1、类型信息、域信息和方法信息介绍4.1.1、类型信息4.1.…

动手学深度学习—循环神经网络RNN详解

循环神经网络 循环神经网络的步骤: 处理数据 将数据按照批量大小和时间步数进行处理,最后得到迭代器,即每一个迭代的大小是批量大小时间步数,迭代次数根据整个数据的大小决定,最后得出处理的数据(参照第三…

重拾前端基础知识:JavaScript

重拾前端基础知识:JavaScript 前言使用JavaScript输出语法运算符条件语句循环数据类型字符串数字数组对象日期函数 数学正则表达式异常处理类集合模块JSON闭包异步调试DOM(文档对象模型)事件事件监听器表单 BOM(浏览器对象模型&am…

【排序】详解选择排序

一、思想 选择排序的原理与思想非常直观和简单,它通过不断地选择未排序部分的最小(或最大)元素,并将其放到已排序部分的末尾来实现排序。 具体来说,选择排序的过程可以分解为以下几个步骤: 寻找最小&…

三步骤找到用户真正痛点 提高需求分析质量

用户痛点对于需求分析具有至关重要的作用,这直接关系着需求分析结果是否真正满足用户需求,关系着最终研发的产品是否能够满足市场的需求,是否能够在竞争激烈的市场中脱颖而出。因此找到用户真正痛点至关重要。 1、什么是痛点 痛点是消费者心理…

DML相关操作

DML 是数据操作语言,用来对数据库中表的数据记录进行增删改操作 添加数据(insert)修改数据(update)删除数据(delete) DML-添加数据 1.给指定字段添加数据 insert into 表名(字段…

各中间件性能、优缺点对比

参考资料: Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

C++命名空间

在C/C中,变量,函数和和类这些名称都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,避免命名冲突或名字污染,namespace关键字就是解决这种问题的。如下程序并无问题…

文物保护平台数据统计分析及预警-子系统专题分析

文物预防性监测与调控系统的监测统计分析子系统提供全面的文物状态及环境数据分析,为博物馆工作人员进行基于文物材质特性的专项保护提供相关科研辅助。主要的监测分析,包括各展厅文物统计分析、不同环境因素报表统计、以及监测调控设备统计分析等。 系统用户和文物管理人员可以…

从0开始入门智能知识库和星火大模型,打造AI客服。

介绍FastWiki FastWiki是一个高性能、基于最新技术栈的知识库系统,旨在为大规模信息检索和智能搜索提供解决方案。它采用微软Semantic Kernel进行深度学习和自然语言处理,在后端使用MasaFramework,前端采用MasaBlazor框架,实现了…

Swing程序设计(11)动作事件监听器,焦点事件监听器

文章目录 前言一、事件监听器是什么?二、详细展开 1.动作事件监听器2.焦点事件监听器总结 前言 如果你是坚持从Swing程序第一篇看到了这里,恭喜你,Swing程序设计简单地落下了帷幕,关于Swing程序更深的了解,可以自行学习…

MySQL性能优化-范式设计和反范式设计

范式化设计 范式化设计背景 范式是数据表设计的基本原则,又很容易被忽略。很多时候,当数据库运行了一段时间之后,我们才发现数据表设计得有问题。重新调整数据表的结构,就需要做数据迁移,还有可能影响程序的业务逻辑…

【Axure高保真原型】输入宽高控制图片尺寸

今天和大家分享输入图片宽高控制图片尺寸的原型模板,在输入框里输入图片的宽和高,图片会自动设置成对应数值的尺寸,包括了按比例或者自由设置两种方式,具体效果可以观看下方视频或者打开预览地址体验。 【原型效果】 【Axure高保…

数据库SQLite

1.简单创建一个数据库和删除一个数据库 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:orientation"vertical">&l…

wordpress外贸独立站

WordPress外贸电商主题 简洁实用的wordpress外贸电商主题&#xff0c;适合做外贸跨境的电商公司官网使用。 https://www.jianzhanpress.com/?p5025 华强北面3C数码WordPress外贸模板 电脑周边、3C数码产品行业的官方网站使用&#xff0c;用WordPress外贸模板快速搭建外贸网…

Windows Media Player (Win10)

Windows Media Player &#xff08;Win10&#xff09;服务器运行失败 先关闭掉【Windows Media Player】组件&#xff0c;但是要重启计算机 重启计算机后&#xff0c;再开启【Windows Media Player】组件√起来 可以使用了&#xff01;&#xff01;&#xff01;

前缀和和差分以及练习题目

蓝桥杯备赛系列 倒计时50天&#xff01; 前缀和和差分 知识点 前缀和数组&#xff1a; 假设原数组用a[i]表示&#xff0c;前缀和数组用sum[i]表示&#xff0c;那么sum[i]表示的是原数组前i项之和&#xff0c;注意一般用前缀和数组时&#xff0c;原数组a[i]的有效下标是从1开…

最强照片AI无损放大工具

使用人工智能的能力来放大图像&#xff0c;同时为惊人的结果添加自然的细节。 使用深度学习技术&#xff0c;A.I.GigaPixEL可以放大图像并填满其他调整大小的产品所遗漏的细节。 下载地址&#xff1a;最强照片AI无损放大工具.zip