当前位置: 首页 > news >正文

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插件开发_实现自动复制文件插件

相关文章:

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

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

[MRCTF2020]Transform1

a[33]"9,10,15,23,7,24,12,6,1,16,3,17,32,29,11,30,27,22,4,13,19,20,21,2,25,5,31,8,18,26,28,14" b[33]"103,121,123,127,117,43,60,82,83,121,87,94,93,66,123,45,42,102,66,126,76,87,121,65,107,126,101,60,92,69,111,98,77" python代码 a3 [103…...

JavaWeb HTTP 请求头、请求体、响应头、响应体、响应状态码

J2EE(Java 2 Platform Enterprise Edition)是指“Java 2企业版”,B/S模式开发Web应用就是J2EE最核心的功能。 Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。 在日常的生活中,经常会使用…...

穿越数字防线:SSH协议的全景解析与未来展望

SSH基本概念 SSH(Secure Shell)是一个用于计算机网络的加密协议,设计用来提供一种安全的方式通过不安全的网络进行远程登录和其他网络服务。SSH协议主要用于远程管理系统和安全地传输信息。 SSH的历史背景 SSH由Tatu Ylnen于1995年开发&am…...

语文教学方法有哪些,产生了什么效果

你是否曾想过,一位普通的语文老师如何化身为智慧的引导者,点燃学生心中的求知之火?让我们一起探寻那些神奇的语文教学方法,以及它们带来的深远影响。 不仅让知识变得容易理解,更在无形中培养了学生的各项能力。通过谈话…...

Docker之网络配置

目录 一. Docker网络介绍 1.1 网络模式 1.2 bridge模式(默认模式) 1.2.1 什么是桥接模式 1.2.2 效果演示 1.2.3 桥接模式的特点 1.3 host模式 1.3.1 什么是host模式 1.3.2 仅主机模式的特点 二. Docker网络实操 2.1 bridge桥接模式 2.1 host仅主机模式 三. Docker自定义网络…...

Mybatis实现分页查询数据(代码实操讲解)

在MyBatis中实现分页查询的常见方式有两种:使用MyBatis内置的分页插件如PageHelper,或者手动编写分页的SQL语句。下面我将为你提供两种方式的示例代码。 使用PageHelper分页插件 首先,确保你的项目中已经添加了PageHelper的依赖。在Maven项…...

【自动驾驶技术系列丛书学习】1.《自动驾驶技术概论》学习笔记

《自动驾驶技术概论》学习笔记 致谢:作者:王建、徐国艳、陈竞凯、冯宗宝 -------------------------------------------------------------------------------------------------------- 笔记目录 《自动驾驶技术概论》学习笔记 1.汽车发展史 2.国…...

2023年全国职业院校技能大赛 GZ073网络系统管理赛项 模块A:网络构建(运维配置)

1.完成整网连通后,进入网络监控运维阶段,运维软件已安装在PC的虚拟机中,通过运维平台监控拓扑中所有网络设备(AP除外)。考试现场提供运维平台登陆的用户名密码信息。 2.通过运维平台将被监控设备纳入监控范围;通过拓扑配置功能,将网络拓扑配置到平台中。...

Linux设备模型(八) - sysfs

一,sysfs目录介绍 sysfs是一个基于内存的虚拟的文件系统,有kernel提供,挂载到/sys目录下,负责以设备树的形式向user space提供直观的设备和驱动信息。 sysfs以不同的视角展示当前系统接入的设备: /sys/block 历史遗…...

C语言实现Linux下的UDP服务端和客户端

程序实现了UDP服务端和客户端&#xff0c;客户端发送消息后等待服务端响应。 udp_server.c: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> …...

Excel小技巧 (2) - 如何去除和增加前导0

1. 如何去除前导0 公式&#xff1a;SUBSTITUTE(A2,0,"")&#xff0c;然后拖动十字架&#xff0c;同步所有列数据&#xff0c;轻松搞定。 2. 如何补充前导0 公式&#xff1a;TEXT(D2,"0000000") &#xff0c;0的个数是数字的完整位数。然后拖动十字架&a…...

【GIS人必看】ArcPy脚本如何导入到ArcToolBox中(上)【建议收藏】

经常使用ArcGIS的朋友应该知道&#xff0c;ArcGIS平台可以支持非常丰富的全栈链二次开发&#xff0c;比如ArcPy脚本开发、ArcGIS Engine桌面端开发、ArcGIS AddIn插件开发、WebGIS开发、移动端GIS开发等。当然&#xff0c;这些技术本人全部精通&#xff0c;后面会给大家陆续介绍…...

AI入门笔记(三)

神经网络是如何工作的 神经网络又是如何工作的呢&#xff1f;我们用一个例子来解释。我们看下面这张图片&#xff0c;我们要识别出这些图片都是0并不难&#xff0c;要怎么交给计算机&#xff0c;让计算机和我们得出同样的结果&#xff1f;难点就在于模式识别的答案不标准&…...

Linux搭建SFTP服务器

案例&#xff1a;搭建SFTP服务器 SFTP&#xff08;SSH文件传输协议&#xff09; SFTP&#xff08;SSH文件传输协议&#xff09;是一种安全的文件传输协议&#xff0c;用于在计算机之间传输文件。它基于SSH&#xff08;安全外壳协议&#xff09;的子系统&#xff0c;提供了加密的…...

MobaXterm无法上传整个文件夹,只能上传的单个文件

问题描述&#xff1a; 本来想使用MobaXterm上传.vscode文件夹上传到服务器&#xff0c;但是选择文件夹打开后只能选择文件夹下面的子文件无法上传整个文件。 解决方案&#xff1a; 1、简单暴力 2、压缩后解压...

Android 中get请求网络数据 详细举例

请求链接 https://api.bilibili.com/x/web-interface/ranking 1.添加网络权限 依赖等 implementation com.squareup.okhttp3:okhttp:4.9.3 implementation com.google.code.gson:gson:2.8.92.写请求类network package com.example.myapplication;import android.graphics.Bi…...

每日五道java面试题之mysql数据库篇(六)

目录&#xff1a; 第一题. MySQL中InnoDB引擎的行锁是怎么实现的&#xff1f;第二题. InnoDB存储引擎的锁的算法有三种第三题. 什么是死锁&#xff1f;怎么解决&#xff1f;第四题. 数据库的乐观锁和悲观锁是什么&#xff1f;怎么实现的&#xff1f;第五题. 为什么要使用视图&a…...

Latex——多张图排列

一、方式一&#xff08;subfig 与 subfloat 配合使用&#xff09; % Need&#xff1a;\usepackage{subfig} \begin{figure}[htbp] % \setlength{\abovecaptionskip}{0.2cm} % \setlength{\belowcaptionskip}{-0.5cm} \centering\subfloat[MOT15]{\label{fig:a}\includegrap…...

前端复选框问题-节点赋值未选中最后显示时确变成选中状态?

问题&#xff1a; 前两天一同事请教我&#xff1a;前端复选框问题-节点赋值未选中最后显示时确变成选中状态&#xff1f; 还有就是明明传过为的是false&#xff0c;在控制台上打印确变成选中状态&#xff0c;如下图&#xff1a; 以下是前端vue代码&#xff1a; <Scroll h…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...