Gradle Wrapper 详解

article/2025/10/22 20:37:40

Gradle Wrapper 详解

我们介绍了 Android 项目的目录及 Gradle 配置,我们提到有个目录是/gradle/wrapper。今天这篇文章我们来学习 Gradle Wrapper。通过这篇文章我们将了解什么是 Gradle Wrapper?为什么需要用 Gradle Wrapper?以及 Gradle Wrapper 的重要性。

1. 什么是 Gradle Wrapper?

关于“什么是 Gradle Wrapper?”这个问题在官网是这么定义的:

The recommended way to execute any Gradle build is with the help of the Gradle Wrapper (in short just “Wrapper”). The Wrapper is a script that invokes a declared version of Gradle, downloading it beforehand if necessary. As a result, developers can get up and running with a Gradle project quickly without having to follow manual installation processes saving your company time and money.

大致意思就是:官方建议任何 Gradle 构建方法在 Gradle Wrapper 帮助下运行。Gradle Wrapper 它是一个脚本,调用了已经声明的 Gradle 版本,并且我们编译时需要事先下载它。所以,开发者能够快速的启动并且运行 Gradle 项目,不用再手动安装,从而节省了时间成本。

我们可以称 Gradle Wrapper 为 Gradle 包装器,是将 Gradle 再次包装。让所有的 Gradle 构建方法在 Gradle 包装器的帮助下运行。

2. 为什么需要 Gradle Wrapper?

其实关于这个问题在介绍 Gradle Wrapper 的时候已经回答了。下面我们通过一个开发生活中的案例来形象的介绍一下。我们日常开发中肯定都是一个团队在开发,如果没有 Gradle Wrapper 的话,那么团队中每来一个新同事,就需要在电脑中安装 Gradle 环境。但是有时候我们不同项目 Gradle 的版本又是不一样的,这就为我们的开发工作带来了不便。

于是乎 Gradle 就提供了 Gradle Wrapper,可以让我们的电脑中不安装 Gradle 环境也可以运行 Gradle 项目。这就是上面官方介绍中所说的 Gradle 是一个脚本,调用事先声明的 Gradle 版本,编译前去下载它,这样我们的电脑中就不用再去手动安装 Gradle 环境了,从而间接的提高了我们的开发效率。

我们可以看到 AndroidStudio 创建项目时默认会创建 Gradle Wrapper 目录,这也就是我们不用去手动安装 Gradle 环境的原因。Gradle Wrapper 的工作流程图如下:

图片描述

它的流程主要分为 3 步走:

首先当我们刚创建的时候,如果指定的版本没有被下载,就先会去 Gradle 的服务器中下载对应版本的压缩包,下载完成后需要先进行解压缩并且执行批处理文件,后续项目每次构建都会重用这个解压过的 Gradle 版本。

3. 如何构建 Gradle Wrapper?

要想构建 Gradle Wrapper 就必须本地先配置了 Gradle 环境变量,具体的配置方法可以参考《构建自己的 Gradle 工程》中关于 Gradle 环境变量的配置。Gradle 的命令中已经内置了 wrapper 命令,其实就是执行 warpper 任务。该任务就是生成我们前面说的 gradle 文件夹及它的子目录 wrapper 文件夹。在根目录下我们先删掉 gradle 文件夹,然后在项目根目录执行gradle wrapper命令。

我们会看到会重新生成 Gradle 文件夹,目录结构如我们上节中的一样如下。

图片描述

这两个文件的含义如下:

  • gradle-wrapper.jar: 既然是 jar 包,那么它肯定是包含了 Gradle 运行时的逻辑代码;
  • gradle-wrapper.properties: 这个文件主要负责配置 Gradle wrapper 运行时的属性文件,声明具体使用哪个版本的 Gradle。

4. 配置 Gradle Wrapper

我们上面说gradle-wrapper.properties文件指明了 Gradle 的版本号,和 Gradle 运行时的行为属性文件。下面我们具体看下这个文件的内容:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

