Gradle(Android Studio)构build时间非常长

现在我们处于一个非常简单的变化,build立时间2分30秒的情况。 这(与ANT相比)速度惊人,正在扼杀整个团队的生产力。 我正在使用Android Studio并使用“使用本地gradle分发”。 我试图给更多的内存gradle:

org.gradle.jvmargs = -Xmx6096m -XX:MaxPermSize = 2048m -XX:+ HeapDumpOnOutOfMemoryError -Dfile.encoding = UTF-8

更多的记忆。 而且它不时地给记忆提供错误。

线程“pool-1-thread-1”中的exceptionjava.lang.OutOfMemoryError:超出GC开销限制

惊人。 我正在使用并行选项和守护进程:

org.gradle.parallel =真

org.gradle.daemon =真

这并没有真正的帮助。

我已经把前面提到的参数放在〜/ .gradle / gradle.properties中(我甚至怀疑Android工作室正在忽略这个,所以我testing了一下 – 它不会忽略它)。

仍然从terminal我得到1:30构build时间比2:30在Android Studio中,所以不知道那里有什么问题。 与ant相比,1:30仍然是疯狂的。 如果你知道Android Studio在做什么(或者忽略,或者改写为gradle config),我将不胜感激。

所以只是CMD + B(简单编译)在更改后超快,如7秒。 但是,当运行应用程序,它启动任务dexXxxDebug,这只是杀了我们。 我试过了

dexOptions { preDexLibraries = false } 

没有帮助。

我明白,gradle可能还没有准备好用于生产环境,但我开始后悔我们这么早就做出这个决定。 我们有很多模块,这可能是问题的一部分,但这对Ant来说不是问题。

任何帮助表示赞赏,丹

有关执行时间的更多信息:

说明时间

 Total Build Time 1m36.57s Startup 0.544s Settings and BuildSrc 0.026s Loading Projects 0.027s Configuring Projects 0.889s Task Execution 1m36.70s 

吃饭时间::app:dexDebug 1m16.46s

我不太清楚为什么Android Studio比命令行慢,但是可以通过打开增量分类来加速构build。 在您的模块的构build文件中,将此选项添加到您的android块:

 dexOptions { incremental true } 

在该dexOptions块中,还可以指定dex进程的堆大小,例如:

 dexOptions { incremental true javaMaxHeapSize "4g" } 

这些选项来自adt-dev邮件列表( https://groups.google.com/forum/#!topic/adt-dev/r4p-sBLl7DQ )上的一个线程,它有更多的上下文。

我们的团队面临同样的问题。 我们的项目超过了dex(> 65k)的方法限制。 所以,在图书馆项目,我们把下面的选项放在build.gradle:

 dexOptions { jumboMode = true preDexLibraries = false } 

在我们的项目build.gradle:

  dexOptions { jumboMode = true // incremental true } 

以前我们有增量真实。 在发表评论之后,大约需要20分钟才能跑2分30秒。 我不知道这可能会解决你的问题。 但它可以帮助别人。 🙂

免责声明:这不是一个解决scheme – 这是一个声明,没有相关的链接来源certificate它的解决scheme。

由于这里的所有答案都不能解决自2014年以来一直存在的问题,所以我将继续并发布一些描述非常相似的问题的链接,并介绍可能或不可能帮助的操作系统特定的调整,因为OP确实似乎没有详细说明,解决scheme在他们之间差异很大。

首先是关于并行化的实际的AOSP bug跟踪问题 ,有很多相关的东西,仍然是开放的,而且还有很多人在2.2.1版本中抱怨。 我喜欢那个注意到这个问题的人(包括那个高级别的人),其中包括“666”不是巧合。 大多数人在构build过程中描述音乐程序和鼠标移动口吃的方式感觉就像看着镜子一样…

你应该注意到人们用Windows的套索报告好东西,而我看不到有什么报告在* nix变体中使用renice或cpu-limiting。

这个人 (他说他不使用gradle)在Ask Ubuntu中实际上提供了一些非常好的东西,不幸的是在我的情况下不起作用。

这是限制gradle执行线程的另一个select ,但是在我的场景中并没有真正改善,这可能是由于某人在关于studio产生多个gradle实例的另一个链接上(而参数只影响一个实例的并行性)所说的。

请注意,这一切都回到原来的“666”,高优先级的问题…

我个人无法testing许多解决scheme,因为我工作在一个托pipe(没有root权限)的Ubuntu机器,不能apt-get / renice,但我可以告诉你,我有一个i7-4770,8GB RAM和一个混合固态硬盘,我有这个问题,即使经过了很多年的记忆和gradle调整 。 这是一个令人兴奋的问题,我不明白谷歌如何没有提供必要的人力资源到gradle项目来解决他们构build的最重要平台的核心开发问题。

在我的环境中需要注意的一件事情是:我在一个多依赖工作室项目中工作,有大约10个子项目,他们都是自己构build并填充了gradlepipe道。

传递一个值时,可以附加字母“k”表示千字节,“m”表示兆字节,“g”表示千兆字节。

对于Linux用户,这有助于: sudo renice -n 20 -p <pid of gradle daemon>

你可以使用命令findpid: pgrep -la javafind“.gradle / daemon”,selectpid。

'–offline'解决了我的问题。