2015-12-08 34 views
52

构建我的Android应用程序需要大约90秒(“快速”),对于我的代码的每次更新最多需要3分钟。这是一个完全浪费时间,因为它真的,我假设一个解决方案必须在可及范围内。我试图调查这个问题,并发现不同的博客帖子和SO答案,其中大部分我已经尝试过。Gradle在transformClassesWithDexForDebug上构建变慢

  • 我有gradle.properties与org.gradle.deamon文件=真
  • 我在Android Studio中运行与摇篮Prefence进行离线工作(改善,但仍慢)
  • 我的命令运行行(这是更快,但仍慢)
  • 在的build.gradle,defaultConfig,我multiDexEnabled设置为false
  • 在的build.gradle,dexOptions,我必须设置为false
  • 在gradle这个-包装preDexLibraries。属性我获取最近的gradl这似乎需要很长时间E文版(2.8)(该显著速度的变化发生在2.4)

的过程中,总建造时间大约85%是:应用程序:transformClassesWithDexForDebug

那是什么进程其实在做什么我可以找到那些崩溃的人,但它对我来说很好,除了它需要很多时间。我是否需要它,因为我现在不需要Dex?

另外,我有13个依赖项和3个testCompile依赖项。我已经指出了具体的游戏包,所以我不编译我不需要的东西。如果我理解正确,gradle正在构建每个项目构建的所有这些库。如果这是正确的,有没有办法跳过?我可以自己将它们构建为封装库,并将它们包含在内,而不需要每次都处理它们?这可能会让我在将来对依赖关系进行更改时失去一些灵活性,但在这一点上,我觉得我在轻松等待gradle时每天会失去一个多小时。我不确定灵活性对我来说是否值得。

我期待得到关于如何改进我的构建过程的任何指示。先谢谢你。

+6

什么宽慰的是,有一个人在那里在完全相同的情况,因为我现在!在此期间你有任何进展吗?谢谢! – sjkm

+0

自从我发布这篇文章并尝试了我遇到的每一个建议,并取得了不同程度的成功之后,这已经有相当长的一段时间了。直到Android Studio 2.1发布为@ markdb314时,才真正将构建速度提升到了可以接受的程度。 尽管之前可能有售,但是由于这个版本很明显在做dex-step的过程。这大大降低了我的平均时间20-30秒。 –

+0

只是好奇,你使用新的数据绑定框架? – tir38

回答

9

升级到Android Studio 2.1和Android Gradle Plugin v2.1.0已经为我解决了这个问题。安装更新后的IDE后,系统会提示您更新您的Gradle插件。你会知道你有正确的版本,如果你的根的build.gradle文件中有如下一行:

classpath 'com.android.tools.build:gradle:2.1.0' 

重要:除了升级,还需要增加分配给摇篮守护进程的内存量2048mb,所以它可以执行这个昂贵的dex-ing步骤。要做到这一点,添加以下到你的根gradle.properties文件:

org.gradle.jvmargs = -Xmx2048m 

我有类似的缓慢积累倍,经历了上面的问题,但升级后我的生成速度大幅提升。见为Android摇篮插件的v2.1.0版本说明此处获得更多信息:

http://developer.android.com/tools/revisions/gradle-plugin.html

+0

在我的情况下,org.gradle.jvmargs = -Xmx2048m将字面速度提高了一个数量级。 – Hong

0

这似乎是Android Studio 2.0预览版中引入的新即时运行机制的一部分,它负责检测应用程序中的每个方法以创建未来代码修补程序的执行分支。恐怕这就是为什么它非常缓慢。

这很奇怪,即使即时运行被禁用,该任务仍然在发生。我必须将“com.android.tools.build:gradle”降级到1.3.0才能避免该任务。

+0

即使我降级,我仍然看到正在执行的任务。这不是我正在寻找的解决方案。谢谢你的建议。 –

+0

@JustinHammenga你是否将它降级到1.3.0?它也在1.5.0中,但不在1.3.0中。 –

5

