Android Studio中的Gradle是什么?

What is Gradle in Android Studio?

Gradle对我和新的Android开发者来说有点困惑。有人能解释Android Studio中的Gradle是什么,它的目的是什么吗?为什么Gradle包含在Android Studio中?


简短回答

Gradle是一个构建系统。

长回答

在android studio之前,您使用Eclipse进行开发,很可能您不知道如何在不使用Eclipse的情况下构建android APK。

您可以在命令行上这样做,但是您必须了解每个工具(dx,aapt)在sdk中的作用。Eclipse通过给我们自己的构建系统,把我们从这些低级但重要的基本细节中拯救了出来。

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

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

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

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

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

Gradle的一个很酷的地方是它是一个基于插件的系统。这意味着,如果您有自己的编程语言,并且您希望自动化从源构建一些包(如JAR的输出)的任务,那么您可以在Java或Groovy(或KoTLIN,请参见这里)中编写完整的插件,并将其分发到其他的世界。

谷歌为什么要用它?

谷歌看到了市场上最先进的构建系统之一,意识到你可以自己编写脚本,而无需学习任何学习曲线,也不需要学习groovy或任何其他新语言。所以他们为Gradle编写了Android插件。

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

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

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


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

您可以在这里查看Android开发团队的Xavier Ducrohet关于谷歌I/O的演讲。

这里还有Xavier和TorNorbye在Android Studio上的另一个谈话,也是在谷歌I/O期间。


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

例如,在其他语言中:

  • Java的蚂蚁与Maven
  • 露比的耙子
  • C语言
  • 净额
  • 在Linux中制作


这里详细解释了什么是Gradle,以及如何在android studio中使用它。