关于每个字段的意思如下:

  1. distributionBase: Gradle 解包后存储的父目录;
  2. distributionPath: distributionBase指定目录的子目录。distributionBase+distributionPath就是 Gradle 解包后的存放的具体目录;
  3. distributionUrl: Gradle 指定版本的压缩包下载地址;
  4. zipStoreBase: Gradle 压缩包下载后存储父目录;
  5. zipStorePath: zipStoreBase指定目录的子目录。zipStoreBase+zipStorePath就是 Gradle 压缩包的存放位置。

Tips: 这里我们需要关注 distributionUrl 这个字段,我们经常会遇到升级 AndroidStudio 后项目初始化编译缓慢的问题。这个问题就是升级后 AndroidStudio 会自定改掉gradle-wrapper.properties里面 distributionUrl 字段 Gradle 的版本号。遇到这个问题我们不慌,可以将该字段改为我们本地已经下载好的版本号。修改完成后重启 AndroidStudio 就可以很快编译通过了。

5. 使用 Gradle Wrapper 下载 Gradle

使用 Gradle wrapper 下载 Gradle 我们可以点击 AS 界面上的同步按钮,也可以使用 gradlew 命令来执行 gradle 命令来下载,下面以 Windows 系统为例,我本地distributionUrl配置的 Gradle 版本是gradle-6.0.1-bin.zip,我们现在改为gradle-5.0-all.zip版本,执行clean命令,看看有没有下载 5.0 版本下载:

C:\Users\fate\Documents\MyApplication>gradlew clean
Downloading https://services.gradle.org/distributions/gradle-5.0-all.zip
............10%............20%.............30%............40%............50%.............60%............70%.............80%............90%............100%Welcome to Gradle 5.0!BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 up-to-date

我们看到这里已经下载了 gradle 5.0 版本,那么按照前面所说,再次执行命令,直接调用本地的 Gradle,不会去下载我们来看下:

C:\Users\fate\Documents\MyApplication>gradlew cleanDeprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.0/userguide/command_line_interface.html#sec:command_line_warningsBUILD SUCCESSFUL in 1s
2 actionable tasks: 2 up-to-date

我们看到这里没有再去下载 Gradle 版本了而是直接使用上次下载的缓存下来的。

6. 升级Gradle Wrapper

升级 Gradle Wrapper 有 2 种方式:

  1. 一种是我们前面演示的,直接修改distributionUrl字段,然后执行Gradle 命令或是点击同步按钮同步。
  2. 还有一种就是执行 gradlew 命令gradlew wrapper –-gradle-version [version]这里我们将 5.0 升级为最新版 6.0.1.
C:\Users\fate\Documents\MyApplication>gradlew wrapper --gradle-version 6.0.1Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.0.1/userguide/command_line_interface.html#sec:command_line_warningsBUILD SUCCESSFUL in 1s
1 actionable task: 1 up-to-date

然后我们使用gradlew -v查看当前的 Gradle 版本号:

C:\Users\fate\Documents\MyApplication>gradlew -v------------------------------------------------------------
Gradle 6.0.1
------------------------------------------------------------Build time:   2019-11-18 20:25:01 UTC
Revision:     fad121066a68c4701acd362daf4287a7c309a0f5Kotlin:       1.3.50
Groovy:       2.5.8
Ant:          Apache Ant(TM) version 1.10.7 compiled on September 1 2019
JVM:          1.8.0_221 (Oracle Corporation 25.221-b11)
OS:           Windows 10 10.0 amd64

我们看到此时版本号已经升级为 6.0.1了。

7. 自定义 Gradle Wrapper

AndroidStudio 中 Gradle 内置了 Wrapper 任务,因此我们可以直接执行 Gradle wrapper。既然他是一个任务,那么我们其实也可以自定义这个任务,定义该任务我们可以指定上面gradle-wrapper.properties文件中的字段,如下所示:

task wrapper(type: Wrapper) {gradleVersion = '6.0.1'distributionUrl = '../../gradle-6.0.1-bin.zip'distributionPath=wrapper/dists
}

