提问



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

最佳参考


简答



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,见这里)编写一个完整的插件,将它分发给世界其他地方。[33]


Google为何使用它?



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


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


您可以在构建脚本中执行哪些操作?



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

其它参考1


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


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


Xavier和Tor Norbye还在Android Studio上发表了另一个关于Google I/O的讨论。 [35]

其它参考2


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


在其他语言中,例如:



  • Java
  • 的Ant和Maven
  • Ruby
  • 的耙子
  • C
  • 的A-A-P
  • .NET
  • 的缩写
  • 制作 Linux


其它参考3


这是关于Gradle以及如何在android studio中使用它的详细解释。[36] [37] [38] [39] [40] [41]


探索Gradle文件



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



Gradle构建文件



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

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

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

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



要查看这些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教程[42]


我从中清楚地了解了gradle。

其它参考4


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


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

其它参考5


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





BASIC CONFIGURATIONS



  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教程 [43]

其它参考6


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



  

新构建系统的目标


  
  新构建系统的目标是:

  
  

      
  • 轻松重用代码和资源

  •   
  • 轻松创建应用程序的多个变体,用于多个apk分发或用于不同风格的应用程序

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

  •   
  • 良好的IDE集成

  •   

  
  

为什么要Gradle?


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

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

  
  

      
  • 用于描述和操作构建逻辑的域特定语言(DSL)

  •   
  • 构建文件基于Groovy,允许通过DSL混合声明性元素,并使用代码来操作DSL元素
      提供自定义逻辑。

  •   
  • 通过Maven和/或Ivy进行内置依赖管理。

  •   
  • 非常灵活。允许使用最佳实践,但不强制自己的做事方式。

  •   
  • 插件可以公开他们自己的DSL和他们自己的API以供使用的构建文件。

  •   
  • 允许IDE集成的良好工具API

  •   


其它参考7


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


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


其他语言的类似构建系统很少(参见此处的完整列表):[46]



  1. Apache Ant& Apache Maven - Java

  2. sbt(简单构建工具) - 用于Scala(Play框架等)

  3. A-A-P - 基于Python的构建工具

  4. Rake(Apache Builder) - Ruby

  5. Leiningen for Clojure


其它参考8


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


典型的Clojure体验:



  • 下载项目,其中包含project.clj中列出的依赖项。

  • Leiningen得到了Clojars和Maven的依赖。

  • 项目编译。



典型的Android Studio/Gradle体验:



  • 导入我的Eclipse项目。

  • 确定项目已导入。

  • Gradle正在做这件事......等等......等等......等待...... Gradle已经完成了。

  • 编译......无法编译,因为我不知道X是什么/无法找到Y库。



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


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


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


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


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


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

其它参考9


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


优点:



  • Dsl - 基于groovy的域特定语言

  • DAG - 定向非循环图

  • 增量构建

  • 可扩展域模型

  • Gradle始终是最新的

  • 在执行任务之前,Gradle会拍摄其任务的快照
    输入和输出。

  • 如果快照已更改或不存在,Gralde将会
    重新执行此任务。



清单条目


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


构建变体


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


依赖关系



  1. 本地依赖项:




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




  1. 远程依赖项:




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


其它参考10


我发现Gradle的一个优点是:


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

其它参考11


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


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

其它参考12


Gradle是一个用于android的高级构建工具包,用于管理依赖关系并允许您定义自定义构建逻辑。功能就像
1.自定义,配置和扩展构建过程。
2.使用同一项目为您的应用创建具有不同功能的多个APK。
3.重用代码和资源。
请参阅此链接http://developer.android.com/sdk/installing/studio-build.html [48]

其它参考13


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


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



  • 字节代码

  • 资源(图片,用户界面,xml等)

  • 清单文件



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

其它参考14


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


以下是gradle可以做的一些事情。



  • 新项目需要最低配置,因为Gradle具有Android工作室项目的默认配置。

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

  • Gradle会自动从项目的源代码生成测试目录和测试APK。

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

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


其它参考15


我参考两个教程写答案一,二[49] [50]


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



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



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


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



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



Java Build Tools的演变



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



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


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


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


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


[51]


Gradle令人信服的功能集


[52]


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



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



在构建脚本中解锁Gradle功能的关键在于发现并应用其域模型,如下图所示。
[53]


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



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

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



与其他构建工具集成


Gradle与其前身Ant,Maven和Ivy配合得很好,如下图所示。


[54]


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


[55]


在映像中:部署管道的阶段。



  • 编译代码

  • 运行单元和集成测试

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

  • 创建分发

  • 配置目标环境

  • 部署可交付成果

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



我参考两个教程写答案一,二[56] [57]

其它参考16


