Gradle基础 - 了解Gradle Wrapper

文章目录

  • 1. Gradle Wrapper的概念和作用
  • 2. Gradle Wrapper文件结构
    • 1. VERSION:
    • 2. TYPE: (分发类型 bin vs all)
  • 3. 实际开发中应用
  • 4. Gradle Wrapper 最佳实践
    • 1. 始终使用 Wrapper:
    • 2. 将 Wrapper 文件提交到版本控制:
    • 3. 定期更新 Gradle 版本:
    • 4. 验证 Wrapper 更改:
    • 5. 使用兼容的版本:

在每个Gradle项目中都存在一个Gradle Wrapper,这是Gradle构建系统中一个基础但是非常重要的组件。我们来聊一聊它的作用和重要性。

1. Gradle Wrapper的概念和作用

Gradle Wrapper(简称"Wrapper")是一个脚本,它的主要目的是确保所有开发者和构建环境使用完全相同版本的 Gradle,而无需手动安装 Gradle。它的核心优势如下:

  1. 版本一致性:确保所有人(开发者、CI 服务器等)使用完全相同的 Gradle 版本构建项目
  2. 无需预装 Gradle:新开发者或 CI 环境不需要预先安装 Gradle
  3. 自动化下载:首次构建时自动下载指定版本的 Gradle
  4. 版本控制:Wrapper 配置文件可以提交到版本控制系统,确保项目历史构建的一致性

2. Gradle Wrapper文件结构

在典型的 Android Studio 项目中,您会看到以下 Wrapper 相关文件:

project/├── gradle/│   └── wrapper/│       ├── gradle-wrapper.jar│       └── gradle-wrapper.properties├── gradlew                 (Unix shell script)└── gradlew.bat             (Windows batch file)

我们来依次聊聊各文件的作用:

gradle-wrapper.jar

这是一个小型 Java 可执行文件, 负责下载和安装指定版本的 Gradle,并处理验证下载的Gradle分发包

wrapper.properties

包含 Wrapper 配置的属性文件. 最重要的是 distributionUrl 属性,指定使用的 Gradle 版本

gradlew / gradlew.bat

这些是启动脚本,分别用于 Unix 和 Windows 系统, 当运行 ./gradlew buildgradlew.bat build 时,实际上是通过这些脚本启动构建

对于gradle-wrapper.properties,我们可以详细聊一聊,这个文件一般情况下会包含如下内容:

#Thu Jul 28 20:36:56 CST 2022
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-all.zip

那么各属性的含义如下:

distributionBasedistributionPath

组合起来指定下载的 Gradle 分发包存储位置, 通常是 GRADLE_USER_HOME/wrapper/dists, GRADLE_USER_HOME 默认是用户主目录下的 .gradle 文件夹

zipStoreBasezipStorePath

指定解压后的 Gradle 存储位置,通常与分发包位置相同

distributionUrl:

这是最关键的属性,指定要下载和使用的 Gradle 版本和类型,格式通常为:https://services.gradle.org/distributions/gradle-[VERSION]-[TYPE].zip

对于distributionUrl,我们可以深入讨论一下:

https://services.gradle.org/distributions/gradle-[VERSION]-[TYPE].zip

1. VERSION:

例如 gradle-7.4-bin.zip 中的 7.4 是 Gradle 的版本号。选择正确的 Gradle 版本对项目至关重要,因为:

  • 不同版本的 Gradle 可能有不同的功能和性能
  • Android Gradle 插件版本与 Gradle 版本之间有兼容性要求
  • 较新版本通常有性能改进和 bug 修复

2. TYPE: (分发类型 bin vs all)

URL 中通常会有 -bin-all 后缀:

  • bin: 只包含运行 Gradle 所需的二进制文件和核心脚本. 它下载大小较小,不包含文档和源代码, 适合大多数日常开发和 CI 环境
  • all: 包含完整的 Gradle 分发包. 包括文档、示例和源代码, 下载大小更大, 适合需要离线文档或源代码的场景

多数情况下,选择 -bin 版本就足够了,除非有特殊需求。


3. 实际开发中应用

当我们首次克隆一个使用 Gradle Wrapper 的项目并运行 ./gradlew 命令时,会发生以下事情:

  1. Wrapper 脚本检查是否已安装指定版本的 Gradle
  2. 如果未安装,使用 gradle-wrapper.jar 下载指定的 Gradle 分发包
  3. 下载、验证并解压 Gradle
  4. 使用下载的 Gradle 版本执行构建

当我们想要更新项目使用的Gradle版本时,有两种方法:

  1. 手动编辑 gradle-wrapper.properties, 然后点击 sync
