【Gradle-1】入门Gradle,前置必读

news2024/11/13 19:08:26

1、为什么要学习Gradle

  1. Gradle作为Android开发默认的构建工具,你的每一次编译都会用到它。
  2. 招聘要求从以前的熟悉加分,到现在的必备技能,可见Gradle的重要性。

做开发这么久了,你是否对Gradle又爱又恨?是否对Gradle的配置一知半解?是否每次编译结果都像开盲盒一样?是否想知道Gradle背后执行的原理?是否也想手写Plugin?等等等等,如果你想,那这个专栏可以给你答案,彻底搞懂Gradle,助你提效,解放双手,收割Offer。

通过这个专栏你能收获什么:

  1. 熟悉Gradle的原理及相关配置。
  2. 提升定位并解决编译失败的能力。
  3. 看懂并能手写Gradle插件。
  4. 通过Gradle提升编译速度。
  5. 助力面试,收割Offer。

2、Gradle是什么

Gradle是一个专注于灵活性和性能的开源自动化构建工具。

这句话,大部分人在看的时候都是一扫而过,其实我自己也是,但是如果别人问我,为什么要用Gradle?Gradle解决了什么问题?我好像也给不出一个满意的答案,因为我就没有深入的思考过,潜意识里可能会这么回答,因为开发Android用的是Android Studio,然后创建项目的时候默认就有这些gradle的配置了,或者说gradle是Android Studio默认的构建工具,点一下run就可以编译运行到手机了。

我回答的有问题吗,好像也没有问题,可是细想一下,我好像只是在陈诉一件大家已知的事情,那如果是面试,我顶多算及格,因为没有亮点而被放进备胎池里,最后无缘offer。

那么现在,就尝试着把这句话拆开解读一下:

  • 开源自动化构建工具
  • 专注于灵活性和性能

2.1、什么是构建工具

什么是构建工具呢,构建工具就是自动化帮我们完成一系列的编译打包的流程。

如果没有构建工具,我们就需要一遍一遍的执行命令去打包,比如打包APK要用javac去编译代码,再用AAPT去编译资源文件,然后编译DEX组合APK最后签名,如果每改一次代码预览都要这么干的话,那肯定是相当费劲的,所以自动化构建工具就诞生了。同时,构建工具也帮助我们做依赖管理,比如在Android Studio之前,我们用Eclipse开发,没有构建工具的情况下,我们要依赖一个三方库,需要把jar包下载下来,然后再放进项目里,这个过程是比较繁琐的,而且在升级jar版本的时候又要重复操作一遍,如果其他项目要用的话,又要把这个jar包再手动复制一遍,但是Gradle是支持依赖传递的,通过不同的依赖方式就可以改变依赖作用域。

2.2、构建简史

在Gradle之前,最经典的当属Ant了,Ant使用的DSL是xml,xml的进化来源于MakeFile构建的繁琐,而xml特点是结构化且好理解,这比写脚本插件简单多了,所以迅速流行起来。

随着软件行业的迅速发展,我们的产品功能越来越多,业务越来越复杂,开发团队也日益庞大,这时候工程管理和工程的标准化问题就开始日益突出,于是Maven诞生了。Maven很好的解决了依赖问题,引入了标准依赖库对版本进行管理,并且对工程的目录结构、构建生命周期都做了标准化定义,极大的方便了工程管理及开发。

但是当Maven流行一段时间之后,大家又发现了问题,xml逻辑简单是不错,但是写起来太啰嗦,而且扩展性不够,此时,Gradle登场了。
Gradle在Maven的基础上,主要解决了两个问题:

  1. 用一种新的DSL,让语法变的更简洁,且支持扩展;
  2. 定义了扩展方便且不失标准的构建生命周期;

实际上Gradle发展至今,早已超越了上面这两点,而且还在不断的进化中,比如buildSrc的诞生、kts的支持、KSP的演进等等。

