Gradle概述
Gradle是一个开源的构建自动化工具,专注于灵活性和性能。Gradle构建脚本使用Groovy或Kotlin DSL 编写。
- 高度可定制 - Gradle以一种可以以最基本的方式定制和扩展的方式建模。
- 快速 - Gradle通过重用先前执行的输出,仅处理已更改的输入以及并行执行任务来快速完成任务。
- 功能强大 - Gradle是Android的官方构建工具,并支持许多流行的语言和技术。
安装Gradle
您可以在Linux,macOS或Windows上安装Gradle构建工具。
先决条件
Gradle在所有主要操作系统上运行,只需运行Java Development Kit 8或更高版本。检查,运行java -version
。你应该看到这样的东西:
$ java-version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
Gradle附带了自己的Groovy库,因此不需要安装Groovy。Gradle忽略任何现有的Groovy安装。
Gradle使用它在路径中找到的任何JDK。或者,您可以将JAVA_HOME
环境变量设置为指向所需JDK的安装目录。
使用包管理器进行安装
Homebrew
$ brew install gradle
手动安装
1. 下载最新的Gradle版本
2.解压zip包
将分发zip文件解压缩到您选择的目录中,例如:
$ mkdir /opt/gradle
$ unzip -d /opt/gradle gradle-5.5.1-bin.zip
$ ls /opt/gradle/gradle-5.5.1
LICENSE NOTICE bin getting-started.html init.d lib media
3.配置系统环境
要运行Gradle,首先添加环境变量GRADLE_HOME
。这应该指向Gradle网站上的解压缩文件。接下来添加*GRADLE_HOME*/bin
到您的PATH
环境变量。通常,这足以运行Gradle。
配置PATH
环境变量以包含bin
解压缩分发的目录,例如:
$ export PATH=$PATH:/opt/gradle/gradle-5.5.1/bin
4.验证安装
打开控制台并运行gradle -v
以运行gradle并显示版本,例如:
$ gradle -v
------------------------------------------------------------
Gradle 5.5.1
------------------------------------------------------------
(environment specific information)
创建新的Gradle项目
1.初始化一个项目
首先,让我们为新项目创建一个新的目录。
❯ mkdir basic-demo
❯ cd basic-demo
现在我们可以使用Gradle的 gradle init
命令来生成一个简单的项目。然后查看生成的所有内容,以便知道发生了什么。
❯ gradle init
Starting a Gradle Daemon (subsequent builds will be faster)
BUILD SUCCESSFUL in 3s
2 actionable tasks: 2 executed
如果你想使用 Kotlin DSL 脚本,可以使用
gradle init --dsl kotlin
命令。更多信息可以阅读 详细文档.
这就是Gradle为您生成的内容。
Groovy
.
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
Kotlin
.
├── build.gradle.kts
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle.kts
build.gradle 用于配置当前项目的Gradle构建脚本
gradle-wrapper.jar Gradle Wrapper可执行JAR
gradle-wrapper.properties Gradle Wrapper配置属性
gradlew 基于Unix的系统的Gradle Wrapper脚本
gradlew.bat 适用于Windows的Gradle Wrapper脚本
settings.gradle 用于配置Gradle构建的Gradle设置脚本
2.创建一个任务
Gradle提供了用于通过基于Groovy或Kotlin的DSL脚本创建和配置任务的API。 Project
(项目)包括一组任务,每个任务执行一些基本操作。
Gradle提供了一个任务库,您可以在自己的项目中配置它。例如,有一个名为Copy的核心任务类型,它将文件从一个位置复制到另一个位置。复制任务非常有用(参阅文档了解详细信息),但是在这里,让我们再次保持简单。执行以下步骤:
- 创建一个名为
src
的目录。 - 在
src
目录中添加一个名为myfile.txt
的文件。内容可以是任意的(甚至可以是空的),但是为了方便起见,可以添加一行Hello, World!
。 - 在你的
build.gradle
文件中定义一个类型为Copy
(注意首字母大写)名称为copy
的任务来复制src
目录到一个名为dest
的目录(你不必去手动创建dest
目录,因为任务会为你去创建)。
build.gradle width Groovy
task copy(type: Copy, group: "Custom", description: "Copies sources to the dest directory") {
from "src"
into "dest"
}
build.gradle.kts width Kotlin
tasks.create<Copy>("copy") {
description = "Copies sources to the dest directory"
group = "Custom"
from("src")
into("dest")
}
在这里,group
和 description
您可以随便写,甚至可以忽略它们
现在来执行您新建 copy
任务:
$./gradlew copy
> Task :copy
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
们可以检查一下 dest
目录中是否存在名为 myfile.txt
的文件并且它的内容和 src
目录中的文件一样,来验证 copy
任务是否成功执行。
探索和调试项目
发现可用的任务
tasks
命令可以列出了可用的Gradle任务,包括您刚刚添加的自定义任务。
$ ./gradlew tasks
> Task :tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Custom tasks
------------
copy - Copies sources to the dest directory
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'basic-demo'.
components - Displays the components produced by root project 'basic-demo'. [incubating]
dependencies - Displays all dependencies declared in root project 'basic-demo'.
dependencyInsight - Displays the insight into a specific dependency in root project 'basic-demo'.
dependentComponents - Displays the dependent components of components in root project 'basic-demo'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'basic-demo'. [incubating]
projects - Displays the sub-projects of root project 'basic-demo'.
properties - Displays the properties of root project 'basic-demo'.
tasks - Displays the tasks runnable from root project 'basic-demo'.
To see all tasks and more detail, run gradlew tasks --all
To see more detail about a task, run gradlew help --task <task>
BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed
分析和调试项目
Gradle还提供了一个丰富的、基于web的构建视图,叫做 build scan(构建扫描)。
尝试在执行任务时添加 --scan
来创建构建扫描。
$ ./gradlew copy --scan
BUILD SUCCESSFUL in 0s
Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]
yes
Gradle Terms of Service accepted.
Publishing build scan...
https://gradle.com/s/tetv3tbxy3wr4
如果您浏览您的 build scan ,您应该能够很容易地找到在哪里执行的任务,它们花费了多少时间,应用了哪些插件,等等。
发现可用的属性
properties
命令告诉您项目的属性。
$ ./gradlew properties
> Task :properties
------------------------------------------------------------
Root project
------------------------------------------------------------
allprojects: [root project 'basic-demo']
ant: org.gradle.api.internal.project.DefaultAntBuilder@33ad4252
antBuilderFactory: org.gradle.api.internal.project.DefaultAntBuilderFactory@609be032
artifacts: org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler_Decorated@1b9242eb
asDynamicObject: DynamicObject for root project 'basic-demo'
baseClassLoaderScope: org.gradle.api.internal.initialization.DefaultClassLoaderScope@35dd98fd
buildDir: /Users/huangyoubin/Desktop/basic-demo/build
buildFile: /Users/huangyoubin/Desktop/basic-demo/build.gradle
buildPath: :
buildScriptSource: org.gradle.groovy.scripts.TextResourceScriptSource@6cbbe3c6
buildscript: org.gradle.api.internal.initialization.DefaultScriptHandler@539e0413
childProjects: {}
...
配置构建环境
Gradle提供了多种机制来配置Gradle本身和特定项目的行为
配置Gradle行为时,您可以使用这些方法,按从最高优先级到最低优先级的顺序列出(前一个获胜):
-
Command-line flags
例如--build-cache
. 它们优先于System properties
和环境变量。 -
System properties
例如systemProp.http.proxyHost=somehost.org
存储在gradle.properties
文件中。 -
Gradle属性
例如org.gradle.caching=true
通常存储在项目根目录的gradle.properties
中 -
环境变量
例如GRADLE_OPTS
由执行Gradle的环境提供的
Gradle属性
Gradle提供了几个选项,可以轻松配置将用于执行构建的Java进程。
为构建设置一致的环境需要将这些设置放入gradle.properties
文件。配置按以下顺序应用(如果在多个位置配置选项,则最后一个获胜):
-
gradle.properties
在Gradle安装目录中。 -
gradle.properties
在项目根目录中。 -
gradle.properties
在GRADLE_USER_HOME
目录中。 - 系统属性,例如在
-Dgradle.user.home
命令行上设置的时间。
以下属性可用于配置Gradle构建环境:
-
org.gradle.caching=(true,false)
设置为true时,Gradle将尽可能重用任何先前构建的任务输出,从而使构建速度更快。
-
org.gradle.caching.debug=(true,false)
设置为true时,将在控制台上记录各个输入属性哈希值以及每个任务的构建缓存键。
-
org.gradle.configureondemand=(true,false)
-
org.gradle.console=(auto,plain,rich,verbose)
自定义控制台输出着色或详细程度。默认值取决于Gradle的调用方式。
-
org.gradle.daemon=(true,false)
当设置
true
将使用Gradele守护进程来运行构建。默认是true
。 -
org.gradle.daemon.idletimeout=(# of idle millis)
Gradle守护程序将在指定的空闲毫秒数后自行终止。默认为
10800000
(3小时)。 -
org.gradle.debug=(true,false)
设置
true
为时,Gradle运行构建将启用远程调试,侦听端口5005.请注意,这相当于添加-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
到JVM命令行,并将挂起虚拟机,直到连接调试器。默认是false
。 -
org.gradle.java.home=(path to JDK home)
指定Gradle构建过程的Java主目录。可以将值设置为
jdk
或jre
的Path,但是,根据构建的功能,使用JDK会更安全。如果未指定设置,则会从您的环境(JAVA_HOME
或路径java
)派生合理的默认值。 -
org.gradle.jvmargs=(JVM arguments)
指定用于Gradle守护程序的JVM参数
-
org.gradle.logging.level=(quiet,warn,lifecycle,info,debug)
当设置为quiet,warn,lifecycle,info或debug时,Gradle将使用此日志级别。值不区分大小写。
lifecycle
级别是缺省值。 -
org.gradle.parallel=(true,false)
开启并行编译
-
org.gradle.warning.mode=(all,none,summary)
设置为
all
,summary
或者none
,Gradle将使用不同的警告类型显示。 -
org.gradle.workers.max=(max # of worker processes)
配置后,Gradle最大将使用给定数量的工作者。默认值是CPU处理器数。
-
org.gradle.priority=(low,normal)
指定Gradle守护程序的调度优先级以及它启动的所有进程。默认是
normal
配置JVM内存
可以通过以下方式调整Gradle的JVM选项:
org.gradle.jvmargs
属性控制虚拟机上运行的配置。它默认为-Xmx512m "-XX:MaxMetaspaceSize=256m"
更改构建VM的JVM设置
org.gradle.jvmargs = -Xmx2g -XX:MaxMetaspaceSize = 512m -XX:+ HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8
Gradle Daemon
Gradle在Java虚拟机(JVM)上运行,并使用几个需要初始化时间很长的支持库。因此,有时开始时看起来有点慢。这个问题的解决方案是Gradle 守护程序:一个长期存在的后台进程,它比其他情况下更快地执行构建。我们通过在内存中保存有关项目的数据以及利用缓存来避免昂贵的初始化过程。使用守护程序运行Gradle构建与没有守护程序没有区别。只需配置您是否要使用它 - 其他一切都由Gradle透明处理。
为什么Gradle Daemon对性能很重要
守护进程是一个长期存在的进程,因此我们不仅能够避免每次构建的JVM启动成本,而且还能够在内存中缓存有关项目结构,文件,任务等的信息。
原因很简单:通过重用以前版本的计算来提高构建速度。但是,好处是显着的:我们通常会在后续构建中测量构建时间减少15-75%。我们建议您使用--profile
了解Gradle Daemon对您可能产生的影响来分析您的构建。
默认情况下,Gradle守护程序从Gradle 3.0开始启用,因此您无需执行任何操作即可从中受益。
守护程序状态
获取正在运行的Gradle守护程序及其状态的列表,请使用--status
命令
$ gradle --status
PID STATUS INFO
28278 IDLE 5.5.1
Only Daemons for the current Gradle version are displayed.
目前,Gradle只能连接到同一版本的守护进程。这意味着状态输出将仅显示被调用的Gradle版本的守护进程,而不显示任何其他版本。
禁用守护程序
默认情况下启用Gradle守护程序,我们建议始终启用它。有几种方法可以禁用守护程序,但最常见的方法是添加该行
org.gradle.daemon=false
到文件«USER_HOME»/.gradle/gradle.properties
停止现有守护进程
守护进程是一个后台进程。每个守护进程监视其内存使用情况与总系统内存的比较,并在可用系统内存不足时空闲时自动停止。如果您想出于任何原因显式停止运行Daemon进程,只需使用该命令即可gradle --stop
。