问答中心分类: ANDROID通过Gradle和Android Studio构建和运行应用程序的速度比通过Eclipse慢
0
匿名用户 提问 3月 前

我有一个多项目(~10个模块),其中每次构建大约需要20-30秒。当我在Android Studio中按Run时,我每次都必须等待来重建应用程序,这非常缓慢。
有可能在Android Studio中自动化构建过程吗?或者你对如何加快这个过程有什么建议吗?
在Eclipse中,由于自动构建,在模拟器上运行同一个项目大约需要3-5秒。
这是我的身材。gradle文件(应用程序模块):

buildscript {
    repositories {
        maven { url 'http://repo1.maven.org/maven2' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.4'
    }
}
apply plugin: 'android'

dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
    compile project(':libraries:SharedLibs')
    compile project(':libraries:actionbarsherlock')
    compile project(':libraries:FacebookSDK')
    compile project(':libraries:GooglePlayServices')
    compile project(':libraries:HorizontalGridView')
    compile project(':libraries:ImageViewTouch')
    compile project(':libraries:SlidingMenu')
}

android {
    compileSdkVersion 17
    buildToolsVersion "17.0.0"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 16
    }
}
CommonsWare 回复 3月 前

请记住,目前基于Gradle的构建系统和Android Studio都不是生产级的。

CommonsWare 回复 3月 前

在这里待的时间很可能是在德兴阶段。不幸的是,android studio的make似乎每次都会执行一次清理,导致之前的索引文件被删除。希望我们很快就能看到增量构建修复。

CommonsWare 回复 3月 前

同时,有没有简单的方法来告诉我们,更改默认的Gradle任务,使它们不总是执行干净的任务?

CommonsWare 回复 3月 前

@好吧,现在我们使用1.02版是没有借口的,但它仍然是一个主要问题。Android studio运行我的4GB四核笔记本电脑,使用了大约3.75gb的内存,只保存了hello world项目的一个实例。结果也是非常缓慢的。对我来说,这表明了一个严重且持续存在的设计缺陷。我希望事情尽快解决。

CommonsWare 回复 3月 前

@AndrewS:我的8GB四核Ubuntu笔记本在Android Studio上只需要518MB内存,有一个“hello,world”大小的项目,一个完整的项目构建,并在模拟器上运行(模拟器是一个单独的310MB,我相信Gradle守护程序是另一个单独的310MB)。也许你的安装有问题。

CommonsWare 回复 3月 前

@谢谢你的回复。有趣的是,这是否表明Android studio在windows环境下运行的方式存在问题?我这么说是因为只有一个打开了5个标签的浏览器,Android studio将其推高至3.75。关闭Android studio后,内存消耗降至1.4到1.6gb之间。我猜如果我在Linux机器上启动它,我会得到同样的性能优势吗?你是否考虑到Android studio也会引发Java。exe来运行一个非常高的内存负载,所以单独运行可能不会看起来那么糟糕?

CommonsWare 回复 3月 前

@AndrewS:“这是否表明Android studio在windows环境下运行的方式存在问题?”——真让我受不了。我不经常运行Windows。“在关闭Android studio时,内存消耗降至1.4到1.6gb之间”——如果我正确理解Android studio的行为,这也应该会关闭Gradle守护进程。“你是否考虑到Android studio也会导致Java.exe运行一个非常高的内存负载,所以单独运行可能不会那么糟糕?–是的。

CommonsWare 回复 3月 前

@好的,谢谢你提供的信息。看起来我可能需要更改操作系统。

CommonsWare 回复 3月 前

@AndrewS我觉得很遗憾,我们需要改变我们的操作系统,只是为了让gradle以合理的速度运行,而不是以前的工具。

CommonsWare 回复 3月 前

@理查德·勒梅苏里尔。我同意。事实上,我不得不将自己的电脑大幅升级到600美元。现在,有了高规格的Core i7、16gb或ram和SSD硬盘驱动器,我可以从全新的所谓“更好”开发工具中获得“增强”的性能。

CommonsWare 回复 3月 前

我把内存从4gb升级到8gb,现在用了50秒,而不是以前的54秒,每次节省了4秒

CommonsWare 回复 3月 前

你应该看看堆栈溢出。com/a/58754073/1677824

28 Answers
0
Sergii Pechenizkyi 回答 3月 前

硬件
很抱歉,但将开发站升级到SSD和成吨的ram可能比下面几点加起来的影响更大。
工具版本
提高构建性能是开发团队的首要任务,所以请确保使用最新版本GradleAndroid Gradle插件.
配置文件
创建一个名为gradle.properties在任何适用的目录中:

  • /home/<username>/.gradle/(Linux)
  • /Users/<username>/.gradle/(Mac)
  • C:\Users\<username>\.gradle(窗口)

