在Android Studio中,Gradle是什么?

1442

Gradle对我来说有点困惑,对于任何新的Android开发者也是一样。有人能解释一下Android Studio中的Gradle是什么以及其目的是什么吗?为什么它被包含在Android Studio中?


4
请访问 http://www.gradle.org/。 - Eng.Fouad
14
为了回答为什么你需要像Gradle这样的构建工具,可以查看Jeff Atwood的这篇文章:《F5按键并不是构建过程》,链接在此:http://www.codinghorror.com/blog/2007/10/the-f5-key-is-not-a-build-process.html - Adam S
931
当有人在这里提出一个问题,而在谷歌上关于这个问题确实有很多链接时,他们真正想要的是用通俗易懂的语言回答这个问题,并将其放在背景下,比如为什么我们需要它,谁会最常使用它,在Android Studio中构建Android应用程序时是否需要了解它等等。因为在谷歌上找到的大多数链接都是以“技术术语”写成的,对于初学者来说这很令人困惑。 - Azurespot
5
@NoniA. 恰好也是我的想法。我还有点困惑,gradle只是编译我所写代码的后台进程吗?此外,在查看了许多其他答案后,它们提到了依赖项。那些是什么?非常感谢! Gradle是一种构建工具,用于构建和管理项目。它可以帮助你编译、测试、打包和部署应用程序,并处理依赖项。依赖项是指你的代码需要使用的其他库或框架。Gradle将下载这些依赖项并将它们添加到你的项目中,以便在构建和运行时使用。 - user5562706
11
Gradle 是 Android 开发者最令人头痛的部分。当它要求您将项目升级到最新版本的 Gradle 时,请三思而后行,并确保首先备份。根据我的经验,几乎每次升级到新版本都会导致数小时的搜索,以尝试找出为什么它会破坏我的项目。不太愉快! - Anthony.
显示剩余5条评论
27个回答

1663

简短回答

Gradle 是一个构建系统。

详细回答

在使用 Android Studio 之前,您可能使用 Eclipse 进行开发,而且很有可能不知道如何在没有 Eclipse 的情况下构建 Android APK

您可以在命令行上执行此操作,但必须学习 SDK 中每个工具(dxAAPT)的作用。Eclipse 通过提供自己的构建系统,使我们摆脱了这些低级但重要的基本细节。

现在,您是否曾想过为什么 res 文件夹与您的 src 文件夹在同一目录中?

这就是构建系统的作用。构建系统会自动获取所有源文件(.java.xml),然后应用适当的工具(例如,将.java类文件转换成.dex文件),并将它们全部组合成一个压缩文件-我们心爱的APK。

这个构建系统使用一些约定:其中之一是指定包含源文件(在Eclipse中为\src文件夹)或资源文件(在Eclipse中为\res文件夹)的目录。

为了自动化所有这些任务,必须有一个脚本;您可以使用Linux中的shell脚本或Windows中的批处理语法编写自己的构建系统。

Gradle是另一个构建系统,它汲取了其他构建系统的最佳特点,并将其结合在一起。它改进了他们的不足之处。它是基于JVM的构建系统。这意味着您可以在Java中编写自己的脚本,Android Studio将利用它们。

Gradle的一个很酷的特点是它是一个基于插件的系统。这意味着如果你有自己的编程语言,想要自动化构建某些包(例如Java的JAR文件)的任务,那么你可以用Java或Groovy(或Kotlin,请参见here)编写完整的插件,并将其分发给全世界。
为什么Google会使用它呢?Google看到了市场上最先进的构建系统之一,并意识到您可以编写自己的脚本,几乎不需要学习曲线,而且无需学习Groovy或任何其他新语言。因此,他们为Gradle编写了Android插件。
您一定已经看到了项目中的build.gradlebuild.gradle.kts文件。这是您可以编写脚本来自动化任务的地方。在这些文件中看到的代码是Groovy或Kotlin代码。如果您编写System.out.println("Hello Gradle!");,那么它将在控制台上打印出来。
在构建脚本中可以做什么?
一个简单的例子是在实际构建过程发生之前,必须将一些文件从一个目录复制到另一个目录。Gradle构建脚本可以完成此操作。

