关于 Gradle 你应该知道的知识点_settings中的gradle jdk是什么意思

本文介绍了Gradle构建中settings.gradle和build.gradle的角色与生命周期。settings.gradle用于描述构建所参与的模块,而build.gradle则配置模块构建信息。构建流程包括初始化、配置和执行三个阶段。build.gradle的执行涉及插件应用和配置,其生命周期包括init、configure和execution,不同阶段有不同的任务和回调。了解这些基础原理能帮助开发者更好地理解构建过程并提升开发效率。
摘要由CSDN通过智能技术生成

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新HarmonyOS鸿蒙全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img

img
img
htt

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注鸿蒙)
img

正文

  1. settings.gradle(.kts)
  2. build.gradle(.kts)

我们常常会在settings.gradle中配置module,那么settings.gradle究竟是什么?起什么作用?
所有需要被构建的模块都需要在settings.gradle 中注册, 因此它的作用是描述 “当前构建所参与的模块”.

settings.gradle查找顺序为: 从前目录开始, 如果找到settings.gradle(.kts)则停止, 否则向父目录递归查找.
setting script承担了统筹所有模块的重任, 因此api主要是在操作所参与构建的模块以及管理构建过程需要的插件.
可以通过如下方式注册需要参与构建的模块,项目名称中 : 代表项目的分隔符, 类似路径中的 /. 如果以 : 开头则表示相对于 root project

include(“:app”, “:libs:someLibrary”)

include(“:anotherLibrary”)
project(“:anotherLibrary”).projectDir = File(rootDir, “…/another-library”)

6. build.gradle是什么?

到了我们最熟悉也是最常用的build.gradle了,每个模块都会有一个build.gradle来配置当前模块的构建信息, 根目录模块的build.gradle叫做 root build script, 其他子模块的 build script 叫做 module build script.

项目构建的流程大致如下所示,其中的init script$GRADLE_USER_HOME目录下的init.gradle文件,主要做一些初始化配置
单模块构建的执行流程大致为: init script -> setting script -> build script
而多模块的构建流程, 比单模块多了一步: init script -> setting script -> root build script -> build script

一般而言, root build script 并不是一个实际的模块, 而是用于对子模块进行统一的配置, 所以 root build script 一般不会有太多的内容.

GradleInitialization 阶段还没有执行 build.gradle(.kts) 文件, 真正解析 build script 是在 Configuration 阶段. 但是 build script 的执行比较特殊, 它并不是简单执行所有代码, 其本质是 用代码描述和配置构建规则, 然后按规则执行任务. Build script 作为整个 Gradle 中配置最复杂的脚本, 实际上仅仅做了两件事: 一个是引入插件, 另一个是配置属性

所谓引入插件如下所示,plugins 闭包中还可以通过 version 指定插件的版本, 以及 apply 来决定是否立刻应用插件:

plugins {
id(“com.android.application”)
id(“com.dorongold.task-tree”) version “1.4”
id(“com.dorongold.task-tree”) version “1.4” apply false
}

而所谓配置属性, 实际上是对引入的插件进行配置. 原本 build script 中并没有 android {...} 这个 dsl 属性, 这是 plugin 提供的. 一旦应用了某个插件, 就可以使用插件提供的 dsl 对其进行配置, 从而影响该模块的构建过程. 换个角度看, 这些插件提供的属性配置 dsl 就相当于插件 init 函数的参数, 最终传入到插件中. 当构建执行的时候就会根据配置对当前模块进行编译.

plugins {
id(“com.android.application”)
}

android {
compileSdkVersion(28)

defaultConfig {

}
}

7. Gradle生命周期是怎样的?

在了解了上面这些知识后,我们可以开始了解一下Gradle的生命周期。在了解了Gradle的生命周期后,我们可以对Gradle执行的总体流程有一个了解,也可以利用这些生命周期做一些Hook的操作

不同于传统脚本的自上而下执行, 一次 Gradle 构建涉及到多个文件, 主体流程如下:

总体来说, Gradle 的执行分为三大阶段: Initialization -> Configuration -> Execution. 每个阶段都有自己的职责.

7.1 Initialization阶段