# 将 distributionUrl 中的版本号从 7.4 更改为 7.5
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
  1. 使用Gradle任务(推荐):
# 更新到特定版本
./gradlew wrapper --gradle-version=7.5# 更新到特定版本并使用完整分发包
./gradlew wrapper --gradle-version=7.5 --distribution-type=all

使用任务更新的好处是它会同时更新 gradle-wrapper.propertiesgradle-wrapper.jar

那么如何在AS中更新Gradle版本呢?我们可以通过如下步骤更新:

  1. 打开 File > Project Structure
  2. 选择 Project 选项卡
  3. Gradle Version 下拉菜单中选择新版本
  4. 点击 ApplyOK

对于distributionUrl,由于指定了从网络下载的文件,有几点安全考虑:

  1. 使用 HTTPS:确保 URL 使用 HTTPS 协议(默认已配置)
  2. 来源验证:Wrapper 会验证下载的 ZIP 文件校验和
  3. 可信源:只从官方 Gradle 分发服务器下载(services.gradle.org
  4. 企业环境:一些企业可能会将 Gradle 分发包镜像到内部服务器

对于企业环境的Gradle Wrapper,一般有如下几种配置:

  1. 使用内部镜像,可以将 distributionUrl 指向内部镜像:
distributionUrl=https\://internal-mirror.company.com/gradle/gradle-7.4-bin.zip
  1. 预下载的 Gradle,对于完全隔离的环境,可以将 Gradle 分发包预先下载到版本控制系统中,并使用本地路径:
distributionUrl=file\:///path/to/project/gradle/wrapper/dists/gradle-7.4-bin.zip

4. Gradle Wrapper 最佳实践

1. 始终使用 Wrapper:

  • 在所有项目中使用 Gradle Wrapper
  • 避免依赖开发者机器上全局安装的 Gradle

2. 将 Wrapper 文件提交到版本控制:

  • 提交所有 Wrapper 文件(包括 JAR)到版本控制系统
  • 这确保了构建的一致性和可复现性

3. 定期更新 Gradle 版本:

  • 跟踪 Gradle 和 Android Gradle 插件的更新
  • 测试新版本是否与项目兼容后再更新

4. 验证 Wrapper 更改:

  • 当收到修改 distributionUrl 的 Pull Request 时要特别注意
  • 确保更改使用了官方 Gradle 分发或受信任的源

5. 使用兼容的版本:

  • 确保 Gradle 版本与 Android Gradle 插件版本兼容
  • 查阅官方兼容性矩阵:https://developer.android.com/studio/releases/gradle-plugin#updating-gradle

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

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

相关文章

常见中间件漏洞之四:Apache

1. CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录<Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击…

Pytorch中Tensorboard的学习

1、Tensorboard介绍 TensorBoard 是 TensorFlow 开发的一个可视化工具&#xff0c;用于帮助用户理解和调试机器学习模型的训练过程。尽管它最初是为 TensorFlow 设计的&#xff0c;但通过 PyTorch 的 torch.utils.tensorboard 模块&#xff0c;PyTorch 用户也可以方便地使用 Te…

刷机维修进阶教程-----adb禁用错了系统app导致无法开机 如何保数据无损恢复机型

在刷机维修过程中 。我们会遇到一些由于客户使用adb指令来禁用手机app而导致手机无法开机进入系统的故障机型。通常此类问题机型有好几种解决方法。但如果客户需要保数据来恢复机型。其实操作也是很简单的.还有类似误删除应用导致不开机等等如何保数据。 通过博文了解💝💝�…

哪吒汽车:一边熬夜蹦迪,一边找药投医

两年前&#xff0c;威马CEO沈晖发了个短视频&#xff0c;内容是“活下去&#xff0c;像牲口一样活下去”。 如今最能体会沈晖当时心情的&#xff0c;估计就是方运舟了。 作为哪吒汽车创始人兼董事长&#xff0c;他连续多次被限高&#xff0c;为了让哪吒汽车活下去&#xff0c…

2025 cs144 Lab Checkpoint 1小白超详细版

cs144官网&#xff1a;https://cs144.github.io/ 我的github&#xff1a;https://github.com/Albert-tru/cs144-2025 文章目录 1 手动发送internet数据报协议号5、7&#xff1f;思路&#xff1f; 2 实现一个Reassembler类2.1 几个帮助理解代码的Q&AQ1&#xff1a;insert的参…

使用 OpenCV 拼接进行图像处理对比:以形态学操作为例

图像处理在计算机视觉中起着至关重要的作用&#xff0c;而 OpenCV 作为一个强大的图像处理库&#xff0c;提供了丰富的函数来实现各类图像处理任务。形态学操作&#xff08;Morphological Operations&#xff09;是其中常用的技术&#xff0c;尤其适用于二值图像的处理。常见的…

单链表的查找和插入,删除操作

1.单链表的查找 snode* slistfind(snode* stlheap, stltype x) {while (stlheap){if (stlheap->data x){return stlheap;}stlheap stlheap->next;}return NULL; } 2.单链表的插入操作 2.1在指定位置之前插入节点 void slistinsert(snode** stlheap, snode* pos, stl…

一文速通Python并行计算:00 并行计算的基本概念

一文速通 Python 并行计算&#xff1a;00 并行计算的基本概念 摘要&#xff1a; 该文介绍了 Python 并行计算的核心概念、编程模型及其应用&#xff0c;并介绍了了并行程序的性能分析与优化方法&#xff0c;如并行效率、加速比及 Amdahl 定律。此外&#xff0c;该文介绍了共享…

vue中keep-alive组件的使用

keep-alive是vue的内置组件&#xff0c;它的主要作用是对组件进行缓存&#xff0c;避免组件在切换时被重复创建和销毁&#xff0c;从而提高应用的性能和用户体验。它自身不会渲染一个 DOM 元素&#xff0c;也不会出现在父组件链中。使用时&#xff0c;只需要将需要缓存的组件包…

Python Excel表格数据对比工具

【Excel对比工具】提升工作效率的神奇助手&#xff1a;基于PyQt5和Pandas的文件数据对比应用 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例…

注册登录表单

html登录页面&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>创建一个登录页面</t…

JAVA:Spring Boot @Conditional 注解详解及实践

1、简述 在 Spring Boot 中&#xff0c;Conditional 注解用于实现 条件化 Bean 装配&#xff0c;即根据特定的条件来决定是否加载某个 Bean。它是 Spring 框架中的一个扩展机制&#xff0c;常用于实现模块化、可配置的组件加载。 本文将详细介绍 Conditional 相关的注解&…

Java高频面试之集合-17

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;JDK 8 对 HashMap 主要做了哪些优化呢&#xff1f;为什么要这么做&#xff1f; JDK 8 对 HashMap 的主要优化及原因 JDK…

力扣DAY24 | 热100 | 回文链表

前言 简单 √ 是反转链表的衍生题&#xff0c;很快写完了。不过没考虑到恢复链表结构的问题。 题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输…

Unity跨平台构建快速回顾

知识点来源&#xff1a;人间自有韬哥在&#xff0c;豆包 目录 一、发布应用程序1. 修改发布必备设置1.1 打开设置面板1.2 修改公司名、游戏项目名、版本号和默认图标1.3 修改 Package Name 和 Minimum API Level 2. 发布应用程序2.1 配置 Build Settings2.2 选择发布选项2.3 构…

手敲NLP相关神经网络,熟悉神经网络的结构与实现!

一、NNLM 二、word2vec 三、TextCNN 四、TextRNN 五、TextLSTM 六、Bi-LSTM 七、seq2seq 八、seq2seq&#xff08;attention&#xff09;

Spring MVC 拦截器使用

javaweb过滤器和springmvc拦截器&#xff1a; 拦截器的概念 拦截器使用 1/创建拦截器类&#xff0c;类中实现 handler执行前&#xff0c;执行后与渲染视图后的具体实现方法 public class GlobalExceptionHandler implements HandlerInterceptor {// if( ! preHandler()){re…

数据库分类、存储引擎、介绍、Mysql、SQL分类

DAY17.1 Java核心基础 数据库 关系型数据库&#xff08;传统数据库&#xff0c;安全可靠&#xff0c;数据量大&#xff09;&#xff1a;Mysql、Oracle、SQLServer 非关系型数据库nosql&#xff08;缓存数据库&#xff0c;高并发项目中&#xff0c;存储热点数据&#xff0c;短信…

Extend module 01:Keyboard

目录 一、Keyboard &#xff08;1&#xff09;资源介绍 &#x1f505;原理图 &#x1f505;扫描原理 &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、Keyboard接口函数封装 三、踩坑日记 &a…

【机器人】复现 GrainGrasp 精细指导的灵巧手抓取

GrainGrasp为每个手指提供细粒度的接触指导&#xff0c;为灵巧手生成精细的抓取策略。 通过单独调整每个手指的接触来实现更稳定的抓取&#xff0c;从而提供了更接近人类能力的抓取指导。 论文地址&#xff1a;GrainGrasp: Dexterous Grasp Generation with Fine-grained Con…