题 什么是Android Studio中的Gradle?


Gradle对我和新的Android开发人员都有点困惑。任何人都可以解释Android Studio中的gradle是什么以及它的目的是什么?为什么Gradle包含在Android Studio中?


1032
2018-05-25 22:53


起源


看到 gradle.org - Eng.Fouad
回答 为什么 你会想要一个像Gradle这样的构建工具,请查看 这个帖子 来自杰夫阿特伍德。 - Adam S
当有人在这里问一个问题是肯定的,谷歌有很多关于它的链接,他们真正要求的是有人回答这个问题 平白的语言 并把它放进去 上下文,例如为什么我们需要它,谁将最常用它,我们是否需要知道它才能在Android Studio中构建Android应用程序等。因为大多数情况下,您在Google上找到的链接都是“技术说话”,对于初学者来说这很令人困惑。 - Azurespot
@NoniA。完全是我的想法。我仍然有点困惑,只是编写我编写的代码的后台进程?此外,在查看了许多其他答案后,他们提到了依赖关系。那些是什么?非常感谢!
这里可以看一下简洁明了的解释 介绍gradle。非常有帮助 - eRaisedToX


答案:


简答

Gradle是一个构建系统。

答案很长

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

您可以在命令行上执行此操作,但您必须了解SDK中每个工具(dx,aapt)的功能。 Eclipse通过为我们提供他们自己的构建系统,从这些低级但重要的基础细节中拯救了我们所有人。

现在,你有没有想过为什么 res 文件夹与您的目录位于同一目录中 src 夹?

这是构建系统进入图片的地方。构建系统自动获取所有源文件(.java 要么 .xml),然后应用适当的工具(例如,采取 java 类文件并将它们转换为 dex 文件),并将所有这些组合成一个压缩文件,我们心爱的APK。

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

现在,为了自动执行所有这些任务,必须有一个脚本;你可以使用linux中的shell脚本或windows中的批处理文件语法编写自己的构建系统。得到它了?

Gradle是另一个 构建系统 从其他构建系统中获取最佳功能并将它们合并为一个。它是基于它们的缺点而改进的。 它是一个 基于JVM的构建系统,这意味着您可以用Java编写自己的脚本,Android Studio可以使用它。

关于gradle的一个很酷的事情是它是一个 基于插件的系统。这意味着如果你有自己的编程语言,并且想要从源代码中自动完成构建某个包(如JAR for Java的输出)的任务,那么你可以用Java或Groovy编写一个完整的插件(或者Kotlin,参见 这里),并将其分发给世界其他地方。

谷歌为何使用它?

Google看到了市场上最先进的构建系统之一,并意识到您可以编写自己的脚本,几乎没有学习曲线,也无需学习Groovy或任何其他新语言。所以他们为Gradle编写了Android插件。

你一定见过 build.gradle 项目中的文件。在这里,您可以编写脚本来自动执行任务。您在这些文件中看到的代码是Groovy代码。如果你写 System.out.println("Hello Gradle!"); 然后它将在您的控制台上打印。

你可以在构建脚本中做什么?

一个简单的例子是,在实际构建过程发生之前,您必须将一些文件从一个目录复制到另一个目录。 Gradle构建脚本可以执行此操作。


1247
2017-07-18 15:27



我不得不说Gradle在将AndroidStudio项目从一个位置带到另一个位置时给了我一些问题。版本不匹配,缺少模块,等等......这让我很难过。我最终重新创建了项目框架并将旧项目的代码部分剪切/粘贴到新项目中。对于源和目的地,这都在Windows下。我现在要在基于Linux的实验室下移动它。 - jfmessier
我不明白的是为什么gradle尝试连接到我为我做的每个项目连接到Internet,甚至每次我想要编译 - AaA
@ user1700737:要生成简单的apk安卓工作室是通过gradle提供的,所以如果你问我那么就没有必要进入gradle的内部,只要简单的apk生成被认可。 Gradle是构建系统,有助于一次性和自动化地完成复杂的依赖任务。 - Gagandeep Singh
我认为IntelliJ已经知道如何在不需要其他构建系统的情况下构建Android项目。 - Arne Evertsson
与Android前工作室构建系统相比,gradle的另一个关键优势是依赖管理。以前在项目中使用Android库时,必须下载源代码,将其添加到项目中并使用项目进行编译。相反,使用gradle可以向build.gradle添加一行,然后gradle将从公共存储库下载已编译的库并将其添加到项目中。一些例子: blog.teamtreehouse.com/android-libraries-use-every-project  这也适用于标准Java jar文件,而不是将它们放在lib目录中。 - Stan Kurdziel


