Gradle概述

Gradle是一个开源的构建自动化工具,专注于灵活性和性能。Gradle构建脚本使用GroovyKotlin 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的核心任务类型,它将文件从一个位置复制到另一个位置。复制任务非常有用(参阅文档了解详细信息),但是在这里,让我们再次保持简单。执行以下步骤:

  1. 创建一个名为 src 的目录。
  2. src 目录中添加一个名为 myfile.txt 的文件。内容可以是任意的(甚至可以是空的),但是为了方便起见,可以添加一行Hello, World!
  3. 在你的 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")
}

在这里,groupdescription 您可以随便写,甚至可以忽略它们

现在来执行您新建 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.propertiesGRADLE_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)

    允许按需孵化配置,Gradle将尝试仅配置必要的项目。

  • 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主目录。可以将值设置为 jdkjre的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)

    设置为allsummary或者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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,306评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,657评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,928评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,688评论 0 220
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,105评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,024评论 1 225
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,159评论 2 318
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,937评论 0 212
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,689评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,851评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,325评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,651评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,364评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,192评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,985评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,154评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,955评论 2 279