15
我必须说,当我将一个 Android Studio 项目从一个位置移动到另一个位置时,Gradle 给了我很多麻烦。版本不匹配、缺失的模块等等问题,都让我很难受。最终,我重新创建了项目框架,并将旧项目中的代码部分剪切/粘贴到新项目中。而且这是在 Windows 平台上进行的,既是源地也是目的地。现在我要将它移动到一个基于 Linux 的实验室中。 - jfmessier
34
我不理解的是为什么每次我创建项目或者编译时,Gradle都要尝试连接到互联网。 - AaA
6
我认为IntelliJ已经知道如何构建Android项目,不需要另一个构建系统。 - Arne Evertsson
25
Gradle相较于Android Studio之前的构建系统的另一个关键优势在于依赖管理。以前,要在项目中使用Android库,需要下载源代码,将其添加到项目中并与项目一起编译。而使用Gradle,则只需在build.gradle文件中添加一行代码,Gradle就会从公共存储库中下载已编译好的库文件,并将其添加到项目中。一些示例:http://blog.teamtreehouse.com/android-libraries-use-every-project 对于标准的Java Jar文件,也可以这样操作,而不必将它们放在lib目录中。 - Stan Kurdziel
16
Gradle是一个糟糕的构建系统。在使用Android Studio时,我希望它能负责构建。我不明白为什么添加一些类会强制Gradle在可用之前进行同步。 相比之下,与Visual Studio(甚至X-Code)一起工作很棒- 不需要恶心的额外设置。IDE可以构建项目和解决方案,而不需要在随机文件中调整设置,以满足Android构建过程在某些时候或旧项目更新时所需的条件。Gradle是Android体验中最糟糕的部分。 - csmith
显示剩余12条评论

177

这是谷歌想要用于Android的新构建工具。由于它比Ant更加可扩展和实用,因此被采用。旨在增强开发者的体验。

您可以观看来自Android开发团队的Xavier Ducrohet在Google I/O上的演讲。

还有另一场由Xavier和Tor Norbye进行的关于Android Studio的讲座,也在Google I/O期间发布。


5
我认为IntelliJ已经知道如何构建Android项目,不需要另一个构建系统。 - Arne Evertsson
2
那么,Gradle只是编译我所写代码的后台进程吗?此外,在查看了许多其他答案之后,它们提到了依赖项。那些是什么?非常感谢,Daniel! - user5562706
4
它不会编译代码,但它负责调用能够编译你的代码的可执行文件。在编译你的代码之后,它还可以运行其他任务来打包它,将其复制到你选择的目录中,然后可能再上传到某个服务器上...这就是Gradle或任何构建系统所做的任务。 - Michael Berry

75

Gradle是在Android Studio上运行的构建系统。

其他语言中的构建系统例如:


30
当你说Gradle类似于make时,我就理解了它的概念。 - user3405291
4
PHING是PHP的一个构建工具。 - Yousha Aleayoub
24
我找到了一个学习不熟悉工具及其在管线中作用的最快途径,就是在Google中输入该工具的名称和“vs”。搜索结果通常会显示“X vs Y”,其中Y是你更熟悉的其他工具。 - James Kuang
1
JavaScript 的 Webpack - codepig
2
Linux不是一种编程语言。它主要用于C语言开发。也许可以说是“在Linux上使用C语言”? - Peter Mortensen
也许可以为C++添加CMake?并且为JavaScript(Web)添加Webpack - Peter Mortensen

54

这里有关于Gradle是什么以及如何在Android Studio中使用它的详细说明。

探索Gradle文件

  1. 每当你在Android Studio中创建一个项目时,构建系统会自动生成所有必要的Gradle构建文件。

Gradle构建文件

  1. Gradle构建文件使用一种领域特定语言或DSL来定义自定义构建逻辑,并与Android插件的Android特定元素交互。

  2. Android Studio项目由一个或多个模块组成,这些模块是您可以独立构建、测试和调试的组件。每个模块都有自己的构建文件,因此每个Android Studio项目都包含两种Gradle构建文件。

  3. 顶层构建文件:在这里,您将找到适用于组成您的项目的所有模块的配置选项。

  4. 模块级别构建文件:每个模块都有自己的Gradle构建文件,其中包含特定于模块的构建设置。您将花费大部分时间编辑模块级别的构建文件,而不是您项目的顶层构建文件。

要查看这些build.gradle文件,请打开Android Studio的Project面板(选择Project选项卡),然后展开Gradle Scripts文件夹。 Gradle Scripts文件夹中的前两个项目是项目级别和模块级别的Gradle构建文件。

顶级 Gradle 构建文件

每个 Android Studio 项目都包含一个单独的顶级 Gradle 构建文件。这个 build.gradle 文件是出现在 Gradle Scripts 文件夹中的第一项,并且明确标记为 Project。

大多数情况下,您不需要对此文件进行任何更改,但了解其内容和在您的项目中所起的作用仍然很有用。

模块级 Gradle 构建文件

除了项目级别的 Gradle 构建文件之外,每个模块都有自己的 Gradle 构建文件。下面是一个基本的、带有注释的模块级 Gradle 构建文件。