这是谷歌想要用于Android的新构建工具。它被使用是因为它比ant更具可扩展性和实用性。它旨在增强开发人员的体验。

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

还有Xavier和Tor Norbye在Android Studio上的另一场演讲 在Google I / O期间


137
2018-05-26 03:48



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


摇篮 是一个运行的构建系统 Android Studio

在其他语言中,例如:


34
2017-08-21 02:25



当你说 Gradle 类似于 make,我刚刚得到了它的概念 - user3405291
简单回答!!! - Kalanidhi
PHING of PHP - Yousha Aleayoub


这是关于什么的详细解释 Gradle 以及如何在android studio中使用它。

探索Gradle文件

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

Gradle构建文件

  1. Gradle构建文件使用a Domain Specific Language or DSL 界定 自定义构建逻辑并与Android特定的交互 Gradle的Android插件的元素。

  2. Android Studio项目包含一个或多个模块 您可以独立构建,测试和调试的组件。每 模块有自己的构建文件,所以每个Android Studio项目都有 包含2种Gradle构建文件。

  3. 顶级构建文件: 在这里您可以找到所有模块共有的配置选项 你的项目。

  4. 模块级构建文件: 每个模块都有自己的Gradle构建文件,其中包含特定于模块的构建设置。你会花最多的钱 你的时间编辑模块级构建文件而不是你的 项目的顶级构建文件。

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

顶级Gradle构建文件

每个Android Studio项目都包含一个顶级Gradle构建文件。这个 build.gradle file是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。


28
2017-12-12 08:04



注意 仅限链接的答案 不鼓励,SO答案应该是寻找解决方案的终点(相对于引用的另一个中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并将链接作为参考。 - kleopatra


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

我们不必单独安装它,因为当我们制作第一个项目时,Android Studio会为我们执行此操作。


24
2018-01-19 09:14



通过构建程序的源代码是什么意思?这不是开发人员的工作吗? - committedandroider
这个答案在措辞方面是完全错误的。 Gradle是与Android Studio捆绑在一起的打包工具,因此它需要处理的是构建apk。源代码始终由编译器构建而不是其他内容。 - AutomEng
然而从另一个问题来看,如果没有可靠的互联网连接,Gradle将无法正常工作,这是否意味着我必须抛弃Android Studio,直到修复完成? - Michael
@committedandroider:开发人员的工作是 写 源代码,不是 建立 它。在系统开发中,我们使用“构建”一词来表示过程 打包 该 编译 源代码进入最后 产品 (一个 包 或者 可执行) - MestreLion
@MestreLion大声笑我当时很困惑,因为人们使用'建筑'参考为他们的项目编写源代码 - 我建立了这个聊天服务器,这个应用程序... - committedandroider


定义::  Gradle可以描述为一种结构化的构建机制,它为开发人员提供了管理项目资源的工具和灵活性,以创建构建 smaller in sizetargeting specific requirements 对于某些配置的某些设备 


基本配置 

  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教程


20
2017-11-26 17:21



对于你的另一个问题所带来的所有挫折,只需“补偿”。我希望你考虑保持这个问题;-) - GhostCat


您可以在这里找到有关Gradle的所有信息: Gradle插件用户指南

新构建系统的目标

新构建系统的目标是:

  • 使重用代码和资源变得容易
  • 可以轻松创建应用程序的多个变体,用于多个apk分发或用于应用程序的不同风格
  • 使配置,扩展和自定义构建过程变得容易
  • 良好的IDE集成

为何选择Gradle?

Gradle是一个高级构建系统以及一个高级构建   工具包允许通过插件创建自定义构建逻辑。

以下是我们选择Gradle的一些功能:

  • 用于描述和操作构建逻辑的域特定语言(DSL)
  • 构建文件基于Groovy,允许通过DSL混合声明性元素,并使用代码来操作DSL元素   提供自定义逻辑。
  • 通过Maven和/或Ivy进行内置依赖管理。
  • 非常灵活。允许使用最佳实践,但不强制自己的做事方式。
  • 插件可以公开自己的DSL和自己的API,以供构建文件使用。
  • Good Tooling API允许IDE集成

19
2018-01-21 04:50





