Android的Gradle技巧 8 Gradle基础

32 篇文章 0 订阅
8 Gradle基础

本书中的食谱是用于Android中的Gradle构建文件。 Gradle是一个强大的构建工具,但是,它广泛用于其他项目。本附录回顾了Gradle的基础知识。此处查看的所有功能也可以在Android构建文件中使用。


安装Gradle
你不需要安装Gradle在Android项目中使用它。
Android Studio包括Gradle,并提供了一个Gradle包装器。它的使用在配方4.1,其他食谱。
Gradle作为一个单一的ZIP下载。您只需从Gradle网站下载最新的发行版即可开始使用。安装非常简单:
1.下载并解压缩分发
2.设置GRADLE_HOME环境变量以指向解压缩的文件夹
3.将GRADLE_HOME下的bin文件夹添加到您的路径
gradle命令然后可以在任何项目的根目录执行。默认情况下,构建文件称为build.gradle,但可以使用任何名称。 -b或--build-file标志用于指定不同的构建文件。
作为替代,Gradle提供了一个包装器,可以用来自动下载和安装Gradle首次使用。包装器在本附录的后面。
注意,虽然Gradle构建文件是用Groovy编写的,但你不需要安装Groovy来运行Gradle。 Gradle包括一个Groovy在其内部的分布,它用于为构建提供动力。
要查看Gradle安装的详细信息,请使用-v标志运行Gradle,如示例B-1所示。
实例B-1。显示Gradle版本
> gradle -v
------------------------------------------------------------
Gradle 2.12
------------------------------------------------------------
Build time: 2016-03-14 08:32:03 UTC
Build number: none
Revision: b29fbb64ad6b068cb3f05f7e40dc670472129bc0
Groovy: 2.4.4
Ant: Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM: 1.8.0 (Oracle Corporation 25.0-b70)
OS: Mac OS X 10.11.4 x86_64

Gradle版本在这里是2.12,其中包括Groovy 2.4.4引擎盖下,并在Java 1.8上运行在Mac OS X机器上。


构建生命周期
Gradle构建运行通过三个不同的阶段:
初始化 Initialization

读取环境配置文件init.gradle和gradle.properties,并设置列在in_settings.gradle_Configuration中的所有子项目

配置Configuration

评估所有构建脚本并构建模型,包括DAG
执行Execution

执行所需的任务


Java项目
Gradle构建文件由组成DAG的任务组成。自定义任务将在下一节中讨论。 Gradle是一个基于插件的架构,然而,通过向构建中添加插件,您可以向构建中添加任务和功能。
在Android世界之外使用的最常见的插件是Java插件。由于这个插件与Gradle发行版一起使用,因此将其添加到项目中就像使用apply命令一样简单。实施例B-2中显示了一个实施例。
实施例B-2。 Java项目的最小build.gradle文件
apply plugin:'java'
事实上,这是一个Java项目的完整构建文件。插件本身定义了一系列相关的任务。要查看可用的任务,请转到项目根目录中的命令提示符,然后执行tasks命令。样品输出显示在实施例B-3中。
实例B-3。任务命令的输出示例
> gradle tasks
:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]
Help tasks
----------
components - Displays the components produced by root project 'gradle'. [incubating]
dependencies - Displays all dependencies declared in root project 'gradle'.
dependencyInsight - Displays the insight into a specific dependency in 'gradle'.
help - Displays a help message.
model - Displays the configuration model of root project 'gradle'. [incubating]
projects - Displays the sub-projects of root project 'gradle'.
properties - Displays the properties of root project 'gradle'.
tasks - Displays the tasks runnable from root project 'gradle'.
任务列表显示哪些任务可用,但不显示其关系。
额外的命令行标志是可用的,但是最简单的方法来查看哪些任务按顺序运行只是执行构建任务。执行构建如示例B-4所示。
实例B-4。执行Gradle构建
> gradle build
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
Total time: 1.956 secs

每个阶段,如:构建,依赖于其他。插件定义任务及其关系。 Gradle然后按正确的顺序执行它们。

