您的位置:首页 > 其它

使Gradle构建更快 2016年2月5日奥列格Shelajev3评论 推特 inShare 70 上次我们谈到了构建系统,我们看着一些建议可能会使您的Maven构建更快。我们得到的结果是迷人的和对

2017-09-27 09:04 344 查看

使Gradle构建更快

2016年2月5日

奥列格Shelajev

3评论

推特

inShare70

上次我们谈到了构建系统,我们看着一些建议可能会使您的Maven构建更快。我们得到的结果是迷人的和对方的回应是压倒性的。大多数人都很满意的加速,他们取得了项目我们给的建议。今天,我们要看看可以用它构建。大多数项目的构建是相当标准,但是他们是独一无二的。几乎所有的项目添加自己的复杂性为构建。虽然他们都不同,有一点是共同的:构建可以占用你宝贵的时间和加速会影响开发人员的生产力使项目更愉快的工作。

闲话少说,我们来看看Gradle,“意识到构建幸福”的座右铭,是包装的速度。



加快Gradle构建

这个网站在很大程度上是受的会话Madis粉红色:挤压的一滴性能Gradle构建。Madis是背后的工程师之一JRebel
Android项目,所以如果你开发Android应用程序你应该试一试!Madis会欣喜若狂,但不要太多你看它,我们不希望Madis成为大领导!

被测试的应用程序,我们将使用相同的代码,Madis使用,iosched,实际违约Android应用程序示例。没有恐惧,它是相同的Java项目是Android应用。这意味着建议我们给这里加速你Gradle构建适用于这两种环境中。所以你可以直接使用这篇文章的所有技巧在你的Java项目。

在开始任何优化之前,我们首先需要明白Gradle构建有一个生命周期,可以分成三个不同的阶段:

初始化——扫描找出哪些来构建项目。
配置运行构建。gradle脚本和建筑图的任务。
执行——有用的部分,它实际上构建应用程序。

现在你可以看到的痛苦。很明显有一个有用的阶段,我们可以加快我们自己的构建脚本如果特定项目的特性允许它,和两个阶段Gradle专门执行自私的任务:配置本身和实施执行开销。在本帖里,我们将首先专注于降低成本的建设在我们努力构建自身更快。

让我们开始一步一步优化构建同时测量的进展。如果你想运行实验iosched应用自己,把它从Github,像这样:

git clone http://github.com/google/iosched cd ioshed

现在我们准备好了!让我们构建应用程序一次Gradle获取依赖项,并确保我们有一个典型的开发环境场景在手中。

现在再次构建应用程序,但随着
 --dry-run
国旗,这将使它实际上跳过所有任务的执行。这意味着我们将配置Gradle执行和执行所有的任务通常会做的,只是不做实际的工作。正是我们想要测量,减少开销。

执行以下命令几次,就像你第一次做这个构建将拉下所需的依赖项,如果你使用一个新的项目。结果,第一个基线运行不会反映常规的构建速度。

./gradlew :android:assembleDebug --dry-run

在考虑所有Gradle要执行的任务,但由于跳来跳去
 --dry-run
国旗,它打印花了多少时间来运行该命令。我可怜的MacBook pro 2013(仍然粘可口可乐我不小心泄漏),构建需要近9秒。

BUILD SUCCESSFUL

Total time: 8.674 secs

一个合适的测量技术需要我们多次运行该命令,然后删除离群值和平均结果。但是我们这里不做科学,我们将跳过无趣的部分。把它与一粒盐,你的情况可能不同。

第二步是使Gradle构建分析。就一巴掌
 --profile
国旗Gradle命令,你会得到一个很好的报告说时间到哪里去了。

./gradlew :android:assembleDebug --dry-run --profile
open build/reports/profile/profile-2016-02-02-15-39-17.html

这个概要文件显示,大部分的时间进入配置项目:



让我们更快地使配置。

使用配置需求

有一个简单的方法来降低这一数字。我们需要让Gradle配置一切而不是急切的需求。幸运的是,这只是添加另一个命令行标志的问题:
 --configure-on-demand
.

./gradlew :android:assembleDebug --dry-run --profile --configure-on-demand