Gradle是一个 构建系统构建系统 是用于自动化程序编译过程的软件工具。构建系统有各种形式,用于各种软件构建任务。虽然他们的主要目标是有效地创建可执行文件。

另一个相关术语是构建自动化,它是自动创建软件构建和相关过程的过程,包括:将计算机源代码编译成二进制代码,打包二进制代码和运行自动化测试。

其他语言的构建系统很少(参见完整列表 这里):

  1. Apache Ant和Apache Maven - Java
  2. sbt(简单构建工具) - 用于Scala(Play框架等)
  3. A-A-P - 基于Python的构建工具
  4. Rake(Apache Builder) - Ruby
  5. Leiningen 对于Clojure

17
2017-09-18 08:28





冒着被话语的风险我认为这背后的问题是为什么Android Studio / Gradle体验如此糟糕。

典型的Clojure体验:

  • 下载项目中包含project.clj中列出的依赖项。
  • 由于Clojars和Maven,Leiningen得到了依赖。
  • 项目编译。

典型的Android Studio / Gradle体验:

  • “导入我的Eclipse项目”。
  • 好的项目已导入。
  • Gradle正在做这件事......等等......等等......等待...... Gradle已经完成了。
  • 编译...无法编译因为我不知道X是什么/无法找到Y库。

我不确定这是Gradle的错。但是“从Eclipse项目导入”似乎非常不稳定。对于Gradle所谓的复杂性和构建系统的优点,Android Studio似乎并没有很好地从Eclipse导入构建依赖项或构建过程。

它没有告诉您何时无法导入完整的依赖关系图。 Android Studio没有提供有关如何解决问题的有用帮助或提示。它不会告诉您可以在Eclipse文件夹中手动查看的位置。它没有告诉你哪个库似乎丢失了。或者帮助您搜索Maven等。

在2016年,像Leiningen / Clojars,或者节点的npm,或者Python的pip,或者Debian apkg(我确信很多类似的其他语言和系统的包管理器)都可以很好地工作......缺少依赖性已成为过去。

除了Android。 Android Studio现在是我似乎仍然遇到缺失依赖地狱的唯一地方。

我倾向于说这是谷歌的错。当他们骑士决定从Eclipse转向Android Studio / Gradle而没有产生强大的转换过程时,他们打破了Android生态系统(以及成千上万的现有Android项目/在线教程)。项目在Eclipse中工作的人不会将他们调整到AS(可能是因为这对他们来说很痛苦)。试图在AS中使用这些项目的人正在遇到同样的问题。

无论如何,如果Gradle是这个超级强大的构建系统,为什么我仍然在sdk管理器中管理很多其他依赖项?为什么不需要ndk的项目在其Gradle文件中指定它,以便在需要时自动安装和构建?为什么NDK特别?同样对于目标平台?为什么我在IDE中显式安装它们而不是仅仅检查我的项目并在幕后为我排序?


14
2017-08-21 14:33



我完全同意Gradle是一个糟糕的构建系统。它是使Android Studio比X-Code或Visual Studio更糟糕的组件。我意识到这些必须在幕后“建立”系统,但我并不是真的需要知道/关心/修补他们的内部。另一方面,Gradle似乎打破了每个Android Studio更新,即使只是添加一个类,也会使系统陷入困境。没有其他IDE能做到这一点。 - csmith


Gradle 是一个高级构建系统以及一个高级构建工具包,允许通过插件创建自定义构建逻辑!

优点:

  • Dsl - 域特定语言,基于groovy
  • DAG - 定向非循环图
  • 增量构建
  • 可扩展域模型
  • Gradle始终是最新的
  • 在执行任务之前,Gradle会拍摄其任务的快照 输入和输出。
  • 如果快照已更改或不存在,Gralde将会 重新执行此任务。

清单条目

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

构建变体

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

依赖

  1. 本地依赖:

如果您在本地文件系统中有一个模块的二进制存档   依赖于,例如JAR文件,您可以声明这些依赖项   该模块的构建文件。

  1. 远程依赖:

首先必须将存储库添加到列表中,然后再添加到列表中   依赖必须以Maven或Ivy声明他们的方式声明   文物。


10
2017-11-17 10:03





我发现Gradle的一个优点是:

Gradle专为多项目构建而设计,可以增长到相当大,并通过智能地确定构建树的哪些部分是最新的来支持增量构建,因此任何依赖于这些部分的任务都不需要重新构建-executed。


9
2018-02-21 18:02