Android Studio 中的 Gradle 是什么?

Gradle 让我有些困惑,对于任何新的 android 开发人员也是如此。谁能解释 Android Studio 中的 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 的一件很酷的事情是它是一个基于插件的系统 。这意味着,如果您拥有自己的编程语言,并且想要自动化从源代码构建某些程序包(如 Java 的 JAR 的输出)的任务,则可以用 Java 或 Groovy(或 Kotlin,请参见此处 )编写完整的插件,并且分发到世界其他地方。

Google 为什么使用它?

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

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

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

一个简单的示例是,在实际的构建过程发生之前,您必须将一些文件从一个目录复制到另一个目录。 Gradle 构建脚本可以做到这一点。

这是 Google 希望用于 Android 的新构建工具。之所以使用它,是因为它比 ant 更可扩展且更有用。它旨在增强开发人员的体验。

您可以在此处查看Google I / O上 Android 开发人员团队的 Xavier Ducrohet 的演讲。

Xavier 和 Tor Norbye 在 Android Studio 上也有另一个演讲,也在Google I / O 上进行

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

以其他语言为例:

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

探索 Gradle 文件

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

Gradle 构建文件

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

  2. Android Studio 项目包含 1 个或多个模块,这些模块是您可以独立构建,测试和调试的组件。每个模块都有自己的构建文件,因此每个 Android Studio 项目都包含 2 种 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。

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

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

定义: Gradle 可以描述为一种结构化的构建机制,它为开发人员提供了工具和灵活性来管理项目资源,以创建smaller in size构建,从而targeting specific requirements配置的特定设备的targeting 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 教程

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

新构建系统的目标

新构建系统的目标是:

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

为什么要摇篮?

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

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

  • 领域特定语言(DSL),用于描述和操纵构建逻辑
  • 构建文件基于 Groovy,并允许通过 DSL 混合声明性元素,并允许使用代码操纵 DSL 元素以提供自定义逻辑。
  • 通过 Maven 和 / 或 Ivy 内置的依赖项管理。
  • 非常灵活。允许使用最佳做法,但不强迫自己做事。
  • 插件可以公开自己的 DSL 和自己的 API,以供构建文件使用。
  • 良好的工具 API,允许集成 IDE

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

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

其他语言几乎没有类似的构建系统(请参见此处的完整列表):

  1. Apache Ant 和 Apache Maven-Java
  2. sbt(简单构建工具)- 用于 Scala(播放框架等)
  3. AAP - 基于 Python 的构建工具
  4. Rake(Apache Builder)-Ruby
  5. 莱宁根为克洛瑞尔

我参考两个教程来写答案

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

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

为什么要摇篮?为什么现在?

构建工具的响应是通过非标准扩展机制添加脚本功能。您最终将脚本代码与 XML 混合在一起,或者从构建逻辑中调用外部脚本。不难想象,随着时间的推移,您将需要添加越来越多的自定义代码。结果,您不可避免地会引入意外的复杂性,而可维护性却无法实现。

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

Java 构建工具的演变

Java 构建逻辑必须用 XML 描述。 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 配合得很好。

在此处输入图片说明

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

在此处输入图片说明

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

  • 编译代码

  • 运行单元和集成测试

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

  • 创建发行版

  • 调配目标环境

  • 部署可交付成果

  • 执行冒烟和自动功能测试

我参考两个教程来写答案

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

典型的 Clojure 经验:

  • 下载具有 project.clj 中列出的依赖项的项目。
  • 莱宁根得益于 Clojars 和 Maven 的依赖。
  • 项目编译。

典型的 Android Studio / Gradle 体验:

  • “导入我的 Eclipse 项目”。
  • 确定项目已导入。
  • Gradle 正在执行此操作... 等待... 等待... 等待... Gradle 已完成。
  • 编译... 无法编译,因为我不知道 X 是什么 / 找不到 Y 库。

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

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

在 2016 年,诸如 Leiningen / Clojars,node 的 npm,Python 的 pip 或 Debian apkg 之类的东西(我相信许多其他语言和系统的类似软件包管理器)都可以正常工作... 缺少依赖关系已经成为过去。

Android 除外。现在,Android Studio 是我仍然似乎仍会体验缺失依赖地狱的唯一地方。

我倾向于说这是 Google 的错。当他们明智地决定从 Eclipse 转移到 Android Studio / Gradle 时,他们却没有产生一个可靠的转换过程,就打破了 Android 生态系统(以及成千上万个现有的 Android 项目 / 在线教程)。在 Eclipse 中工作的项目的人没有使他们适应 AS(大概是因为这对他们来说很痛苦)。试图在 AS 中使用这些项目的人们遇到了同样的问题。

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