1、gradle概述
gradle是一个开源的通用构建工具,可以构建几乎任意类型的产物。针对不同的场景,gradle使用不同的插件和DSL申明配置来共同完成构建。
gradle有如下几个特点:
- 高性能
- 基于jvm,故需要java环境
- 基于协议,即build.gradle中的配置声明等。
- 可扩展,如自定义task及action,自定义插件等。
- 可视化,构建的阶段及task等都可追溯,查看耗时及执行情况等。
- IDE支持,大部分的IDE都支持gradle
2、gradle的安装
gradle是基于groovy语言,而groovy是运行在jvm上的,故gradle的运行也是需要java环境的。 官网上显示gradle需要java 8或者更高版本的java环境。
同时gradle自带了groovy库,所以不需要额外安装groovy。
在安装完成后,注意需要设置GRADLE_HOME环境变量,该变量指向gradle的安装目录。同时,将GRADLE_HOME/bin加入到PATH环境变量中。
这样便可以在任意位置使用gradle命令。 通过gradle -v查看gradle版本信息,如果正常显示,则安装成功。
3、gradle wrapper
在构建时,gradle官方推荐使用Gradle wrapper。gradle wrapper是gradle提供的一个脚本,它会调用在配置中声明的gradle版本,如果该gradle版本不存在时脚本会自动的下载该gradle版本。
这样就避免了开发人员手动的下载gradle,也避免一些不同项目gradle版本不兼容的问题(因为每个项目相当于是使用自己的gradle版本)。
在as中,新建的android工程默认都有gradle wrapper了。对于没有gradle wrapper的工程,可以使用gradle提供的wrapper task来创建(需要借助本地安装gradle或者其他项目的gradle wrapper中脚本的gradle能力)。
调用方式如下:
gradlew.bat wrapper
生成的wrapper的目录如下:
其中生成的gradle-wrapper.jar内容如下,主要是处理了命令和下载的逻辑。
生成的gradle warpper属性文件gradle/wrapper/gradle-wrapper.properties中存放了几个如下信息
1、存储该gradle发行版本的服务器地址。(本地没有该gradle版本会从这个地址下载。在有一些项目中,将已有的gradle的zip文件放在wrapper目录下,同时将该url修改为该zip文件的地址,来避免下载的过程。)
形如: distributionUrl=https://services.gradle.org/distributions/gradle-7.4-bin.zip
2、distributionBase:Gradle解包后存储的主目录。默认是GRADLE_USER_HOME。如果没有设置GRADLE_USER_HOME环境变量,那么默认的地址是用户目录的.gradle(注意前面有点号)文件夹下,如图x。
3、distributionPath:distributionBase指定目录的子目录。distributionBase+distributionPath就是Gradle解包后的存放位置。
4、zipStoreBase:Gradle压缩包存储主目录。
5、zipStorePath:zipStoreBase指定目录的子目录。zipStoreBase+zipStorePath就是Gradle压缩包的存放位置
gradle及gradle.bat分别为shell脚本和批处理脚本,分别在linux(或mac)和windows上使用,脚本主要获取命令行参数,并调用gradle-wrapper.jar中的主类执行相关gradle任务。
以上属性也可通过gradle wrapper 命令的可选项设置,可选项如下:
- –gradle-version 指定gradle版本
- –distribution-type 指定下载的gradle类型,默认为bin类型,即只下载二进制文件,可设置的值为all或者bin。
- –gradle-distribution-url 指定gradle下载地址。 为了加快下载速度,可以更换这个地址为公司内网地址或私服等。
- –gradle-distribution-sha256-sum 指定下载的gradle文件sha256值,用于校验下载的文件是否正确。
使用示例如下,下载gradle 7.4.2带源码版本。
gradlew wrapper --gradle-version 7.4.2 --distribution-type all
执行后,gradle wrapper就会下载对应版本的gradle。 注意distribution-type为all类型的gradle版本,该版本包括了源码和文档(该下载并不是在bin版本基础之上补充下载源码和文档,而是重新下载带有源码和文档的gradle版本)。
关于缓存文件夹的名称规则,参见博客。
4、gradle常用配置
通过对gradle进行相应的配置,可以提升一定的构建性能。gradle的配置可以通过如下四种方式设置,优先级从前到后依次递减。
4.1、命令行参数
在gradle命令行中添加参数来设置。如下列举部分和构建性能相关的选项(其余可选项可通过gradle -h来查看):
参数 | 含义 |
---|---|
–build-cache --no-build-cache | 是否启用构建缓存 |
–configuration-cache --no-configuration-cache | 是否启动configuration阶段的构建缓存 |
–configuration-cache-problems=(fail,warn) | 设置为fail时,构建configure阶段有问题时结束本次构建。 设置为warn时,构建configure阶段有问题时打印日志并继续构建 |
–parallel --no-parallel | 是否以并行方式运行gradle任务 |
–configure-on-demand --no-configure-on-demand | 是否按需配置。(仅配置需要编译的模块) |
–max-workers | 设置wokers的最大数目,默认是处理器的个数 |
–priority | gradle进程的优先级,默认值是default。可选值有low或normal |
–daemon --no-daemon | 是否使用gradle daemon进程进行构建 |
–foreground | 以前台进程的方式运行gradle进程 |
–dry-run/-m | 执行构建时,不执行所有的task |
4.2、系统属性
- 在gradle.properties文件中配置systemProp开头的属性,如
- systemProp.http.proxyHost=127.0.0.1 设置网络代理。
- systemProp.gradle.user.home=”xxx” 设置gradle user home地址
- systemProp.https.protocols=”TLSv1.3” 设置http协议版本
4.3、gradle属性
在gradle.properties文件中配置gradle相关属性。
参数 | 含义 |
---|---|
org.gradle.caching=(true|false) | 设置为true时,gradle在构建时会尽可能的使用前一次构建时task的输出。 默认情况下,该配置为false。 |
org.gradle.caching.debug=(true|false) | 设置为true时,相关hash值和build-cache的key会在控制台打印。 |
org.gradle.configureondemand=(true|false) | 只对必须的模块进行configure。因为gradle构建时每个模块必须经历configure阶段,只对必要的模块进行configure能提升构建速度。 |
org.gradle.console=(auto|plain|rich|verbose) | 控制台以不同形式打印日志。 |
org.gradle.daemon=(true|false) | 是否使用gradle守护进程。使用gradle守护进程构建能避免每次构建时java虚拟机启动的消耗。官方数据表明,开启gradle daemon能显著提高构建速度。故从gradle 3.0开始,该配置项默认为true。 |
org.gradle.daemon.idletimeout=(单位秒) | gradle daemon进程存活的时间,默认是10800000s(3小时) |
org.gradle.debug=(ture|fase) org.gradle.debug.port=(端口号) org.gradle.debug.server=(ture|fase) org.gradle.debug.suspend=(ture|fase) | gradle调试相关的属性。 |
org.gradle.jvmargs | 设置jvm相关参数,配置格式如下: org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 |
org.gradle.logging.level=(quiet,warn,lifecycle,info,debug) | 设置gradle输出日志的级别 |
org.gradle.parallel=(true,false) | 设置gradle是否并行构建。 |
org.gradle.priority=(low,normal) | 设置gradle任务的优先级,默认值是default。 |
org.gradle.vfs.verbose=(true,false) | 当gradle监听系统文件系统开启时打印verbose级别的日志。 默认值为false。 |
org.gradle.vfs.watch=(true,false) | 设置是否监听文件系统。 |
org.gradle.warning.mode=(all,fail,summary,none) | gradle以不同方式打印waring级别日志。默认是summary。 |
org.gradle.workers.max=(max # of worker processes) | gradle以最大的workers构建,默认值为系统处理器的个数。 |
org.gradle.logging.stacktrace=(internal,all,full) | gradle构建发生异常时,异常以不同详尽方式打印。 |
4.4、gradle相关环境变量
GRADLE_OPT 设置jvm一些内存选项的环境变量。
GRADLE_USER_HOME 指定gradle的用户目录。未设置时默认为$USER_HOME/.gradle
JAVA_HOME 指定构建时的java目录
由于gradle提供了如上多种方式来控制gradle表现,同时,gradle属性也可以在多个不同位置的gradle.properties配置文件进行设置。 那么在多个地方对同一个属性设置不同的属性值,最终的属性值该如何确定呢?
当有多个地方设置gradle属性时,按照如下方式来确定最终的属性值。如果某个属性在不同地方重复多次的话,那么第一次出现的属性值将作为最终配置。
- 命令行参数,如在构建时通过-P / --project-prop 添加的配置。
- GRADLE_USER_HOME目录中的gradle.properties
- 项目根目录下的gradle.properties
- gradle的安装目录下的gradle.properties