Android Studio中的Gradle是什么?

and*_*ter 1257 build-automation gradle android-studio android-gradle-plugin

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

Gag*_*ngh 1475

简答

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构建脚本可以执行此操作.

  • 我不明白的是为什么gradle尝试连接到我为我做的每个项目连接到Internet,甚至每次我想要编译 (17认同)
  • 与Android前工作室构建系统相比,gradle的另一个关键优势是依赖管理.以前在项目中使用Android库时,必须下载源代码,将其添加到项目中并使用项目进行编译.相反,使用gradle可以向build.gradle添加一行,然后gradle将从公共存储库下载已编译的库并将其添加到项目中.一些示例:http://blog.teamtreehouse.com/android-libraries-use-every-project这也适用于标准Java jar文件,而不是将它们放在lib目录中. (16认同)
  • 我不得不说Gradle在将AndroidStudio项目从一个位置带到另一个位置时给了我一些问题.版本不匹配,缺少模块,诸如此类......这给了我很多时间.我最终重新创建了项目框架,并将旧项目的代码部分剪切/粘贴到新项目中.对于源和目的地,这都在Windows下.我现在要在基于Linux的实验室下移动它. (11认同)
  • 我认为IntelliJ已经知道如何在不需要其他构建系统的情况下构建Android项目. (4认同)
  • @ user1700737:要生成简单的apk安卓工作室是通过gradle提供的,所以如果你问我那么就没有必要进入gradle的内部,只要简单的apk生成被认可.Gradle是构建系统,有助于一次性和自动化地完成复杂的依赖任务. (2认同)
  • Gradle是一个糟糕的构建系统.在使用Android Studio时,我希望它能够处理构建.我不明白为什么添加一些类会强制Gradle在它有用之前进行同步.通过比较使用Visual Studio非常棒(甚至是X-Code) - 不需要额外的麻烦.IDE构建项目和解决方案,无需在随机文件中修改Android构建过程有时需要的设置或通过旧项目的更新.Gradle是Android体验中最糟糕的部分. (2认同)
  • 如果不使用gradle,是不是可以在android studio中工作? (2认同)

dan*_*c05 157

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

您可以在此处查看来自Google I/O上的Android开发团队的Xavier Ducrohet的演讲.

Xavier和Tor Norbye在Android Studio上还有另一个关于Google I/O的讨论.

  • 我认为IntelliJ已经知道如何在不需要其他构建系统的情况下构建Android项目. (3认同)
  • 那么gradle只是编译我写的代码的后台进程吗?此外,在查看了许多其他答案后,他们提到了依赖性。那些是什么?非常感谢丹尼尔! (2认同)
  • @ user5562706它不编译代码,但负责调用确实编译代码的可执行文件。编译代码后,它可以运行另一个任务以将其打包,另一个可以将其复制到您选择的目录中,然后另一个可以将其上传到某个位置的服务器中……这是诸如Gradle之类的任务,或者是任何构建系统,会做。 (2认同)

iti*_*skj 59

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