结果是一个更好的眼睛:

BUILD SUCCESSFUL

Total time: 7.144 secs

这个概要文件显示,按需配置的需要几乎一秒少配置项目:配置项目- 2.359 s。似乎可以忽略不计,但请注意,这是一个17%加速!不坏的这样一个简单的标志。

配置需求是它的孵化功能,所以它是没有默认启用。我们可能会有一天,但是现在你可以使它在全球范围内,通过添加一行.gradle / gradle。在您的主目录属性。如下所示的命令在Linux / OSX就足够了:

echo 'org.gradle.configureondemand=true' >> ~/.gradle/gradle.properties


使用Gradle守护进程

现在,因为我们讨论的是添加全局属性,让我们确保我们使用Gradle守护进程。Gradle守护进程是一个后台进程,不Gradle构建完成后退出。下次你调用它,它仍然会在那里等着摇滚你的世界,或者至少您的构建。这很大的意义,因为它是一个JVM进程需要开始,JVM加载,加载类,JIT等等。限制所有的开销的影响正是Gradle守护进程。

让我们比较时间Gradle构建有或没有守护进程运行:

./gradlew :android:assembleDebug --dry-run --no-daemon
# vs.
./gradlew :android:assembleDebug --dry-run --daemon

在我的机器上,在热身,构建与守护进程快得多相比,我们最初的基准测试中,我使用这个词很松散:

BUILD SUCCESSFUL

Total time: 2.536 secs

现在我们的构建只花29%的时间,它起初。这太酷了,不是吗? !
所以使用这个守护进程也普遍很好,所以你应该让它在全球范围内。

echo 'org.gradle.daemon=true' >> ~/.gradle/gradle.properties


使用最新的Gradle版本

让我们来谈谈它的版本。Gradle是一个复杂的怪兽,它是建立在几个项目,所有随时间而变化。大部分的项目得到越来越快的每一个版本(我看着你,Eclipse朱诺),因此使用他们的最新稳定版本。

到目前为止,在这篇文章中我们已经运行Gradle 2.2.1。的最新Gradle释放日期是2.10让我们升级和使用它。用不同的构建工具,手动升级过程可能是痛苦和烦恼。它是不同的。大多数的项目利用Gradle包装器,该实用程序,修复Gradle项目使用的版本并确保构建的可重复性。这是一个伟大的事情,如果您的项目使用它你也应该使用包装器。例如在他的虚拟壶会话Andres
Almiray,Java冠军和一个大Gradle风扇,也主张!相信他,他知道很多关于它。

改变Gradle版本在使用中,当使用包装器,一个只需要更新包装的数量配置。配置位于
gradle/wrapper/gradle-wrapper.properties
文件在项目的主目录中。不幸的是,由于一些错误的工具链,Gradle欢迎我们失败:

> Failed to apply plugin [id 'com.android.application']
> Gradle version 2.2 is required. Current version is 2.10. If using the gradle wrapper, try editing the distributionUrl in /Users/shelajev/repo/tmp/iosched/gradle/wrapper/gradle-wrapper.properties to gradle-2.2-all.zip

显然,这是一个诚实的错误比较版本号的字符串,所以虽然我们等待有人来修理它,我们就假设Gradle 2.9是最新的一个。,让我们来看看2.9执行。

BUILD SUCCESSFUL

Total time: 1.356 secs

Gradle 2.9并不令人失望,我们现在已经有了更快的时间开销。很甜,嗯,现在8秒和1.3 !

同样的论点是Java版本。如果你还没有升级到Java 8,现在就做!读完这篇文章,但做到直之后!你甚至不需要移动您的项目使用Java 8,λ等等。只要确保您的构建工具执行最新的和最高效的Java版本。

优化您的项目

直到现在我们主要谈论剃须牦牛在构建系统的开销强加到您的构建。这很棒,但老实说,大部分的好处,你可以获得超速部门是隐藏在构建过程的实际过程。好吧大部分时间在我们的例子中我们保存通过减少开销,但是想象一下会发生什么更现实的项目构建。让我们来看看一个真正可以加快Gradle构建过程。