其他 Gradle 文件

除了 build.gradle 文件之外,您的 Gradle Scripts 文件夹还包含其他一些 Gradle 文件。大多数情况下,您不必手动编辑这些文件,因为当您对项目进行任何相关更改时,它们会自动更新。但是,理解这些文件在您的项目中所起的作用是一个好主意。

gradle-wrapper.properties(Gradle 版本)

这个文件可以让其他人构建你的代码,即使他们的机器上没有安装Gradle。这个文件会检查是否安装了正确的Gradle版本,如果需要则下载所需版本。

settings.gradle

这个文件引用了组成您项目的所有模块。

gradle.properties (项目属性)

这个文件包含整个项目的配置信息。默认情况下为空,但是您可以通过将它们添加到此文件中来应用各种属性到您的项目中。

local.properties (SDK位置)

这个文件告诉Android Gradle插件它可以在哪里找到您的Android SDK安装。

注意:local.properties包含特定于Android SDK本地安装的信息。这意味着您不应该将此文件纳入源代码控制。

建议阅读 - Tutsplus教程

我从这篇文章中对Gradle有了清晰的理解。


2
请注意,仅链接答案是不被鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的摘要,将链接作为参考。 - kleopatra

34

Gradle是一种构建工具,用于构建程序的源代码。因此它是Android Studio的重要组成部分,在开始开发应用程序之前需要安装。

我们不必单独安装它,因为当我们创建第一个项目时,Android Studio会为我们安装它。


4
“构建程序源代码”是什么意思?这不是开发人员的工作吗? - committedandroider
这个回答在措辞上完全是错误的。Gradle是随Android Studio捆绑提供的打包工具,它负责构建apk。源代码始终由编译器构建,没有其他东西。 - AutomEng
然而从另一个问题来看,似乎Gradle没有可靠的互联网连接就无法正常工作,这是否意味着在此问题得到解决之前我必须放弃使用Android Studio? - Michael
3
开发人员的工作是编写源代码,而不是构建它。在系统开发中,我们使用"构建"这个词来表示将编译后的源代码打包成最终产品(软件包或可执行文件)的过程。 - MestreLion
1
@MestreLion 哈哈,我当时很困惑,因为人们用“building”来指代编写项目源代码 - 我建立了这个聊天服务器,这个应用程序... - committedandroider

32
定义:Gradle是一种结构化的构建机制,它为开发人员提供了工具和灵活性来管理项目资源,创建大小更小、针对特定要求的构建,适用于某些配置的设备。


基本配置

  1. minimumSdk
  2. maximumSdk
  3. targettedSdk
  4. versionCode
  5. versionName

我们可以按需加入Android库或任何其他第三方库。这很容易,而以前却是一项繁琐的任务。如果该库不适合现有项目,开发者会看到一个日志,其中可以找到适当的解决方案,以便对项目进行更改,以便添加该库。这只是一个依赖项。


生成多种构建

将构建类型与构建风味组合以获得多种构建变体。

 ====================                         ====================
|     BuildTypes     |                       |   ProductFlavours  |
 --------------------  ====================== --------------------
|  Debug,Production  |      ||       ||      | Paid,Free,Demo,Mock|
 ====================       ||       ||       ==================== 
                            ||       ||
                            VV       VV
 =================================================================
|           DebugPaid, DebugFree, DebugDemo, DebugMock            |
|  ProductionPaid, ProductionFree, ProductionDemo, ProductionMock |
 =================================================================

减小文件大小

Gradle 可以通过移除未使用的资源和集成库中的未使用项来减小生成的构建的大小。


管理权限

我们可以根据要求在某些情况下添加特定的权限,为某些构建指定特定的权限。


为特定设备生成构建

我们可以管理为某些包括特定密度和特定 API 级别的设备生成构建。这有助于根据需求在多种类型的设备上进行产品部署。


好的参考资料

Vogella 教程


29
你可以在这里找到关于Gradle的一切需要了解的内容: Gradle插件用户指南 新构建系统的目标是: - 使重用代码和资源变得简单 - 使创建应用程序的多个变体变得简单,不管是为了多apk分发还是为了应用程序不同的口味 - 使配置、扩展和自定义构建流程变得容易 - 具有良好的IDE集成
为什么选择Gradle? Gradle是一个高级构建系统,也是一个高级构建工具包,允许通过插件创建自定义构建逻辑。我们选择Gradle的原因是它具有以下特点: - 领域特定语言(DSL)用于描述和操作构建逻辑。 - 构建文件基于Groovy,并允许通过DSL混合声明性元素和使用代码来操作DSL元素以提供自定义逻辑。 - 通过Maven和/或Ivy进行内置依赖管理。 - 非常灵活。允许使用最佳实践,但不强制执行其自己的做事方式。 - 插件可以公开其自己的DSL和其自己的API供构建文件使用。 - 良好的工具API允许IDE集成。