附加:

# IDE (e.g. Android Studio) users:
# Settings specified in this file will override any Gradle settings
# configured through the IDE.

# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html

# The Gradle daemon aims to improve the startup and execution time of Gradle.
# When set to true the Gradle daemon is to run the build.
# TODO: disable daemon on CI, since builds should be clean and reliable on servers
org.gradle.daemon=true

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# https://medium.com/google-developers/faster-android-studio-builds-with-dex-in-process-5988ed8aa37e#.krd1mm27v
org.gradle.jvmargs=-Xmx5120m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
org.gradle.parallel=true

# Enables new incubating mode that makes Gradle selective when configuring projects. 
# Only relevant projects are configured which results in faster builds for large multi-projects.
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:configuration_on_demand
org.gradle.configureondemand=true

# Set to true or false to enable or disable the build cache. 
# If this parameter is not set, the build cache is disabled by default.
# http://tools.android.com/tech-docs/build-cache
android.enableBuildCache=true

如果将Gradle properties放置在projectRoot\gradle.properties如果你把它们放在user_home\.gradle\gradle.properties.如果从控制台或直接从idea运行gradle任务,则应用以下属性:
IDE设置
可以从IDE设置GUI调整Gradle IntelliJ集成。启用“脱机工作”(检查来自雅娃将禁用每个“同步梯度文件”上的真实网络请求。
IDE设置
本机多索引
apk构建最慢的步骤之一是将java字节码转换为单个dex文件。启用本机multidex(minSdk 21仅适用于调试构建)将有助于工具减少工作量(从阿克塞尔·威格特下面)。
Dependencies
更喜欢@aar对库子项目的依赖性。
搜索aar软件包马文中心,jCenter或使用jitpack。木卫一从github构建任何库。如果您没有编辑依赖项库的源,那么不应该每次都使用项目源来构建依赖项库。
杀毒软件
考虑将项目和缓存文件排除在防病毒扫描之外。这显然是与安全性的权衡(不要在家里尝试!)。但如果你经常在分支之间切换,那么杀毒软件会在允许gradle进程使用它之前重新扫描文件,这会减慢构建时间(尤其是带有gradle文件和索引任务的AndroidStudio同步项目)。在启用和不启用防病毒的情况下测量构建时间和进程CPU,以查看是否相关。
分析构建
Gradle内置了对分析项目.不同的项目使用不同的插件和自定义脚本组合。使用--profile将有助于发现瓶颈。

younes0 回复 3月 前

关于@aar依赖性:使用例如dependencies {compile 'com.android.support:support-v4:21.0.+'}这是一个缓慢的解决方案吗?不太明白

Sergii Pechenizkyi 回复 3月 前

图像处理,您添加了如下库:github。com/novak/numberpicker.它有价值,为一个问题提供了代码解决方案,但作者并没有像maven或jCenter那样在任何地方发布它。现在,您要么将该库作为源代码引入到项目中,并在每次主项目构建时构建它,要么一次性编译它,并仅将@aar提交到项目存储库中。因此,它实际上是一个源代码/二进制依赖项选择。如果不编辑源代码,则应将依赖项作为预编译的二进制文件。对于普通java库来说,这是一个很好的例子。jar,适用于android库。aar

Duncan Jones 回复 3月 前

不要使用自动导入功能(目前)“>你能解释一下Android Studio在哪里启用/禁用此功能吗?我不确定你指的是什么。

Sergii Pechenizkyi 回复 3月 前

这是项目设置>渐变。请参见下面的屏幕截图:i、 堆叠。伊姆格。com/wrwgo。巴布亚新几内亚

3c71 回复 3月 前

我已经按照描述设置了所有优化,但是在Android Studio中启动我的应用程序需要3到4分钟,而在Eclipse中大约需要30秒。废话。只有12个项目,一个应用程序可以运行!Android dev现在变得如此笨重,这已经是一年多以后的事了。

A.G. 回复 3月 前

我应用了所有的优化,构建HelloWorld apk仍然需要大约20秒,而在Eclipse中需要2-3秒。

Sergii Pechenizkyi 回复 3月 前

那你为什么不使用Eclipse呢?为什么我们要比较构建系统和IDE?Gradle是关于开发者的特性和可能性。性能只是它的一个特点。尝试设置Ant(我假设您将Ant与Eclipse一起使用)来处理Gradle build可以处理的所有情况,并比较需要多少时间。Gradle、Ant、Maven、Buck、Bazel、Sbt这些天,android开发者有足够多的选择。

Henrique de Sousa 回复 3月 前

@3c71,你的问题解决了吗?我在同一条船上,1个应用程序,3个项目,需要2~3个小时

3c71 回复 3月 前

@不幸的是,亨利克德苏萨没有。我升级到了最新的AS(来自金丝雀频道),最新的gradle测试版(我想是1.3b3),这让我疯狂。这个问题追踪器确实有所帮助,但也有其他缺点:密码谷歌。com/p/android/issues/detail?id=80272.使用这种方法,我成功地将构建时间降低到45秒,不幸的是,我必须运行两次,才能正确更新所有依赖项:(

Henrique de Sousa 回复 3月 前

我们已经发现了问题:是retrolambda强制构建所有内容(因此在增量构建中没有优势)。移除retrolambda后,问题得到了解决。希望它能帮助别人。

Engineer 回复 3月 前

@HenriquedeSousa为什么你不能在回答中对“删除retrolambda”进行更好的描述,以供其他人使用?

Henrique de Sousa 回复 3月 前

事实上,你一开始就应该这么做。我听从了你的建议并回答了。谢谢

dharam 回复 3月 前

好吧,它比以往任何时候都慢,遵循这些步骤。Android studio糟透了!!

user3575963 回复 3月 前

要禁用哪些插件?

EntangledLoops 回复 3月 前

参数--daemon不再存在。您仍然可以使用配置文件来获取守护程序行为。

Glenn Maynard 回复 3月 前

没有什么比顶级用户目录中的dotfiles更适合Windows端口。

Neon Warge 回复 3月 前

我很穷,有食物代码,住在贫民窟,有一个最烂的互联网。这个解决方案不适用于我。悲哀的

leRobot 回复 3月 前

我想在硬件部分添加以下内容:RAM是必不可少的,16GB是我现在的最低要求。我曾在3个大型项目中工作过(参考:+200个课程,在约500 LOC、play services、guava和/或其他“重”依赖项),我注意到RAM升级,尤其是8GB到16GB的跳跃,有着巨大的影响——想想10分钟到30秒。此外,在Windows和Linux下的SSD’d和I7机器上都注意到了这种截然不同的性能差异,它们运行着我常用的工作区功能(20tabs Chromium、HQ Spotify、random TextEditor和一个CLI/Putty/SSH或两个在一旁空转)

AndrewPK 回复 3月 前

默认情况下,只要您运行的是最新(目前是3.1)版本的android studio,并且您运行的是api级别为21或更高的设备,就会启用本机多重索引。Android studio runs+安装将自动将api级别传递给构建过程,并根据需要启用本机多索引。

Manuel Jordan 回复 3月 前

对于作者,关于TODO: disable daemon on CI, since builds should be clean and reliable on servers考虑阅读:github。com/gradle/gradle/issues/2824

0
yava 回答 3月 前

您可以忽略gradle更新日期检查。
在此处输入图像描述
对于运行Android Studio 1.5的Windows:转到File -> Settings -> Build, Execution, Deployment -> Build tools -> Gradle -> Check Offline work (as shown in image)
从30秒以上降至3秒

John Ballinger 回复 3月 前

这很酷。这要快得多。但这会打破什么呢?

Kavin Varnan 回复 3月 前

最好的解决方案。我能知道这个解决方案的副作用吗

cprcrack 回复 3月 前

@约翰巴林格脱机工作-使用此复选框在脱机模式下与Gradle一起工作。在这种情况下,Gradle将使用缓存中的依赖项。Gradle不会尝试访问网络以执行依赖项解析。如果依赖项的缓存中不存在所需的依赖项,则生成执行将失败。(来源:喷气式飞机。com/idea/help/gradle-2。html)

Ehtesh Choudhury 回复 3月 前

在通过网络之前,是否默认先使用缓存的依赖项?我无法想象每次都会检查更新的依赖项gradle他跑了。真奇怪。

stepanian 回复 3月 前

@这很奇怪。整个Gradle/Android Studio开发环境太慢了。大多数人认为它很慢是因为Java。我在IDEA上做服务器端Java开发,运行非常顺利。

0
odiggity 回答 3月 前

到处寻找,终于找到了一个适合我们的解决方案。启用并行构建(在OSX上:preferences -> compiler -> gradle -> "Compile independent modules in parallel")启用“自动生成项目”可以将时间从约1分钟缩短到约20秒。多亏了/u/共价。
http://www.reddit.com/r/androiddev/comments/1k3nb3/gradle_and_android_studio_way_slower_to_build/

Johannes Brodwall 回复 3月 前

20秒仍然非常慢。

Sam 回复 3月 前

请记住,这显然只在你有多个独立的模块/项目时有用。我在一个单一模块的应用程序上进行了测试,结果没有任何差别。

Sermilion 回复 3月 前

我有一个相当大的项目,在MacBook Pro 2012 Core i7,8GB内存上需要2-3分钟。还好吗?

0
Andreas Løve Selvik 回答 3月 前

我最近买了一个新的SSD,从Windows转到Linux。我的构建时间现在快了一个数量级,不再烦人。
虽然它没有直接回答您为什么它比eclipse慢的问题,但它表明这个过程是磁盘受限的,升级到SSD可能是一个(有些昂贵)的解决方案。我猜会有人在谷歌上搜索这个问题,最终来到这里,他们可能会欣赏我的经历。

spaaarky21 回复 3月 前

我团队中的开发人员在具有大量内存的快速机器中安装了快速SSD。对于一个非平凡的应用程序,在一个微小的代码更改后重新部署仍然需要约45秒,而在Eclipse中几乎是立即重新部署。即使运行一个普通的、非Android的JUnit,速度也慢得让人望而却步。到目前为止,“升级”到Android Studio和Gradle是一个很大的降级:-/

younes0 回复 3月 前

@Lionleaf从windows切换到linux要快多少?

Andreas Løve Selvik 回复 3月 前

@我不知道。我在切换到SSD的同时切换到了Linux。我并不是说它有任何积极的影响,只是我为了加速而改变了这两个变量。

在我的例子中,从Windows切换到Linux导致Android构建速度提高了40%。。。所以这绝对值得

Eric Cornelson 回复 3月 前

我支持@Bartosz Kosarzycki说的话。我最终在我的开发机器上运行了一个带有virtualbox的Ubuntu虚拟机~在windows上构建54秒,在同一硬件上的虚拟机中构建7秒。通过使用Linux来实现疯狂的加速。

0
Ahmad Aghazadeh 回答 3月 前

在Android Studio 3.2.1中加速Gradle构建
你是否觉得自己在Android Studio中等待构建完成有几分钟的时间?我也是。这是一个相当烦人的问题。
第一步:更新Gradle版本
在此处输入图像描述
使现代化
换成渐变版本:4.6Android插件版本:3.2.1
在此处输入图像描述
从下载Gradle Release distributivehttps://services.gradle.org/distributions/gradle-4.6-all.zip并将其复制到Gradle文件夹:
在此处输入图像描述
最后一步是在设置>渐变中添加您的描述
在此处输入图像描述
不要忘记单击“应用”保存更改。
第二步:为项目启用脱机模式、Gradle守护程序和并行构建
在此处输入图像描述

  1. 从android studio设置进入编译器,在命令行框中添加“-offline”,然后单击并行编译独立模块。

在此处输入图像描述
下一步是为您的项目启用Gradle守护程序和并行构建。并行构建将导致您的多模块项目(Gradle中的多项目构建)并行构建,这将使大型或模块化项目的构建速度更快。
在此处输入图像描述
这些设置可以通过修改名为gradle的文件来启用。Gradle脚本目录中的属性(即~/.Gradle/Gradle.properties)。其中一些选项(例如并行的Complie模块)可以从Android Studio获得,并且默认情况下也在那里启用,但将它们放在渐变中。从终端构建时,属性文件将启用它们,并确保同事使用相同的设置。但如果你在一个团队中工作,有时你不能做这些事情。

# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit org.gradle.parallel=true
# When set to true the Gradle daemon is used to run the build. For local developer builds this is our favorite property.
# The developer environment is optimized for speed and feedback so we nearly always run Gradle jobs with the daemon.
 org.gradle.daemon=true

使用守护进程将使构建启动更快,因为它不必每次都启动整个Gradle应用程序。Gradle守护进程在默认情况下不启用,但建议始终在开发人员的机器上启用它(但在持续集成服务器上禁用它)。有关此模式的常见问题可在此处找到https://docs.gradle.org/current/userguide/gradle_daemon.html.http://gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects详细信息)。
第三步:启用增量dexign和调整内存设置
在此处输入图像描述
将此选项添加到android块:

dexOptions {
    incremental true
}

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

dexOptions {
    incremental true
    javaMaxHeapSize "12g"
}

其中“12g”是12GB的内存。关于这方面的更多信息可以在谷歌这里找到。github。io/android gradle dsl/current/

# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

请参见此处的所有参数列表:https://docs.gradle.org/current/userguide/userguide_single.html#sec:gradle_configuration_properties详细信息。
第4步:禁用杀毒软件
有用的链接