3、Gradle的特点

  1. Gradle是一个基于JVM运行的构建工具,使用java编写;
  2. 脚本语言(DSL)使用Groovy(.gradle)、Kotlin(.gradle.kts)编写,都是高级语言,都是面向对象编程;
  3. Gradle中的核心对象是Task,Task是Gradle中最小的构建单元,Action是最小的执行单元;
  4. Gradle中的Project对应一个工程,是树形结构,可以向下或向上遍历,还用来关联Task;
  5. Gradle提供了很好的扩展能力,可以根据需求自定义插件及配置;
  6. Gradle在各个生命周期阶段提供了丰富的回调,对于切面处理的扩展很有帮助;
  • 高度可定制——Gradle 以最基本的方式可定制和可扩展的方式建模。
  • 快速——Gradle 通过重用先前执行的输出、仅处理更改的输入以及并行执行任务来快速完成任务。
  • 功能强大— Gradle 是 Android 的官方构建工具,支持多种流行语言和技术。

4、如何学习Gradle

事实上,学习Gradle并不是一件易事,从Gradle原理、开发配置、到编译打包,每一个点背后都需要深入的学习和理解,围绕着这个主线我也大概简单列了一下学习路线,后面也将继续围绕着下面这个学习路线展开。
在这里插入图片描述

当然这个学习路线目前也是初版,因为Gradle涉及的东西还是比较多的,更新也比较快,后面也会不断的迭代补充。

5、总结

本文主要介绍了掌握Gradle的重要性、什么是构建工具以及构建简史、Gradle的特点和Gradle的学习路线。

不过单凭一两篇文章也很难把Gradle讲全面讲清楚,我希望可以通过一个专栏,深入浅出,把Gradle这个难啃的知识点讲明白,所以接下来还会继续介绍Gradle中的Task、生命周期、依赖管理、插件开发、编译提速等相关知识,如果你恰好也想深入了解Gradle,欢迎关注,持续更新!

另外,后面关于Gradle的一些示例源码,都会在这个Github仓库里展开:https://github.com/yechaoa/GradleX

6、参考文档

  • Gradle User Manual
  • What is Gradle?
  • Learning Gradle
  • Mastering Gradle
  • Gradle入门教程

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

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

相关文章

第三章(1):自然语言处理概述:应用、历史和未来

第三章(1):自然语言处理概述:应用、历史和未来 目录第三章(1):自然语言处理概述:应用、历史和未来1. 自然语言处理概述:应用、历史和未来1.1 主要应用1.2 历史1.3 NLP的新…

【科普】PCB为什么常用50Ω阻抗?6大原因

在PCB设计中,阻抗通常是指传输线的特性阻抗,这是电磁波在导线中传输时的特性阻抗,与导线的几何形状、介质材料和导线周围环境等因素有关。 对于一般的高速数字信号传输和RF电路,50Ω是一个常用的阻抗值。 为什么是50Ω&#xff1f…

《程序员面试金典(第6版)》面试题 10.09. 排序矩阵查找(观察法,二分法,分治算法入门题目,C++)

题目描述 给定MN矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。 示例: 现有矩阵 matrix 如下:[[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9, 16, 22],[10, 13, 14, 17, 24],[18, 21, 23, 26, 30] ]给定 target 5&…

wma格式怎么转换mp3,4种方法超快学

其实我们在任何电子设备上所获取的音频文件都具有自己的格式,每种格式又对应着自己的属性特点。比如wma就是一种音质优于MP3的音频格式,虽然很多小伙伴比较青睐于wma所具有的音质效果,但也不得不去考虑因wma自身兼容性而引起很多播放器不能支…

【高危】Apache Solr 代码执行漏洞(MPS-wic0-9hjb)

漏洞描述 Apache Solr 是一款开源的搜索引擎。 在Apache Solr 受影响版本中,由于Solr默认配置下存在服务端请求伪造漏洞,且SolrResourceLoader中实现了java SPI机制。当Solr以SolrCloud模式启动时,攻击者可以通过构造恶意的solrconfig.xml文…

几个最基本软件的环境变量配置

在Windows中配置环境变量位置: 控制面板->系统和安全->系统。可以点击:“此电脑”->“属性”直接进入。 点击“高级系统设置”->【环境变量】。在这里可以看见用户变量和系统变量,如果你这台机器不是你一个人使用设置为用户变量…

接口文档设计避坑指南

