android构建工具gradle基础知识

本文深入解析Gradle的高性能构建原理、安装与配置,讲解GradleWrapper的作用,以及如何利用gradle常用配置提升构建效率,涵盖安装、版本管理、配置方法和实践技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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版本)。

gradle wrapper工作流
在as中,新建的android工程默认都有gradle wrapper了。对于没有gradle wrapper的工程,可以使用gradle提供的wrapper task来创建(需要借助本地安装gradle或者其他项目的gradle wrapper中脚本的gradle能力)。
调用方式如下:

gradlew.bat wrapper  

生成的wrapper的目录如下:
wrapper目录示例
其中生成的gradle-wrapper.jar内容如下,主要是处理了命令和下载的逻辑。
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版本)。
正在下载gradle-wrapper相关源码和文档

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的最大数目,默认是处理器的个数
–prioritygradle进程的优先级,默认值是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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值