Gradle让我有些困惑,对于任何新的android开发人员也是如此。谁能解释Android Studio中的Gradle是什么,它的目的是什么?为什么它包含在Android Studio中?
Gradle让我有些困惑,对于任何新的android开发人员也是如此。谁能解释Android Studio中的Gradle是什么,它的目的是什么?为什么它包含在Android Studio中?
Answers:
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构建脚本可以做到这一点。
这是Google希望用于Android的新构建工具。之所以使用它,是因为它比ant更可扩展且更有用。它旨在增强开发人员的体验。
您可以在此处查看Google I / O上Android开发人员团队的Xavier Ducrohet的演讲。
Xavier和Tor Norbye还在Google I / O期间在Android Studio上进行了另一场演讲。
这是什么Gradle
是什么以及如何在Android Studio中使用的详细说明。
探索Gradle文件
Gradle构建文件
Gradle构建文件使用Domain Specific Language or DSL
来定义自定义构建逻辑并与Gradle的Android插件的特定于Android的元素进行交互。
Android Studio项目包含1个或多个模块,这些模块是您可以独立构建,测试和调试的组件。每个模块都有自己的构建文件,因此每个Android Studio项目都包含2种Gradle构建文件。
顶层构建文件:在这里,您可以找到构成项目的所有模块所共有的配置选项。
模块级构建文件:每个模块都有自己的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本地安装的信息。这意味着您不应该将此文件置于源代码控制之下。
我从这里清楚地了解了gradle。
Gradle是一种构建工具,用于构建程序的源代码。因此,它是Android Studio的重要组成部分,需要在开始开发应用程序之前进行安装。
我们不必单独安装它,因为当我们制作第一个项目时,Android Studio会为我们完成安装。
定义:: 摇篮可以描述的结构化建设机制它提供了一个开发者工具和灵活性来管理项目,以创建资源建立是smaller in size
,targeting specific requirements
对于某些配置的某些设备
基本配置
minimumSdk
maximumSdk
targettedSdk
versionCode
versionName
图书馆:: 我们可以根据要求轻松添加android库或任何其他第三方库,这在早期是一项繁琐的任务。如果该库不适合现有项目,则会向开发人员显示一条日志,在此人可以找到适当的解决方案来对项目进行更改,以便可以添加库。它只是一行依赖
生成的建筑物种类
将构建类型与构建风格相结合,以获取各种构建变体
==================== ====================
| BuildTypes | | ProductFlavours |
-------------------- ====================== --------------------
| Debug,Production | || || | Paid,Free,Demo,Mock|
==================== || || ====================
|| ||
VV VV
=================================================================
| DebugPaid, DebugFree, DebugDemo, DebugMock |
| ProductionPaid, ProductionFree, ProductionDemo, ProductionMock |
=================================================================
缩小尺寸
Gradle通过从集成库中删除未使用的资源以及未使用的内容,来帮助减少生成的构建的大小
管理权限
我们可以根据需要在某些方案中添加某些权限,从而为某些构建指定某些权限
某些设备的构建
我们可以管理包含特定密度和特定API水平的特定设备的生成版本。根据多种设备类型的要求,这有助于在应用商店中进行产品部署
良好的参考
您可以在这里找到有关Gradle所需的所有信息: Gradle插件用户指南
新构建系统的目标
新构建系统的目标是:
- 轻松重用代码和资源
- 轻松创建应用程序的多个变体,以进行多apk分发或应用程序的不同风格
- 使配置,扩展和定制构建过程变得容易
- 良好的IDE集成
为什么要摇篮?
Gradle是一个高级构建系统以及一个高级构建工具包,允许通过插件创建自定义构建逻辑。
以下是让我们选择Gradle的一些功能:
- 领域特定语言(DSL),用于描述和操纵构建逻辑
- 构建文件基于Groovy,并允许通过DSL混合声明性元素,并允许使用代码操纵DSL元素以提供自定义逻辑。
- 通过Maven和/或Ivy内置的依赖项管理。
- 非常灵活。允许使用最佳做法,但不强迫自己做事。
- 插件可以公开自己的DSL和自己的API,以供构建文件使用。
- 良好的工具API,可实现IDE集成
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经验:
典型的Android Studio / Gradle体验:
我不确定这完全是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中显式安装它们,而不是仅仅检查它们的项目并在幕后为我整理所有这些?
Gradle
是一个高级构建系统以及一个高级构建工具包,允许通过插件创建自定义构建逻辑!
优点:
清单条目
通过DSL,可以配置以下清单条目:
构建变体
默认情况下,Android插件会自动设置项目以构建应用程序的调试版和发行版。
依存关系
如果模块依赖的本地文件系统中有二进制归档文件(例如JAR文件),则可以在该模块的构建文件中声明这些依赖关系。
首先必须将存储库添加到列表中,然后必须以Maven或Ivy声明其工件的方式声明依赖项。
对于Groovy JVM语言,Gradle对Java来说就是蚂蚁。基本上,它是Groovy的构建工具。与Ant不同,它基于完整的Groovy语言。例如,您可以在Gradle脚本中编写Groovy脚本代码,以执行某些操作,而不是依赖特定的领域语言。
我不知道IntelliJ的特定集成,但是想象一下您可以“扩展” Groovy,以便您可以编写特定的“构建”语言原语,而它们只是成为Groovy语言的一部分。(Groovy的元编程本身是一个完整的讨论。)IntelliJ / Google可以使用Gradle构建非常高级的构建语言,但它是基于可扩展的开放标准的语言。
Gradle是一个自动构建工具包,不仅可以集成到Android项目中,还可以集成到许多不同的环境中。
您可以使用Gradle做一些事情。
新项目所需的最低配置,因为Gradle为您的android studio项目提供了默认配置。
依赖声明。您可以声明本地或远程服务器中托管的依赖项jar文件或库文件。
Gradle会从您的项目源自动生成一个测试目录和一个测试APK。
如果将所有必要的信息(例如keyPassword
和keyAlias
)添加到Gradle构建文件中,则可以使用Gradle生成签名的APK。
Gradle可以使用不同的软件包生成多个APK,并从单个模块构建配置。
在Android Studio中,Gradle是一个自定义构建工具,用于通过管理依赖项并提供自定义构建逻辑来构建android程序包(apk文件)。
APK文件(Android应用程序包)是一种特殊格式的zip文件,其中包含
一个apk文件被签名并使用执行它的ADB(Android调试桥)推送到设备。
Gradle是自定义的构建工具,用于构建APK或称为应用程序包工具包。
通过@Brian Gardner:
Gradle是用于编程项目的广泛构建工具和依赖项管理器。它具有基于Groovy的领域特定语言。Gradle还为包括Java,Android和Scala在内的许多类型的项目提供了按惯例构建的支持。
Gradle的特点:
Gradle使自动构建复杂的Android项目成为可能,该项目涉及来自多个源,项目,库等的成千上万行代码。它可以根据大量的配置规范有条件地生成多个优化的APK-如果您感兴趣的其他答案将提供有关Gradle这方面的更多详细信息。
但是,如果您不熟悉Android开发,那么在99%的情况下,Gradle就是阻止您的项目进行构建的原因。它是一个难以理解的复杂系统,有效地混淆了Android的构建过程,并从根本上使经验不足的开发人员无法使用它,即,为了构建一个简单的入门级Android应用程序,毫无疑问的新手可能需要研究和理解他们没有讨价还价的许多事情。如:
所有这些事情对于Android开发人员来说都是有趣且有用的,但是它们远非易事,并且构成了巨大的入门障碍。我怀疑促使OP提出此问题的原因是,在花了太长时间试图创建一个简单的应用程序并不断受到Gradle挫败之后,这种挫折感不可避免地打击了新手开发人员。可用于所有这些技术的大量技术文档反而加剧了这个问题。同样对于大量的开发需求来说,Gradle太过分了。
一种替代方法是编写一个shell脚本,通过自动执行android SDK中可用的工具来构建您的项目。这种方法的优点很多,对于初学者来说,它可能是学习和理解构建过程和Android生态系统的最佳方法,它使您可以完全控制应用程序的构建方式。但是,这种方法更适合于那些无法接受的技术负责人,而不是没有经验的菜鸟尝试使用android。
缺少它的地方(请告诉我是否有这样的东西)是显而易见的,它是具有简化功能集的入门级轻量级IDE,可同时简化构建过程而又不会使构建过程变得晦涩(因此,不要是netbeans或eclipse),它可能仍然会使用Gradle(Ant出了什么问题)。如果您决定采用这种方式,应该可以轻松生成符合一些常用配置的APK,并使用可以演变为完整Android Studio项目的项目结构。
在Android Studio中,Gradle用于构建我们的android应用程序项目,因此扮演了构建系统的角色。在Android Studio之前,我们在Eclipse中使用命令行工具来编译和构建应用程序,该工具很快就被基于GUI的步骤所接管,以使用ANT在Eclipse中构建和运行Android应用程序。每个android应用程序开发工具都必须编译资源,java源代码,外部库,并将它们组合成最终的APK。
Gradle是一个构建系统,负责代码编译,测试,部署以及将代码转换为.dex文件,从而在设备上运行该应用程序。
由于Android Studio预先安装了Gradle系统,因此无需安装其他运行时软件即可构建我们的项目。每当您单击android studio中的按钮时,gradle任务都会自动触发并开始构建项目,并且在gradle完成其任务后,应用程序将开始在AVD或连接的设备中运行。
诸如Gradle之类的构建系统不是编译器,链接器等,但它控制并监督编译,文件链接,运行测试用例的运行,并最终将代码捆绑到适用于Android应用程序的apk文件中。
每个android studio项目都有两个build.gradle文件,一个用于应用程序,另一个用于项目级别(模块级别)的生成文件。
在构建过程中,编译器将获取源代码,资源,外部库JAR文件和AndroidManifest.xml(其中包含有关应用程序的元数据),并将它们转换为.dex(Dalvik可执行文件)文件,其中包括bytecode。该字节码受所有Android设备支持以运行您的应用。然后,APK Manager将.dex文件和所有其他资源组合到单个apk文件中。APK Packager使用相应的调试或发布密钥库签署调试或发布apk。
调试 apk通常用于测试目的,或者可以说它仅在开发阶段使用。当您的应用程序具有所需功能并准备好将其发布以供外部使用时,则需要使用发布密钥库签名的Release apk。
现在让我们了解一下gradle文件。
setting.gradle setting.gradle(Gradle setting)文件用于指定应用程序中使用的所有模块。
build.gradle(项目级别) 顶级(模块)build.gradle文件是项目级别的构建文件,它定义了项目级别的构建配置。此文件将配置应用于android应用程序项目中的所有模块。
build.gradle(应用程序级别) Application级别的build.gradle文件位于android项目的每个模块中。该文件包括您的软件包名称,如applicationID,版本名称(apk版本),版本代码,特定应用程序模块的最低和目标sdk。当包含外部库(不是jar文件)时,需要在应用程序级别gradle文件中提及它,以将它们作为应用程序的依赖项包含在项目中。
注意:如果某个应用程序是针对各个模块(例如智能手机,平板电脑或电视)开发的,则必须为所有模块创建单独的gradle文件。您甚至可以通过命令行工具启动gradle系统。使用以下命令:
./gradlew构建-(构建项目)
./gradlew clean构建-(构建项目完整的草稿)
./gradlew clean构建-(运行测试)
./gradlew包装器-(查看所有可用任务)
Gradle = Groovy + Cradle Hans Dockter论坛评论
当它可能只是被称为“ Build”或Android Studio中的某种东西时,这种混淆是不必要的。
我们喜欢在开发社区中让自己感到困难。