Initialization 阶段主要目的是初始化构建, 它又分为两个子过程, 一个是执行 Init Script, 另一个是执行 Setting Script.
Init script 会读取全局脚本, 主要作用是初始化一些全局通用的属性, 例如获取 Gradle User Home 目录, Gradle version
Setting Script就是我们上面提到的settings.gradle

7.2 Configuration阶段

当构建完成 Initialization 阶段后, 将进入 Configuration 阶段. 这个阶段开始加载项目中所有模块的 Build Script. 所谓 “加载” 就是执行 build.gradle(.kts) 中的语句, 根据脚本代码创建对应的 task, 最终根据所有 task 生成对应的依赖图. 我们上面说过"Gradle核心模型是一个 Task 组成的有向无环图(Directed Acyclic Graphs)" 吗? 这个任务依赖图就是在这个阶段生成的.

需要注意的是,Configuration阶段各个模块的加载顺序是无序的,跟依赖关系与加入顺序都没有关系

7.3 Execution阶段

当完成任务依赖图后, Gradle 就做好了一切准备, 然后进入 Execution 阶段. 这个阶段才真正进行编译和打包动作. 对于 Java 而言是调用 javac 编译源码, 然后打包成 jar. 对于 Android 而言则更加复杂些. 这些差异来源于我们应用的插件. 总得来说,就是开始执行task

7.4 生命周期 Hook

Gradle 提供了丰富的生命周期 Hook,我们可以根据我们的需要添加各种HooK

根据图中生命周期的位置, 可以清楚地了解到 “生命周期的最晚注册时机”. 比如, settingsEvaluated 是在 setting scriptevaluated 完毕后回调, 那么在 init scriptsetting script 中注册都是没问题的. 但是如果注册在 build script 中, 则无法发挥作用.

同时关于生命周期Hook,还有下面几点需要注意

  1. projectsLoaded之前Project还没有创建,因此只能使用gradlesettings 对象
  2. projectsLoaded 回调时已经根据 setting script 创建了各个模块的 Project 对象, 我们可以引用 project 对象从而设置一些 hook,便是build script还没有被配置,因此拿不到配置信息
  3. 每当一个 build.gradle(.kts) 被执行完毕, 都会产生 afterEvaluate 回调, 代表着 projectevaluate 完成. 从此, project 对象内容完整了, 即: 当前 build.gradle(.kts) 中所有的配置项都能够被访问.
  4. 所有的Project配置结束,会回调projectsEvaluated
  5. Gradle 的核心逻辑就是根据 task 的依赖关系生成有向无环图, 然后依次执行图中的 tasktask graph生成后会回调graphPopulated
  6. 当所有task都执行完毕, 整个构建也宣告结束,这个时候会回调buildFinished

总结

本文主要本文主要介绍Gradle的一些基础知识与原理,包括Gradle各个文件的作用,以及生命周期,构建总体流程,以及生命周期Hook方法等
了解Gradle的这些基础原理,可以帮助我们更好的了解Android构建打包的过程,也方便我们利用Gradle生命周期做一些Hook工作,提升开发效率。
如果本文对你有所帮助,欢迎点赞,收藏,评论~

总结

首先是感觉自己的基础还是不够吧,大厂好像都喜欢问这些底层原理。

另外一部分原因在于资料也还没有看完,一面时凭借那份资料考前突击恶补个几天居然也能轻松应对(在这里还是要感谢那份资料,真的牛),于是自我感觉良好,资料就没有怎么深究下去了。

之前的准备只涉及了Java、Android、计网、数据结构与算法这些方面,面对面试官对其他基础课程的考察显得捉襟见肘。

下一步还是要查漏补缺,进行针对性复习。

最后的最后,那套资料这次一定要全部看完,是真的太全面了,各个知识点都涵盖了,几乎我面试遇到的所有问题的知识点这里面都有!在这里也免费分享给大家,希望大家不要犯和我一样的错误呀!!!一定要看完!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0UF5WCS-1656582341915)(https://upload-images.jianshu.io/upload_images/14735202-be1c61708af862a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]


获取方式:扫描下方二维码免费获取

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注鸿蒙)
[外链图片转存中…(img-6mptTWaH-1713613073509)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值