Gradle构建系统旨在支持创建Android应用程序的复杂场景:


多个分发:必须为多个客户或公司定制相同的应用程序


Multi-apk:支持为不同设备类型创建多个apk,同时重用部分代码

其它参考17


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

其它参考18


通过 @Brian Gardner:


Gradle是一个用于编程项目的广泛的构建工具和依赖管理器。它具有基于Groovy的特定于域的语言。 Gradle还为许多类型的项目提供了常规支持,包括Java,Android和Scala。


Gradle的功能:



  1. 依赖管理

  2. 使用Gradle中的Ant

  3. Gradle Plugins

  4. Java插件

  5. Android插件

  6. 多项目构建


其它参考19


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


但是,如果您是Android开发的新手,Gradle在99%的情况下就是阻止您的项目构建。这是一个不可思议的复杂系统,它有效地模糊了Android构建过程并实质上呈现了它没有经验的开发人员无法使用,即为了构建一个简单的入门级Android应用程序,毫无戒心的新手可能需要学习和理解他们没有讨价还价的许多事情,例如:



  • Android APK结构和生态系统

  • Android Studio

  • Java类路径和依赖项

  • Groovy的

  • Gradle构建脚本

  • 许多其他复杂而有趣的技术



所有这些对Android开发人员来说都很有趣且有用,但它们远非易事,而且是一个难以进入的障碍。我怀疑启发OP提出这个问题的原因是,在花费太长时间试图让一个简单的应用程序构建并被Gradle不断挫败之后,不可避免地会给新手开发者带来挫败感。大量技术文档可用于所有这些技术,这一问题反而加剧了这一问题。同样对于大量的开发需求,Gradle也是过度的。


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


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

其它参考20


简而言之,Gradle是Android Studio提供的工具,用于实现两个重要流程:



  1. 构建我们的项目

  2. 将AndroidManifest.xml,res文件夹和二进制代码打包成一个名为APK
  3. 的特殊格式的zip文件

其它参考21


Gradle是一个自动构建工具包,允许通过一组构建配置文件配置和管理项目的构建方式。这包括定义如何构建项目,成功构建项目需要满足哪些依赖项以及构建过程的最终结果(或结果)应该是什么。 Gradle的优势在于它为开发人员提供的灵活性。 Gradle系统是一个独立的,基于命令行的环境,可以通过使用插件集成到其他环境中。对于Android Studio,通过适当命名的Android Studio插件提供Gradle集成。

其它参考22


Gradle=Groovy + Cradle
Hans Dockter论坛评论[58]


当它可能刚刚被称为Build或Android Studio中的某些东西时,这种混淆有点不必要。


我们喜欢在开发社区中为自己制造困难。

其它参考23


Android构建系统编译应用程序资源和源代码,并将它们打包到APKs中,您可以对其进行测试,部署,签名和分发。 Android Studio使用Gradle这一高级构建工具包来自动化和管理构建过程,同时允许您定义灵活的自定义构建配置。每个构建配置都可以定义自己的代码和资源集,同时重用应用程序的所有版本通用的部分。 GradleAndroid插件与构建工具包一起使用,以提供特定于构建和测试Android应用程序的进程和可配置设置。

其它参考24


Gradle是一个自动构建工具包,允许通过一组构建配置文件配置和管理项目的构建方式。这包括定义如何构建项目,成功构建项目需要满足哪些依赖项以及构建过程的最终结果(或结果)应该是什么。 Gradle的优势在于它为开发人员提供的灵活性。 Gradle系统是一个独立的,基于命令行的环境,可以通过使用插件集成到其他环境中。对于Android Studio,通过适当命名的Android Studio插件提供Gradle集成。


虽然Android Studio插件允许从Android Studio中启动和管理Gradle任务,但Gradle命令行包装仍可用于构建基于Android Studio的项目,包括未安装Android Studio的系统。


构建项目的配置规则在Gradle构建文件和基于Groovy编程语言的脚本中声明。

其它参考25


Gradle是一个开源构建自动化系统。 Gradle可以自动构建,测试,发布,部署以及更多软件包或其他类型的项目,例如生成的静态网站,生成的文档和其他任何内容


Gradle的特点:



  1. 用于描述和操作构建逻辑的域特定语言(DSL)

  2. 构建文件是基于Groovy的,允许混合声明性
    元素通过DSL并使用代码来操纵DSL
    元素提供自定义逻辑。

  3. 通过Maven和/或Ivy进行内置依赖管理。非常灵活。

  4. 允许使用最佳做法,但不强制自己的做事方式。

  5. 插件可以公开他们自己的DSL和他们自己的API以供构建文件使用。

  6. 允许IDE集成的良好工具API