Android开发Android开发经验谈Android开发

Gradle概述

2019-07-31  本文已影响7人  小村医

Gradle是一个开源的构建自动化工具,专注于灵活性和性能。Gradle构建脚本使用GroovyKotlin DSL 编写。

安装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行为时,您可以使用这些方法,按从最高优先级到最低优先级的顺序列出(前一个获胜):

Gradle属性

Gradle提供了几个选项,可以轻松配置将用于执行构建的Java进程。

为构建设置一致的环境需要将这些设置放入gradle.properties文件。配置按以下顺序应用(如果在多个位置配置选项,则最后一个获胜):

以下属性可用于配置Gradle构建环境:

配置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

上一篇下一篇

猜你喜欢

热点阅读