在其他语言中,例如:

  • 当你说'Gradle`类似于`make`时,我就得到了它的概念 (19认同)
  • 我发现了解未知工具功能的最快方法之一,以及它在管道中的位置,就是在Google中键入工具的名称和"vs".结果通常会显示"X vs Y",其中Y是您可能更熟悉的其他工具. (12认同)
  • ** PHP **的PHING (3认同)
  • Linux 不是一种编程语言。它主要用于 [C](https://en.wikipedia.org/wiki/C_%28programming_language%29)。也许*“Linux 上的 C 语言”*? (2认同)

Par*_*r C 42

以下是有关Gradle在Android Studio中使用它的内容和方法的详细说明.

探索Gradle文件

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

Gradle构建文件

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

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

  3. 顶级构建文件:您可以在此处找到构成项目的所有模块共有的配置选项.

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

要查看这些build.gradle文件,请打开Android Studio的"项目"面板(通过选择"项目"选项卡),然后展开"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.


小智 28

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

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

  • 通过构建程序的源代码是什么意思?这不是开发人员的工作吗? (4认同)
  • @committedandroider:开发人员的工作是_写_源代码,而不是_build_源代码。在系统开发中,我们使用“构建”一词来表示将_compiled_源代码打包_打包为最终_product _(_ package_或_executable_)的过程。 (2认同)

Mah*_*idi 23

您可以在此处找到有关Gradle的所有信息: Gradle Plugin用户指南

新构建系统的目标

新构建系统的目标是:

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

为何选择Gradle?

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

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

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


Dev*_*ath 23

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


基本配置

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

LIBRARIES :: 我们可以根据需要添加android库或任何其他第三方库,这在以前是一项繁琐的工作.如果库不适合现有项目,则会向开发人员显示一个日志,其中该人员可以找到适当的解决方案来对项目进行更改,以便可以添加库.它只有一行依赖


生成建筑物的品种

将构建类型与构建风格相结合,以获得各种构建变量

 ====================                         ====================
|     BuildTypes     |                       |   ProductFlavours  |
 --------------------  ====================== --------------------
|  Debug,Production  |      ||       ||      | Paid,Free,Demo,Mock|
 ====================       ||       ||       ==================== 
                            ||       ||
                            VV       VV
 =================================================================
|           DebugPaid, DebugFree, DebugDemo, DebugMock            |
|  ProductionPaid, ProductionFree, ProductionDemo, ProductionMock |
 =================================================================
Run Code Online (Sandbox Code Playgroud)

减少尺寸

Gradle通过从集成库中删除未使用的资源来帮助减少生成的构建的大小


管理许可

我们可以通过在某些场景中根据需求添加某些权限来为某些版本指定某些权限


为某些设备建造

我们可以管理包含某些密度和某些api级别的某些设备的生成构建.这有助于根据多种类型设备的要求在应用商店中进行产品部署


好的参考

Vogella教程


小智 22

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

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

其他语言的类似构建系统很少(请参阅此处的完整列表):

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


Far*_*ana 22

我参考了两个教程写了答案 ,

Gradle是一个通用的声明性构建工具.它是通用的,因为它可以用于构建您在构建脚本中实现的几乎任何东西.它是声明性的,因为您不希望在构建文件中看到大量代码,这些代码不可读且不易维护.因此,虽然Gradle提供了约定的概念和简单的声明性构建,但它也使该工具具有适应性,并使开发人员能够扩展.它还提供了一种简单的方法来自定义默认行为和不同的挂钩以添加任何第三方功能.

Gradle结合了两种工具的优点,并提供了其他功能,并将Groovy用作域特定语言(DSL).它具有Ant工具的强大功能和灵活性,具有Maven功能,例如构建生命周期和易用性.

为何选择Gradle?为什么现在?

构建工具的响应是通过非标准扩展机制添加脚本功能.您最终将脚本代码与XML混合或从构建逻辑调用外部脚本.很容易想象您需要随着时间的推移添加越来越多的自定义代码.因此,您不可避免地会引入意外的复杂性,并且可维护性会消失.

假设您要在构建项目的发布版本时将文件复制到特定位置.要识别版本,请检查描述项目的元数据中的字符串.如果它匹配特定的编号方案(例如,1.0-RELEASE),则将文件从A点复制到B点.从外部角度来看,这听起来像是一项简单的任务.如果你必须依赖XML,那么表达这种简单逻辑的许多传统工具的构建语言变得相当困难.

Java构建工具的演变

必须用XML描述Java构建逻辑.XML非常适合描述分层数据,但却无法表达程序流和条件逻辑.随着构建脚本的复杂性增加,维护构建代码成为一场噩梦.

在Ant中,您使JAR目标取决于编译目标.Ant没有提供有关如何构建项目的任何指导.虽然它允许最大的灵活性,但Ant使每个构建脚本都是独一无二且难以理解的.项目所需的外部库通常会被检入版本控制,因为没有自动机制将它们从中心位置拉出来.

2004年7月发布的Maven 1试图缓解这一过程.它提供了标准化的项目和目录结构,以及依赖关系管理.不幸的是,定制逻辑很难实现

Gradle适合这一代构建工具,满足现代构建工具的许多要求(图1).它提供了富有表现力的DSL,一种基于配置方法的约定,以及强大的依赖管理.它正确地放弃了XML并引入动态语言Groovy来定义构建逻辑.听起来很引人注目,不是吗?

Gradle结合了其他构建工具的最佳功能.

在此输入图像描述

Gradle令人信服的功能集

在此输入图像描述

为什么使用Gradle而不是Ant或Maven构建Java项目?

Android的默认构建工具(以及JVM上构建工具的新星)旨在简化复杂的多语言构建的脚本编写.但是,如果您使用Ant或Maven,是否应该更改它?

在构建脚本中解锁Gradle功能的关键在于发现并应用其域模型,如下图所示. 在此输入图像描述

Gradle无法了解特定于您的企业构建的所有要求.通过将挂钩暴露到生命周期阶段,Gradle允许监视和配置构建脚本的执行行为.

Gradle通过公开在Groovy中实现的DSL为其模型建立词汇表.在处理复杂的问题域时,在这种情况下,构建软件的任务,能够使用通用语言来表达您的逻辑可以是一个强大的工具.

另一个例子是您可以表达对外部库的依赖关系的方式,这是构建工具解决的一个非常常见的问题.开箱即用的Gradle为您的构建脚本提供了两个配置块,允许您定义要从中检索它们的依赖项和存储库.如果标准DSL元素不符合您的需求,您甚至可以通过Gradle的扩展机制引入自己的词汇表.

与其他构建工具集成

Gradle与其前辈的Ant,Maven和Ivy相得益彰,如下图所示.

在此输入图像描述

使您的项目从构建自动化到部署

在此输入图像描述

在图像中:部署管道的阶段.

  • 编译代码

  • 运行单元和集成测试

  • 执行静态代码分析并生成测试覆盖率

  • 创建分发

  • 供应目标环境

  • 部署可交付成果

  • 进行烟雾和自动功能测试

我参考了两个教程写了答案 ,


int*_*tar 16

冒着被话语的风险我认为这背后的问题是为什么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中显式安装它们而不是仅仅检查我的项目并在幕后为我排序?

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

小智 13

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

好处:

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

清单条目

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

构建变体

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

依赖

  1. 本地依赖:

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

  1. 远程依赖:

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


use*_*123 12

Gradle是Groovy JVM语言的Java是什么.基本上,它是Groovy的构建工具.与Ant不同,它基于完整的Groovy语言.例如,您可以在Gradle脚本中编写Groovy脚本代码来执行某些操作,而不是依赖于特定的域语言.

我不知道IntelliJ的特定集成,但想象你可以"扩展"Groovy,这样你就可以编写特定的"构建"语言原语,它们只是成为Groovy语言的一部分.(Groovy的元编程本身就是一个完整的讨论.)IntelliJ/Google可以使用Gradle构建一个非常高级的构建语言,然而,它是一种基于可扩展的开放标准的语言.

  • 它不是"Groovys构建工具" - 它是一个多用途构建工具,其DSL构建在groovy之上 (2认同)

And*_*ine 9

Gradle是一个用于android的高级构建工具包,用于管理依赖项并允许您定义自定义构建逻辑.功能就像

  • 自定义,配置和扩展构建过程.

  • 使用同一项目为您的应用创建多个具有不同功能的APK.

  • 重用代码和资源.

参考


Zum*_*med 9

Gradle是一个自动构建工具包,可以集成到许多不同的环境中,不仅适用于Android项目.

这里有一些你可以用gradle做的事情.

  • 新项目需要最小配置,因为Gradle具有android studio项目的默认配置.

  • 依赖声明.您可以声明托管在本地或远程服务器中的依赖项jar文件或库文件.

  • Gradle自动从项目源生成测试目录和测试APK.

  • 如果您将所有必要信息(例如keyPasswordkeyAlias)添加到Gradle构建文件中,则可以使用Gradle生成已签名的APK.

  • Gradle可以从单个模块生成具有不同包和构建配置的多个APK.


Aka*_*ani 8

在Android Studio中,Gradle是一个自定义构建工具,用于通过管理依赖项和提供自定义构建逻辑来构建android包(apk文件).

APK文件(Android应用程序包)是一个特殊格式的zip文件,其中包含

  • 字节码
  • 资源(图像,UI,xml等)
  • 清单文件

一个apk文件被签名并使用ADB(Android Debug Bridge)推送到设备,在那里它被执行.


Dha*_*ani 6

经过 @布莱恩·加德纳:

Gradle 是一个用于编程项目的广泛构建工具和依赖项管理器。它具有基于 Groovy 的特定领域语言。Gradle 还为多种类型的项目(包括 Java、Android 和 Scala)提供按约定构建支持。

Gradle的特点:

  1. 依赖管理
  2. 从 Gradle 使用 Ant
  3. Gradle 插件
  4. Java插件
  5. 安卓插件
  6. 多项目构建


Sam*_*hah 6

Gradle是一个自定义的构建工具,用于构建APK或称为应用程序包工具包.


flu*_*ius 5

Gradle 使自动化构建复杂的 Android 项目成为可能,这些项目涉及来自多个源、项目、库等的数十万行代码。它可以根据大量配置规范有条件地生成多个优化的 APK - 如果您感兴趣,其他答案提供了 Gradle 这方面的更多细节。

但是,如果您是 Android 开发的新手,Gradle 在 99% 的情况下会阻止您的项目构建。它是一个高深莫测的复杂系统,它有效地混淆了 Android 构建过程,并且基本上使没有经验的开发人员无法使用它,即为了构建一个简单的入门级 Android 应用程序,毫无戒心的新手可能需要研究和理解许多他们没有的东西”讨价还价,例如:

  • Android APK 结构和生态系统
  • 安卓工作室
  • Java 类路径和依赖项
  • 常规
  • Gradle 构建脚本
  • 许多其他复杂而有趣的技术

所有这些对于 Android 开发人员来说都很有趣且有用,但它们远非易事,并且存在巨大的进入障碍。我怀疑是什么激发了 OP 提出这个问题,是新手开发人员在花费太长时间试图构建一个简单的应用程序并不断被 Gradle 阻挠之后不可避免地打击了新手开发人员的挫败感。可用于所有这些技术的大量高技术文档反而加剧了这个问题。同样对于大量的开发需求,Gradle 是矫枉过正的。

另一种方法是编写一个 shell 脚本,通过自动化 Android SDK 中可用的工具来构建您的项目。这种方法的优点有很多,对于初学者来说,它可能是研究和理解构建过程和 Android 生态系统的最佳方式,它允许您完全控制您的应用程序的构建方式。然而,这种方法更适合深不可测的技术负责人,而不是尝试 android 的没有经验的新手。

它缺席的显着之处(如果有这样的东西,请通知我)是一个入门级的轻量级 IDE,它具有减少的功能集,同时简化了构建过程,同时又不掩盖它(所以不是 Netbeans 或 Eclipse)它可能仍然使用 Gradle(Ant 有什么问题)。如果您决定采用这种方式,它应该可以轻松生成符合一些常见配置的 APK,并使用可以演变为完整 Android Studio 项目的项目结构。


归档时间:

查看次数:

405310 次

最近记录:

5 年,11 月 前