使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 SUCCESSFULTotal time: 8.674 secs

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

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

 ./gradlew :android:assembleDebug --dry-run --profileopen 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 SUCCESSFULTotal 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 SUCCESSFULTotal 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 SUCCESSFULTotal 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 carereturn 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让我们有一个聊天。

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

  1. 第一台全部采用超级计算机,北京时间2016年6月20日,(神威·太湖之光)是我国第一台全部采用国产处理的世界最快的超级计算机。...

    问题描述: 神威·太湖之光超级计算机是由国家并行计算机工程技术研究中心研制.安装在国家超级计算无锡中心的超级计算机. 神威·太湖之光超级计算机安装了40960个中国自主研发的"申威26010 ...

  2. 新浪微博爬虫分享(2016年12月01日更新)

    前言: 上篇文章:<新浪微博爬虫分享(一天可抓取 1300 万条数据)>.<新浪微博分布式爬虫分享> Github地址:SinaSpider Q群讨论: 更新完<QQ空间 ...

  3. 2016年3月23日作业

    软考中高项学员:2016年3月23日作业  一.项目进度管理 1.进度管理包括哪六个过程? 答:(1)活动定义:确认一些特定的工作,通过完成这些活动就完成了工程项目的各项目细目. (2)活动排序:明确 ...

  4. 2016年7月6日,阿里巴巴集团和上汽联合发布全球首款互联网汽车

    一段试车视频广为传播:阿里巴巴集团董事局主席马云和上汽集团董事长陈虹坐在一辆SUV的后排,副驾驶的位置上是阿里巴巴集团技术委员会主席王坚,司机则是阿里巴巴集团CEO张勇. 7 月6 日,杭州西湖区云栖 ...

  5. 2016年4月1日作业

    软考信息系统监理师:2016年4月1日作业 一.合同管理 1.合同按照信息系统工程范围划分哪几类? 答:1)总承包合同:2)单项项目承包合同:3)分包合同 2.签订分包合同,应具备的2个条件是什么? ...

  6. 软考信息系统监理师:2016年4月1日作业

    软考信息系统监理师:2016年4月1日作业 一.合同管理 1.合同按照信息系统工程范围划分哪几类? 答:从信息系统工程的不同范围和数量进行划分,可以分为信息系统工程总承建 合同.信息系统工程承建合同. ...

  7. 面试经历---Samp;G(2016年02月27日上午面试)

    S&G是一家外企,在广州琶州那边,下面附上这家企业的笔试题. 2016年2月27日上午笔试题 一.      JAVA基础题 1.   什么是接口? 接口就是一些方法特征的集合,是对对象的抽象 ...

  8. 2016年3月26日作业 质量管理和人力资源管理

    2016年3月26日作业 质量管理和人力资源管理 一.质量管理 1.质量管理基本原则? 质量管理基本原则是: 以实用为核心的多元要求 系统工程 职工参与管理 管理层和第一把手重视 保护消费者权益 面向 ...

  9. 紫禁繁花服务器维护,梦幻西游手游2016年12月28日维护公告

    梦幻西游手游2016年12月28日维护公告,小编为大家带来梦幻西游手游2016年12月28日维护公告,希望可以帮助到各位小伙伴们. 亲爱的玩家朋友: 为保证服务器的运行稳定和服务质量,<梦幻西游 ...

最新文章

  1. 中兴SDH原理介绍及中兴E300网管介绍
  2. 简述linux各个组成部分的定义及功能,Mariadb的架构及相关概念
  3. 视频|每日CeBIT:IBM九大展区各显神通,传统工业与工业4.0的博弈
  4. 汇编语言随笔(5)-and、or指令,串传送指令movsb、访问内存单元的方式及实验4,5(向内存传送数据)
  5. 认证模式之Basic模式
  6. Spring框架初写
  7. ADF:动态视图对象
  8. java中菜单不显示_菜单不显示
  9. Percona XtraBackup
  10. php的四种常见运行方式
  11. Win11录屏怎么录声音?Win11录屏幕视频带声音的方法
  12. Java 基于JavaMail实现向QQ邮箱发送邮件
  13. Vue 键盘事件(keyup、keydown)
  14. unity上传头像_unity通过http上传图片到服务器
  15. 博途plc连接电脑_西门子博途怎么上载plc程序
  16. 面试题-渗透测试实习生
  17. 怎样用C语言打造炫酷的图形编程
  18. PPT模板 | 蓝色3D风工作汇报PPT模板
  19. python lxf
  20. 7和7的倍数游戏答案_月流水一亿的传奇游戏“贪玩蓝月”遭遇危机,还能够延续辉煌吗?...

热门文章

  1. 免费可商用图片素材、高清无版权图片、免费可个人和商业用途图片
  2. AM5728概述(2)
  3. linux中删除文件的命令
  4. “国际软件自由日”头脑风暴成果
  5. 图像特征提取——灰度共生矩阵(GLCM)
  6. 讨教大学|2022中质协六西格玛黑带考试时间
  7. 实锤!Grin系中国媒体炒作,“硬核”都经不起推敲
  8. VCS+Verdi联合仿真demo教程
  9. 关于“机器人离线编程”国内外近三年的研究
  10. arm汇编指令探究之 ldmia