我们做后端开发的,经常需要定义接口文档。 最近在做接口文档评审的时候,发现一个小伙伴定义的出参是个枚举值,但是接口文档没有给出对应具体的枚举值。其实,如何写好接口文档,真的很重要。今天田螺哥,给你带来接口文档…

Vue学习笔记(4. 生命周期)

1. 生命周期写法(vue2与vue3比对) 创建前:vue3 setup, vue2 beforeCreate //组件创建前执行的函数 创建后:vue3 setup, vue2 created //组件创建后执行的函数 挂载前:vue3 onBeforeMount, vue2 beforeMount //挂…

FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization

FastViT: A Fast Hybrid Vision Transformer using Structural Reparameterization 论文地址:https://arxiv.org/pdf/2303.14189.pdf 概述 本文提出了一种通用的 CNN 和 Transformer 混合的视觉基础模型 移动设备和 ImageNet 数据集上的精度相同的前提下&#xf…

SpringBoot自动配置原理分析

前言: 虽然工作中一直使用的是自研的一款基于spring的框架,但是随着springboot在各公司的广泛使用,公司的一些新项目也开始逐渐使用springBoot了,那么springBoot的一些特性就要仔细学习一下了。 什么是自动配置? 还记…

【牛客刷题专栏】0x21:JZ20 表示数值的字符串(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录 前言问…

Voice Control for ChatGPT 轻松实现使用语音与ChatGPT进行对话。

缘由 日常生活中,我们与亲人朋友沟通交流一般都是喜欢语音的形式来完成的,毕竟相对于文字来说语音就不会显的那么的苍白无力,同时最大的好处就是能解放我们的双手吧,能更快实现两者间的对话,沟通便更高效了。Voice Co…

【瑞吉外卖】002 -- 后台登录功能开发

本文章为对 黑马程序员Java项目实战《瑞吉外卖》的学习记录 目录 一、需求分析 1、页面原型展示 2、登录页面展示 3、查看登录请求信息 4、数据模型 二、代码开发 1、创建实体类Employee,和employee表进行映射 2、创建包结构:(Controller、Se…

基于TCP协议的Socket通信

上节中我们给大家接触了Socket的一些基本概念以及使用方法,相信大家对Socket已经有了初步的掌握。本节我们学习使用Socket来实现大文件的断点续传!在这里我们以他人的案例进行讲解,这是别人写好的一个Socket上传大文件的例子,不要…

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11

原文:Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的…

MySQL(表的增删改查)

文章目录 0. 前言1. Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2. Retrieve2.1 SELECT 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式2.1.4 为查询结果指定别名2.1.5 结果去重 2.2 WHERE 条件2.2.1 英语不及格的同学及英语成绩…

【消息队列】聊一下Kafka多线程消费实例

Kafka Java Consumer设计原理 目前市面上大多数计算机都采用多核CPU来提升系统的处理性能,但是如果在程序开发层面使用单线程的话,那么必定不能完全发挥出系统的真实性能,而kafka Consumer就是单线程的。而这个只是针对于消费消息这个层面来…

【AI热点技术】ChatGPT开源替代品——LLaMA系列之「羊驼家族」

ChatGPT开源替代品——LLaMA系列之「羊驼家族」 1. Alpaca2. Vicuna3. Koala4. ChatLLaMA5. FreedomGPT6. ColossalChat完整的 ChatGPT 克隆解决方案中英双语训练数据集完整的RLHF管线 相关链接 现在如果问什么最火,很多人第一反应肯定就是ChatGPT。的确&#xff0c…

Redis集群模式下使用config set 命令所有节点都会生效吗?

Redis集群模式下使用config set 命令所有节点都会生效吗? 问题: Redis集群模式下使用config set 命令所有节点都会生效吗? 实践检验真理: 前置准备 Redis版本:5.0.5版本 Redis集群模式:三主三从 操作步骤: 分别连接7001节点与7002节点,准备在7001节点使用”config get”…

交友项目【查询好友动态,查询推荐动态】实现

目录 1:圈子 1.1:查询好友动态 1.1.1:接口分析 1.1.2:流程分析 1.1.2:代码实现 1.2:查询推荐动态 1.2.1:接口分析 1.2.2:流程分析 1.2.3:代码实现 1&#xff1a…