我面临同样的问题,花了大约10个小时才最终解决问题,所以我知道你的感受。

我GOOGLE了很多,我也做了同样的配置的东西,你这样做即使它帮助了一点,编译和运行实际应用仍然是在屁股(疼痛有时花了2-3分钟的时候,我改变一行代码,但是当我做了更多的工作时,通常需要8分钟,而且我的电脑在此期间完全冻结)。

但足够的谈话,让我们来解决这个问题。 'app:transformClassesWithDexForDebug'的作用是解决Dalvik(5.0以前版本,api 21)操作系统版本的一些依赖关系,重要的是 - 它需要很长时间。您不需要开发它,因为您可以在> = 21上测试您的应用程序,因此为开发和发布创建独立的产品风格。这里是我的gradle这个构建,使得它的使用:

apply plugin: 'com.android.application' 

final VERSION_MAJOR = 0 
final VERSION_MINOR = 0 
final VERSION_PATCH = 0 
final VERSION_BUILD = 1 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 

    defaultConfig { 
     applicationId "com.app" 
     minSdkVersion 15 
     targetSdkVersion 23 
     multiDexEnabled true 
     versionName "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}" 
     versionCode VERSION_MAJOR * 10000000 + VERSION_MINOR * 100000 + VERSION_PATCH * 1000 + VERSION_BUILD 
    } 

    dexOptions { 
     incremental = true; 
     preDexLibraries = false 
     javaMaxHeapSize "2g" 
    } 


    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

    productFlavors { 
     dev { 
      minSdkVersion 21 
      applicationId = "com.app.test" 
     } 
     prod { 
      minSdkVersion 15 
      applicationId = "com.app" // you don't need it, but can be useful 

     } 
    } 

    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 
    packagingOptions { 
     exclude 'META-INF/DEPENDENCIES.txt' 
     exclude 'META-INF/LICENSE.txt' 
     exclude 'META-INF/NOTICE.txt' 
     exclude 'META-INF/NOTICE' 
     exclude 'META-INF/LICENSE' 
     exclude 'META-INF/DEPENDENCIES' 
     exclude 'META-INF/notice.txt' 
     exclude 'META-INF/license.txt' 
     exclude 'META-INF/dependencies.txt' 
     exclude 'META-INF/LGPL2.1' 
     exclude 'META-INF/ASL2.0' 
    } 
    lintOptions { 
     checkReleaseBuilds false 
     abortOnError true 
    } 

} 