任务形成有向无环图。在这种情况下,显示关系的图表在Gradle用户指南中可用。图B-1,来自在线文档,显示了Java插件的DAG。


图B-1。 Java插件任务的定向非循环图
每个关联使用一个箭头(这是有向部分),并且虽然有多个关系,但在图中没有循环(因此是非循环标签)。运行构建任务意味着首先必须运行检查和组合任务。检查任务然后取决于测试,这取决于testClasses和类,等等。
Java插件假定源代码放在首先由Maven标准化的目录结构中。不接受代码放在src / main / java文件夹中,默认情况下测试在src / main / test中。这很容易通过源集进行自定义。
从Gradle的角度来看,Android项目不是Java项目。他们使用不同的插件和(略)不同的项目布局。


存储库和依赖关系
当前构建文件定义测试任务,但不定义测试库。示例B-5的构建文件是更典型的基本Java项目。
实例B-5。一个具有存储库和依赖关系的Gradle构建

apply plugin: 'java'
repositories {
jcenter()
}
dependencies {
testCompile 'junit:junit:4.12'
}
Gradle为构建定义了域特定语言(DSL)。构建文件中的存储库和依赖关系元素是DSL的一部分。
存储库是可以根据需要检索并存储在本地缓存中的库集合,默认为用户主目录中的.gradle文件夹。此构建文件中使用的存储库称为jcenter(),它是Bintray JCenter Artifactory存储库。另一个内置的存储库是mavenCentral(),公共Maven中央存储库。多个存储库经常包含在构建文件中。每个依次搜索以解析依赖关系。
依赖列表,在足够的依赖关系块中。依赖包括有关库(组,名称和版本)的信息,以及需要它的“依赖配置”。
Java插件的预定义依赖关系配置如下:
• compile
• runtime
• testCompile
• testRuntime
• archives
• default
前四个是最常见的,但都意味着他们听起来像什么。例如,编译依赖性使得库类在整个项目中可用,testCompile依赖项仅将库类添加到src / test / java源代码树。 JDBC驱动程序通常被列为运行时依赖项,或者甚至t​​estRuntime依赖项,如果数据库只用于测试。


自定义任务
Gradle DSL是广泛的,并且通常你不需要任何超越插件提供的东西。然而,迟早或之后,每个构建都会成为一个自定义构建,Gradle的设计就是考虑到这一点。
方法4.1讨论如何为Gradle构建创建自己的任务。
使用task关键字定义任务,如例B-6中所示。
实例B-6。自定义任务打招呼

def task {
doLast {
println 'hello'
}
}
doLast块指示应在执行时运行的代码。该块之外的任何代码(但仍在任务内)在配置时运行。
Gradle还包括一个doFirst块,但它的使用少得多。此外,您可以使用左移运算符缩写doLast块。
示例B-7中的整个任务在执行时运行。这很容易忽略语法,然而,这是这种方法不是首选的原因之一。
实例B-7。使用左移运算符的自定义任务
def task << {
println 'hello'
}

Gradle API有许多内置任务,可以自定义。例如,示例B-8配置了复制任务,它是Gradle API中的一个类。

实施例B-8。配置复制任务

def copyOutputs(type: Copy) {
from "$buildDir/outputs/apk"
into '../results'
}
Gradle文件通常混合单引号和双引号字符串。双引号字符串允许插值,单引号字符串不允许。否则它们实际上是相同的。
复制任务本身包括配置和执行时间部分。在这种情况下,设置from和into属性分配所需的值,任务处理其余的值。这种配置现有任务而不是编写自己的方法被认为是一个好的做法,因为它倾向告诉Gradle你想要什么,而不是指定如何做。


多项目构建
给定项目的子目录可以是Gradle项目自身,具有自己的构建文件和依赖关系。事实上,他们甚至可以依靠彼此。
文件settings.gradle指定了哪些子目录是Gradle项目。在典型的Android应用程序中,settings.gradle包括应用程序目录,即实际应用程序的代码所在的位置。
多项目构建中的每个应用程序都可以有自己的构建文件。要在项目之间共享公共块,请使用子项目或allprojects块,这两个块都配置Project类的整个实例。这个过程的细节在1.1中讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值