避免重计算

通常,在构建,它可能会做很多繁重,可以优化掉,至少部分。让我们看看我们的例子,试着调整Gradle执行的IO操作。例如,您构建一个典型的应用程序和持续集成的目的你需要存储的信息提交您正在构建。

这些信息是一个命令,对吧?你有这样的它。构建文件:

def cmd = 'git rev-list HEAD --first-parent --count'
def gitVersion = cmd.execute().text.trim().toInteger()

android {
defaultConfig {
versionCode gitVersion
}
}

上面的代码执行一个git命令并将结果存储在一个变量中以供将来使用。桃色的,但实际的命令执行需要时间。为了您的开发环境中你可能不需要这些信息。幸运的是,它很灵活,只是一个纯粹的Groovy配置文件。如果你上面的配置更改为下面的例子,不执行不必要的操作,当在持续集成环境中,你会赢得第二个。

def gitVersion() {
if (!System.getenv('CI_BUILD')) {
// don't care
return 1
}
def cmd = 'git rev-list HEAD --first-parent --count'
cmd.execute().text.trim().toInteger()
}

android {
defaultConfig {
versionCode gitVersion()
}
}

我打赌一个闪闪发亮的硬币有负载的地方在你的代码库一样,所以得到一个性能建立你应该考虑提示。考虑到计算是多么容易避免,没有理由不去做。

解决依赖关系

它允许您指定版本为您的项目的依赖关系是接受范围。在下面的示例中,任何一个小版本的gson 2将满足依赖约束。事实上,Gradle将试图挑选它找到的最新版本。这种灵活性的性能代价。Gradle将不得不上网检查什么版本可用。有时是不必要的,缓慢的,尤其是如果你的网络连接是贫穷。拉开了一个构建在火车上吗?

dependencies {
compile 'com.google.code.gson:gson:2.+'
}

不仅动态依赖关系可能减慢您的构建,但你也失去了重复性的构建。持续集成环境中可能会发现一个新版本或者周推提交后,有人会获取代码,不知道哪里出了问题。

在任何情况下,这是一个好主意建造的性能以避免动态依赖关系和修复的版本。不是很难做的,只是找出Gradle版本下载,把这一数字。

模块化项目和并行化

最后,但并非最不重要,也许,最有效的的事情,你可以做你的项目来增加它的建造速度是模块化它更好。这里有几个因素在起作用。首先,可以并行构建模块化项目。我们讨论的时候讨论了如何加速Maven,它也不例外。

支持并行构建,这是另一个孵化功能,需要提供一个命令行标志。你可以添加
 --parallel
国旗给你Gradle Gradle命令或使其在全球范围内。属性文件是早些时候与守护进程选项:

echo 'org.gradle.parallel=true' >> ~/.gradle/gradle.properties

除了明显的加速你会得到从执行构建使用多个线程同时,得到以下额外的好处:

并行配置的项目。
重用配置不变的项目。
项目级的检查。
使用预制构件在建筑项目的依赖。

最后两个点尤为重要。你很少在工作的地方,很可能你的变化中包含的代码好几个项目。这意味着它将能够找出一遍又一遍地,避免不必要的项目建设。工作不是做是有史以来最快的工作。

结论

在本帖里,我们看了许多建议Madis粉红色的建议在他的会议会议。如果我们想要归结为几个简洁点,这里是一个名单:

上启用配置需求。
Gradle守护进程使用。
新版本它更快,也Java 1.8比1.6快。升级!
避免做昂贵的东西在配置阶段。
不要使用动态依赖关系(“x.y。+”)。
并行化。

这些建议将减少Gradle花费的时间配置本身,您的项目,和其他类似避免动态依赖关系和并行执行将构建代码的实际过程更快。最棒的是,这个建议也同样适用于你的Java项目和Android应用程序由Gradle相似。

我很乐意听到如果你有其他建议,可以加快Gradle构建。让我注意在下面的评论中,我会尽力传播知识。如果你尝试的任何建议从这篇文章中,我将很高兴听到结果。萍我在Twitter上:@shelajev让我们有一个聊天。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