Tips: 这里自定义 wrapper 时,我们可以将distributionUrl字段指定为本地的目录。

8.Gradle版本与Gradle插件版本

Gradle版配置位置:

gradle-wrapper.properties中:

distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip

Gradle插件版本配置位置:

project对应的build.gradle文件中:

    dependencies {classpath "com.android.tools.build:gradle:4.1.2"}

对应关系:Gradle和插件版本

插件版本所需的 Gradle 版本
1.0.0 - 1.1.32.2.1 - 2.3
1.2.0 - 1.3.12.2.1 - 2.9
1.5.02.2.1 - 2.13
2.0.0 - 2.1.22.10 - 2.13
2.1.3 - 2.2.32.14.1+
2.3.0+3.3+
3.0.0+4.1+
3.1.0+4.4+
3.2.0 - 3.2.14.6+
3.3.0 - 3.3.34.10.1+
3.4.0 - 3.4.35.1.1+
3.5.0 - 3.5.45.4.1+
3.6.0 - 3.6.45.6.4+
4.0.0+6.1.1+
4.1.0+6.5+

9. 小结

这篇文章我们学习了 Gradle Wrapper,已经它的重要性和一些基本的操作。关于这个平时我们基本上用不到,所以只需要理解其原理就行了,唯一要注意的就是我们升级 AndroidStudio 后,项目第一次打开初始化编译换慢,这时候是因为系统更改了 gradle wrapper 中的 Gradle 版本,由于 Gradle 服务器在国外国内访问受限,所以我们可以将 Gradle 版本修改为之前本地下载过的版本号,然后重启 APP 就好了。

 


http://chatgpt.dhexx.cn/article/gZcbau2D.shtml

相关文章

wrapper java 64_Wrapper配置详解及高级应用

将一个简单的程度如HelloWorld 的应用包装秤Wrapper 服务并不复杂,甚至可以认为非常简单。但是实际项目应用过程中我们的程序一般较庞大,运行环境也较复杂。 通过Wrapper 配置文件的分析与配置进一步了解构建Wrapper 服务需要注意的关键点及重要部分。 首…

RDP Wrapper

说到要在非Windows Server版本上实现多用户远程桌面连接 ,我们都知道一个大名鼎鼎的软件RDP Wrapper Library,它是开源的,所有秘密作者都没有保留,所有问题全部在GitHub上面写的清清楚楚,在这里感谢这些伟大的人&#…

wrapper后台启动java程序

文章目录 1,下载wrapper2,使用wrapper后台启动java程序2.1,编写java样例程序2.2,配置wrapper2.3,拷贝启动脚本2.4,启动服务 1,下载wrapper 下载地址:https://wrapper.tanukisoftwar…

Java常用类-包装类(Wrapper)简单介绍

目录 前言1、包装类(Wrapper) 前言 本文主要介绍java中的包装类 1、包装类(Wrapper) Java是面向对象的编程语言,但它也包含了8种基本数据类型,这8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备“对象”的特性&#…

强大的wrapper

最近在看大数据和容器相关的东西,发现有一个模式被反复使用到,关键是被用的很恰当且优雅,并能在这些关键技术中都发挥着至关重要的核心作用。我想你已经猜到了,他就是Eminem——强大的rapper——哦,不对,是…

mybatis-plus中wrapper的用法(详细)

用到了wrapper,ge、le、ne、eq等的用法,及多表查询自写sql整理资料记录一下,以备后续复习。 目录------------(可点击相应目录直接跳转) 一、条件构造器关系介绍 条件构造器关系介绍 : wapper介绍 &…

锚点(anchorPoint)

转载请说明出处,谢谢。 原文出处:点击打开链接 今天研究了一下关于layer的anchorPoint问题。 附图: 原文出处:点击打开链接 位置坐标 position+anchorPoint(左下角0,0原点坐标系)。 要确…

cocos2d-x中的锚点(AnchorPoint)理解