afterEvaluate { 
    tasks.matching { 
     it.name.startsWith('dex') 
    }.each { dx -> 
     if (dx.additionalParameters == null) { 
      dx.additionalParameters = ['--multi-dex'] 
     } else { 
      dx.additionalParameters += '--multi-dex' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    ... 
} 

接下来的事情是要确保你实际上是在建立自己的应用符合这种build variant。点击查看 - >工具窗口 - >构建工具,并确保你有构建变种设置为'devDebug'

对于一些人来说,这可能就足够了。我在这里发现了很多线程,并且还发现了这个以产品味道为结尾的reddit,但这实际上并没有帮助我。帮助我的是手动升级gradle。既然你已经试图做到这一点,我认为你是在正确的轨道上,但我会建议使用更新的gradle版本2.9,它的'40% improved performance'超过2.8。

+1

谢谢你回复vanomart。这看起来很有希望,但我还没有得到它的工作。它构建了新的devDebug风格,但它仍然运行着同样的任务。 我是否需要afterEvaluate或compileOptions部分,我在您的构建设置中看到? –

+0

你不应该需要编译选项和afterEvaluate。当你简单地下载新的gradle时,我发现它不工作,你必须正确地将它安装在系统上,以便所有的gradle变量都能正确初始化。另外,如果你看一下项目中的.gradle目录,你会看到一些缓存的东西。删除所有不是2.9的东西。 TBH,我的构建运行速度更快,有时只需几秒钟,但有时又会持续1-2分钟。 – vanomart

29

编辑:在这一点上,我建议与您的1.5安装并排运行Android Studio 2.x。您可以访问即时运行,这对于所有更新的工具都非常有帮助。如果你留在1.5阅读...

我已经设法加速Android Studio 1.5调试版本从2分钟到30秒。这可能不适用于您的命令行执行,但可能会更快。

使用这个配置,你的第一个IDE构建需要时间相同金额,但增量版本是更快,即使你修改类。如果修改附加的库,则会损失一些收益。

步骤1(如果你有幸到目标的minSdkVersion的> = 21,请跳过这一点。)

@vanomart的具有> = 21的minSdkVersion调试味道的答案是不错了,但唯一需要的部分的build.gradle加入以下模块(应用程序),并确保你的目标开发,同时在构建调试异体标签:

android { 
    [...] 
    productFlavors { 
     dev { 
      minSdkVersion 21 //The important bit. 
     } 
     prod { 
      minSdkVersion 15 //Example. Set to your real requirement. 
     } 
    } 

第2步:增量构建和公关电子dexing库。

在您的模块(app)build.gradle中设置以下配置。这对于IDE构建来说更快,而不是那些从头开始构建每个构建的构建器 - 服务器。的 “提高构建服务器性能”

android { 
    [...] 
    dexOptions { 
     preDexLibraries true 
     javaMaxHeapSize "2g" // Use gig increments depending on needs 
     incremental true 
    } 

来源,做(部分)逆: http://tools.android.com/tech-docs/new-build-system/tips#TOC-Improving-Build-Server-performance

第3步:确保您使用最新buildToolsVersion在模块(应用程序)的build.gradle

android { 
    buildToolsVersion "23.0.2" 
    [...] 

” ......更新所有模块的最新 (23.0.2)构建工具版本。[...]它将使用DEX的一个新的更快的版本,这有助于 即时运行和完整版本都要快一点。“

来源:http://tools.android.com/tech-docs/instant-run

第4步:使用最新的摇篮构建工具

在你项目的build.gradle,设置为最新的(目前2.0.0-alpha6)

buildscript { 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.0.0-alpha6' 

更新列表:http://tools.android.com/tech-docs/new-build-system

第5步。使用最新的Gradle包装。修改gradle-wrapper.properties,更新此行使用2.10:

distributionUrl=https\://downloads.gradle.org/distributions/gradle-2.10-all.zip 
#Alternative url if the above does not work: 
#distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip 

在Android Studio中的喜好,确保您选择了 “使用默认摇篮包装”。我建议重新启动Android Studio以确保Gradle守护程序重新启动。

“在很多情况下,当 执行增量构建时,Gradle 2.9比Gradle 2.8快得多。”

来源:docs.gradle.org/current/release-notes

+0

非常感谢!我的gradle版本现在快了50%(从2分钟到1分钟)! –

+3

我已经遵循每一步并正确设置了一切。它仍然是*** ***慢...多么糟糕的软件。 Google令我非常失望。在此期间的任何进展?但是,嘿构建时间从6分钟减少到56秒!非常感谢您的大力帮助! – sjkm

+0

谢谢你dyson退货。我的gra子在一些情况下显着加速,从2.5分钟到几秒。 –

0

您的应用程序有一个数据库?数据库是否有大尺寸?

如果是:

  • 移除资产文件夹中的DB(或任何你把它),做构建
  • 测量生成时间
  • 在我的情况的区别:这是一个戏剧性的从45秒差下降到15秒

如果否:

  • 在增量构建期间监控Gradle控制台并查看哪些操作花费最多时间
12

只有解决方案对我来说就是禁用即时运行。

Android的工作室 - >首选项 - >构建,执行,部署 - >即时运行 - >取消选中 '启用即时运行[...]'

修建从过了2分钟就到40秒。

+0

为我工作。谢谢 – Bolein95

+0

非常感谢>>即时运行也会删除文件夹中的任何输出apk.I想知道为什么发生这种情况 – reidisaki

+0

这也适用于我。建造时间从约80秒变为约12秒。猜猜他们仍然有一些扭曲的工作。 – Cognitio