关于“你所需要的一切”:不,它缺少有关DX(以及D8)的信息。 - Peter Mortensen

27
Gradle是一种构建系统构建系统是设计用于自动化程序编译过程的软件工具。构建系统有各种形式,并且用于各种软件构建任务。尽管它们的主要目标是高效地创建可执行文件。
另一个相关术语是构建自动化,它是自动化软件构建和相关过程的过程,包括:将计算机源代码编译为二进制代码,打包二进制代码和运行自动化测试。
其他语言的类似构建系统(请参见完整列表此处):
  1. Apache AntApache Maven - Java
  2. sbt - 适用于ScalaPlay Framework等)
  3. A-A-P - 基于Python的构建工具
  4. Rake(Apache Builder)- Ruby
  5. Leiningen适用于Clojure

21

冒昧问一句,为什么Android Studio / Gradle的使用体验如此糟糕?

Clojure 的典型使用体验:

  • 下载包含在 project.clj 中列出的依赖项的项目。
  • Leiningen 通过 ClojarsMaven 获取依赖项。
  • 项目编译。

Android Studio / Gradle 的典型使用体验:

  • "导入我的 Eclipse 项目"。
  • 好的,项目已导入。
  • Gradle 正在处理...等待...等待...Gradle 完成。
  • 编译...无法编译,因为我不知道 X 是什么/找不到 Y 库。
我不确定这是否完全是Gradle的错。但是“从Eclipse项目导入”似乎非常不稳定。尽管Gradle声称具有高级功能和构建系统的优点,但Android Studio似乎无法很好地导入来自Eclipse的构建依赖项或构建过程。
它不会告诉您何时未能导入完整的依赖图。Android Studio没有提供有用的帮助或提示以解决问题。它不会告诉您可以在Eclipse文件夹中手动查找的位置。它不会告诉您缺少哪个库。或者帮助您搜索Maven等。
在2016年,像Leiningen / Clojars、Node.js的npm、Python的pip、Debian apkg(以及我相信许多其他语言和系统的类似软件包管理器)都可以完美地工作…… 缺少依赖项已成为过去。
除了Android以外。现在,Android Studio似乎是唯一一个让我经历缺失依赖项困境的地方。
我倾向于认为这是谷歌的问题。他们在不提供强大的转换过程的情况下,轻率地决定从Eclipse转移到Android Studio/Gradle,破坏了Android生态系统(以及成千上万现有的Android项目/在线教程)。那些在Eclipse中工作正常的项目的人没有将其适应到Android Studio(可能是因为这很麻烦)。而试图在Android Studio中使用这些项目的人也遇到了同样的问题。
而且,如果Gradle是这么强大的构建系统,为什么我还要在SDK Manager中管理许多其他依赖项?为什么不能在Gradle文件中指定需要NDK的项目,这样它在需要时就会自动安装和构建?为什么NDK特殊?目标平台也是如此?为什么我要在IDE中显式安装它们,而不是只检查我的项目是否与它们匹配,并在幕后为我处理所有这些事情?

4
我完全同意Gradle是一个糟糕的构建系统。它是使得Android Studio比X-Code或Visual Studio差很多的组件。我知道这些IDE必须在后台“构建”系统,但我并不需要了解/关心/调整它们的内部机制。而另一方面,Gradle似乎会随着每次Android Studio更新而出现问题,即使只是添加一个类也会拖慢系统。没有其他IDE会有这种情况。 - csmith

15

Gradle是一种先进的构建系统和高级构建工具包,允许通过插件创建自定义构建逻辑!

优点:

  • DSL - 领域特定语言,基于Groovy
  • DAG - 有向无环图
  • 增量构建
  • 可扩展的领域模型
  • Gradle始终保持最新
  • 在执行任务之前,Gradle会对其任务的输入和输出进行快照。
  • 如果快照已更改或不存在,则Gradle将重新执行此任务。

清单条目

通过DSL,可以配置以下清单条目:

构建变体

默认情况下,Android插件自动设置项目以构建应用程序的调试版本和发布版本。

依赖关系

  1. 本地依赖:

如果您的模块依赖于本地文件系统中的二进制存档(如JAR文件),则可以在该模块的构建文件中声明这些依赖关系。

  1. 远程依赖:

首先必须将存储库添加到列表中,然后以Maven或Ivy声明其工件的方式声明依赖项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接