锚点的定义 锚点是指节点在进行形状变换、位置变动时依据的基准点。可以想象为钉在墙上用于固定纸张的小图钉,或者公告栏上用于固定纸张用的围棋状的小磁粒。当对某个节点调用setPosition时,cocos2d-x即会将其锚点移动到相应位置;当对节点进行…

cocos2d-x3.2总结(一)Position和AnchorPoint的关系

当cocos2d-x引擎需要绘图时,就需要Position和AnchorPoint等属性。例如:在创建一个Sprite时,要设置Sprite的Position,而我们常常没有设置AnchorPoint,这是因为精灵的AnchorPoint默认值为(0.5,0.5&#xff09…

Anchor3

这里介绍如何修改 Anchor 的尺寸来提高小目标的检测效果,算法tricks优化小目标检测 修改 Anchor 尺寸 在实际的应用场景中,我们按照 MS COCO 标准中把大小不大于 32x32 或者占原始图片比率不足 0.01 的目标物体定义为一个小目标物体。 在使用 Anchor 的检测算法&…

ios-anchorPoint、position理解

anchorPoint(锚点)是layer的一个属性,下面我们来看看其对view的影响,本文主要通过图片方式展现: 锚点用单位坐标来描述也就是图层的相对坐标。在苹果文档中说明左下是(0,0),右上是(1,1),mac系统…

Anderson‘s pointer analysis

本文是垃圾文章,请直接学习其它资料 南京大学《软件分析》课程08(Pointer Analysis)https://www.cs.cmu.edu/~aldrich/courses/15-819O-13sp/resources/pointer.pdf 指针分析 指针分析是一类特殊的数据流问题,它是其它静态程序分析…

iOS围绕某点缩放或旋转的AnchorPoint的设定

经常会遇到需求,要求手势的缩放或者旋转操作,要求动作变化围绕某一个特定点,或者是两指的中心点,或者是某一个点。 这个问题首先要清晰的知道,iOS各个view的层次关系。特别是,要清除的知道,当前…

彻底理解CALayer的position与anchorPoint

引言 相信初接触到CALayer的人都会遇到以下几个问题: 为什么修改anchorPoint会移动layer的位置? CALayer的position点是哪一点呢? anchorPoint与position有什么关系? 我也迷惑过,找过网上的教程,大部分都是复制粘…

position和anchorPoint

本人录制技术视频地址: https://edu.csdn.net/lecturer/1899 欢迎观看。 一、理论概述 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) prop…

Ant Design - Anchor

Anchor锚点 此组件的属性有以下几点: 现在给出一份例子 其他属性都很简单就不多说了,主要我遇到的麻烦是 getContainer 属性 锚点是默认body滚动的,所以如果你滚动的区域是body就会看到锚点的小蓝点是会随内容滚动的,但是如果你…

Anchor Point

On default, CCNode’s anchor point is (0, 0), which is at the left-bottom point. CCSprite’s anchor point is (0.5, 0.5), which is at the center. 如果你把一个CCSprite作为child加入到CCNode中,CCNode的anchor point不会对sprite的位置有影响,…

【Cocos2d-x 3.0学习笔记】 AnchorPoint 和Position 关系

先不多说,上两张图片: 解释一下上面图片的意思: 描点就是图片中红点的位置。setAnchorPoint的取值范围0~1,距离设置的是一张图片 setAnchorPoint(Point(0,0))表示在图片左下角, setAnchorPoint(Point(1,1))表示在图片…

iOS开发之layer.frame,layer.anchorPoint,layer.position对frame的影响

最近遇到相关的问题,所以就将这三个属性值,进行了分析和研究,话不多说,直接上代码了,详细的文字描述都在代码中,可以自行查看。 之前还写了一篇文章,也可以同时查看一下: iOS开发之…

anchorPoint

OS开发UI篇—CAlayer层的属性 一、position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint property CGPoint position; 用来设置CALayer在父层中的位置 以父层的左上角为原点(0, 0) property CGPoint anchorPoint; 称为“定位点”、“…