浏览渐变文件

  • 每当您在Android Studio中创建项目时,构建系统自动生成所有必要的渐变构建文件。
  • 渐变生成文件

  • 渐变构建文件使用Domain Specific Language or DSL定义自定义构建逻辑并与特定于Android的Gradle的Android插件的元素。

  • Android Studio项目由一个或多个模块组成,这些模块可以独立构建、测试和调试的组件。各模块有自己的构建文件,所以每个Android Studio项目包含两种渐变构建文件。

  • 顶层构建文件:在这里您可以找到构成项目的所有模块通用的配置选项。

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

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

    顶层渐变生成文件

    每个Android Studio项目都包含一个顶级的Gradle构建文件。此build.gradle文件是Gradle Scripts文件夹中出现的第一个项目,并清楚地标记为Project。

    Most of the time, you won't need to make any changes to this file, but
    it's still useful to understand its contents and the role it plays
    within your project.

    模块级渐变构建文件

    除了项目级渐变构建文件外,每个模块都有自己的渐变构建文件。下面是基本的模块级渐变构建文件的注释版本。

    其他渐变文件

    除了build.gradle文件外,Gradle脚本文件夹还包含一些其他Gradle文件。大多数情况下,您不必手动编辑这些文件,因为当您对项目进行任何相关更改时,这些文件将自动更新。但是,了解这些文件在项目中所扮演的角色是一个好主意。

    Gradle-Wrapper.properties(Gradle版本)

    这个文件允许其他人构建您的代码,即使他们的计算机上没有安装Gradle。此文件检查是否安装了正确版本的Gradle,并在必要时下载必要的版本。

    平巷

    此文件引用构成项目的所有模块。

    gradle.properties(项目属性)

    This file contains configuration information for your entire project.
    It's empty by default, but you can apply a wide range of properties to
    your project by adding them to this file.

    local.properties(SDK位置)

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

    注:local.properties包含特定于安卓SDK本地安装的信息。这意味着您不应该将此文件保存在源代码管理下。

    建议阅读-Tutsplus教程

    我从这件事上清楚地了解了格雷德尔。


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

    我们不需要单独安装它,因为当我们进行第一个项目时,Android Studio会为我们安装它。


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

    基本配置

  • minimumSdk
  • maximumSdk
  • targettedSdk
  • versionCode
  • versionName
  • 图书馆:我们可以根据需要添加Android库或任何其他第三方库,这很容易,这是之前的一项繁重任务。如果库不适合现有项目,则会向开发人员显示一个日志,在该日志中,用户可以找到适当的解决方案来对项目进行更改,以便添加库。它只是一种依赖

    生成各种构建

    将构建类型与构建风格相结合以获得构建变量的多样性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     ====================                         ====================
    |     BuildTypes     |                       |   ProductFlavours  |
     --------------------  ====================== --------------------
    |  Debug,Production  |      ||       ||      | Paid,Free,Demo,Mock|
     ====================       ||       ||       ====================
                                ||       ||
                                VV       VV
     =================================================================
    |           DebugPaid, DebugFree, DebugDemo, DebugMock            |
    |  ProductionPaid, ProductionFree, ProductionDemo, ProductionMock |
     =================================================================

    缩小尺寸

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

    管理权限

    我们可以通过在特定场景中根据需求添加特定权限来为特定生成指定特定权限。

    为某些设备生成

    我们可以管理为某些设备生成构建,这些设备包括特定的密度和特定的API级别。这有助于根据不同类型设备的需求在应用商店中部署产品。

    很好的参考

    Vogella教程


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

    Goals of the new Build System

    The goals of the new build system are:

    • Make it easy to reuse code and resources
    • Make it easy to create several variants of an application, either for multi-apk distribution or for different flavors of an application
    • Make it easy to configure, extend and customize the build process
    • Good IDE integration

    Why Gradle?

    Gradle is an advanced build system as well as an advanced build
    toolkit allowing to create custom build logic through plugins.

    Here are some of its features that made us choose Gradle:

    • Domain Specific Language (DSL) to describe and manipulate the build logic
    • Build files are Groovy based and allow mixing of declarative elements through the DSL and using code to manipulate the DSL elements
      to provide custom logic.
    • Built-in dependency management through Maven and/or Ivy.
    • Very flexible. Allows using best practices but doesn’t force its own way of doing things.
    • Plugins can expose their own DSL and their own API for build files to use.
    • Good Tooling API allowing IDE integration

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

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

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

  • Apache Ant和Apache Maven—Java
  • SBT(简单构建工具)-用于scala(播放框架等)
  • 基于python的构建工具
  • Rake(Apache Builder)-Ruby
  • 雷宁根代表Clojure

  • 我认为这背后的问题就是为什么Android Studio/Gradle的体验如此糟糕。

    典型的clojure经验:

    • 下载Project.clj中列出依赖项的项目。
    • 雷宁根得到依赖,多亏了克洛贾斯和马文。
    • 项目编译。

    典型的Android Studio/Gradle体验:

    • "导入我的Eclipse项目"。
    • 确定导入项目。
    • 格雷德尔正在做的是…等待。。。等待。。。等待。。。Gradle完成了。
    • 编译…无法编译,因为我不知道X是什么/找不到Y库。

    我不确定这到底是格雷德的错。但"从Eclipse项目导入"似乎相当脆弱。尽管Gradle所谓的复杂度和构建系统的优点,Android Studio似乎并没有很好地从Eclipse中导入构建依赖项或构建过程。

    它不会告诉您何时导入完整的依赖关系图失败。关于如何解决这个问题,Android Studio没有提供任何有用的帮助或提示。它并没有告诉您在Eclipse文件夹中可以手动查找的位置。它不能告诉你哪个图书馆好像不见了。或者帮你搜索马文等。

    在2016年,像leiningen/clojars、node's npm、python's pip或debian apkg(我相信许多其他语言和系统的类似包管理器)都能很好地工作……缺少依赖关系是过去的事情。

    除了安卓。Android Studio现在是唯一一个让我感觉到缺少依赖的地方。

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

    不管怎样,如果Gradle是这个超级强大的构建系统,为什么我还要在SDK管理器中管理大量其他依赖项?为什么一个需要,比如说,ndk的项目不能在它的渐变文件中指定它,以便在需要时自动安装和构建它?为什么NDK特别?目标平台也是如此?为什么我要在IDE中显式地安装它们,而不只是对照它们检查我的项目,并在幕后为我整理这些内容?


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

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

    Gradle combines the good parts of both tools and provides additional features and uses Groovy as a Domain Specific Language (DSL). It has power and flexibility of Ant tool with Maven features such as build life cycle and ease of use.

    为什么是Gradle?为什么现在?

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

    Let's say you want to copy a file to a specific location when you're building the release version of your project. To identify the version, you check a string in the metadata describing your project. If it matches a specific numbering scheme (for example, 1.0-RELEASE), you copy the file from point A to point B. From an outside perspective, this may sound like a trivial task. If you have to rely on XML, the build language of many traditional tools, expressing this simple logic becomes fairly difficult.

    Java构建工具的演进

    Java build logic has to be described in XML. XML is great for describing hierarchical data but falls short on expressing program flow and conditional logic. As a build script grows in complexity, maintaining the building code becomes a nightmare.

    在Ant中,您使jar目标依赖于编译目标。Ant没有提供任何关于如何构建项目的指导。尽管它允许最大的灵活性,但Ant使每个构建脚本都是独一无二的,并且很难理解。项目所需的外部库通常签入到版本控制中,因为没有自动机制从中心位置提取它们。

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

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

    Gradle结合了其他构建工具的最佳特性。

    enter image description here

    格雷德尔引人注目的特性集

    enter image description here

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

    The default build tool for Android (and the new star of build tools on the JVM) is designed to ease scripting of complex, multi-language builds. Should you change to it, though, if you're using Ant or Maven?

    在构建脚本中解锁Gradle强大功能的关键在于发现和应用其域模型,如下图所示。enter image description here

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

    Gradle establishes a vocabulary for its model by exposing a DSL implemented in Groovy. When dealing with a complex problem domain, in this case, the task of building software, being able to use a common language to express your logic can be a powerful tool.

    Another example is the way you can express dependencies to external libraries, a very common problem solved by build tools. Out-of-the-box Gradle provides you with two configuration blocks for your build script that allow you to define the dependencies and repositories that you want to retrieve them from. If the standard DSL elements don't fit your needs, you can even introduce your own vocabulary through Gradle's extension mechanism.

    与其他构建工具集成

    Gradle与它的前任蚂蚁、Maven和Ivy很好地合作,如下图所示。

    enter image description here

    从构建到部署自动化项目

    enter image description here

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

    • 编译代码

    • 运行单元和集成测试

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

    • 创建分发

    • 设置目标环境

    • 部署可交付结果

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

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


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

    优势:

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

    清单条目

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

    构建变体

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

    依赖关系

  • 本地依赖项:
  • If you have binary archives in your local filesystem that a module
    depends on, such as JAR files, you can declare these dependencies in
    the build file for that module.

  • 远程依赖项:
  • First the repository must be added to the list, and then the
    dependency must be declared in a way that Maven or Ivy declare their
    artifacts.


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

    我不知道Intellij的特定集成,但是想象一下您可以"扩展"groovy,这样您就可以编写特定的"构建"语言原语,它们只是groovy语言的一部分。(groovy的元编程本身就是一个完整的讨论。)intellij/google可以使用Gradle来构建一种非常高级的构建语言,但它是一种基于可扩展、开放标准的语言。


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

    以下是你能用Gradle做的一些事情。

    • 新项目所需的最小配置,因为Gradle具有Android Studio项目的默认配置。

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

    • Gradle自动从项目的源代码生成一个测试目录和一个测试apk。

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

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


    在android studio中,Gradle是一个定制的构建工具,用于通过管理依赖关系和提供定制的构建逻辑来构建android包(apk文件)。

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

    • 字节码
    • 资源(图像、用户界面、XML等)
    • 清单文件

    一个apk文件被签名并被推送到设备上,使用adb(android debug bridge)执行它。


    Gradle是一个用于Android的高级构建工具包,它可以管理依赖项并允许您定义自定义的构建逻辑。特点是

    • 自定义、配置和扩展生成过程。

    • 使用同一个项目为具有不同功能的应用程序创建多个apk。

    • 重用代码和资源。

    参考


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


    作者:@brian gardner:

    Gradle是用于编程项目的广泛的构建工具和依赖关系管理器。它有一种基于groovy的特定于领域的语言。Gradle还提供了对许多类型的项目(包括Java、Android和Scala)的常规支持。

    梯度特征:

  • 依赖管理
  • 使用Gradle中的Ant
  • Gradle插件
  • Java插件
  • Android插件
  • 多项目构建

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

    然而,如果你是一个刚开始开发Android的人,99%的情况下的渐变会阻止你的项目的构建。这是一个难以理解、复杂的系统,它有效地模糊了Android的构建过程,基本上使缺乏经验的开发人员无法使用它,即为了构建一个简单的入门级Android应用程序,毫无戒心的新手可能需要学习和理解他们没有讨价还价的许多东西,例如:

    • 安卓APK结构与生态系统
    • 安卓工作室
    • Java类路径与依赖关系
    • 格罗维
    • 渐变构建脚本
    • 许多其他复杂有趣的技术

    所有这些对于Android开发人员来说都是有趣和有用的,但它们远不容易实现,并且为进入提供了强大的障碍。我怀疑是什么激发了OP提出这个问题的是挫折感,不可避免地打击了新手开发者花了太长的时间试图得到一个简单的应用程序来构建,并不断受到格雷德的阻挠。大量可用于所有这些技术的高技术文档反常地加剧了这个问题。同时,对于大量的开发需求来说,渐变也是多余的。

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

    最明显的是它的缺失(如果有这样的事情请通知我)是一个入门级的、轻量级的IDE,它有一个减少的特性集,可以同时简化构建过程,而不会掩盖它(所以不是NetBeans或Eclipse),它可能仍然使用Gradle(Ant出了什么问题)。它应该使生成符合一些常见配置的APK变得容易,并且使用一个项目结构,如果您决定这样做,它可以演变为一个完整的Android Studio项目。


    简单来说,Gradle是Android Studio为实现两个重要过程而提供的工具:

  • 建设我们的项目
  • 将androidmanifest.xml、res文件夹和二进制代码打包到名为apk的特殊格式的zip文件中

  • Gradle=groovy+摇篮汉斯码头论坛评论

    在Android Studio中,这种混乱可能只是被称为"构建"或者其他什么东西时,这是有点不必要的。

    我们喜欢在发展界给自己制造困难。