Gradle在transformClassesWithDexForDebug上构build得慢

构build我的Android应用程序需要大约90秒( “快” ),每次更新我的代码最多3分钟。 这是一个完全浪费时间,因为它真的,我认为一个解决scheme必须在触手可及的范围内。 我试图调查这个问题,发现不同的博客post和SO的答案与build议,其中大部分我已经尝试。

  • 我有org.gradle.deamon = true的gradle.properties文件
  • 我使用Gradle Prefence在Android Studio上运行以进行离线工作(改进,但仍然很慢)
  • 我运行命令行(这是更快,但仍然缓慢)
  • 在build.gradle,defaultConfig中,我将multiDexEnabled设置为false
  • 在build.gradle,dexOptions中,我将preDexLibraries设置为false
  • 在gradle-wrapper.properties中,我获取了一个最近的gradle版本(2.8)(在2.4上发生了显着的速度变化)

这个过程似乎需要很长时间,大约85%的构build时间是:app:transformClassesWithDexForDebug

这个过程究竟在做什么? 我可以find那些崩溃的人,但它对我来说工作正常,除了它需要很多时间的事实。 我是否需要它,因为我现在不需要Dex?

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

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

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

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

重要说明:除了升级之外,还需要将分配给Gradle守护进程的内存量增加到2048mb,因此它可以执行这个昂贵的dex-ing步骤。 为此,请将以下内容添加到您的根gradle.properties文件中:

 org.gradle.jvmargs = -Xmx2048m 

在上面的问题中,我的构build时间同样缓慢,但在升级之后,构build速度急剧增加。 有关详细信息,请参阅Android Gradle插件v2.1.0的发行说明:

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

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

我设法加快了Android Studio 1.5的debugging时间,从2分钟到30秒。 这可能不适用于您的命令行执行,但可能会更快。

使用此configuration,您的第一个IDE构build需要相同的时间 ,但即使您修改了类,增量构build也会更快 。 如果您修改附加的库,则会损失一些收益。

第1步(如果你已经足够的目标minSdkVersion已经> = 21,跳过这一点。)

@vanomart的minSdkVersiondebugging风格大于等于21的答案是没有错的,但是唯一必要的部分是将以下内容添加到模块(app)build.gradle,并确保在debugging时在Build Variants选项卡中指定开发者:

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

第2步。增量构build和预分解库。

在你的模块(应用程序)build.gradle设置下面的configuration。 这对于IDE构build来说更快,而不是那些从头开始构build每个构build的构build器 – 服务器。

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

来源,做(部分)“改善build设服务器性能”: http : //tools.android.com/tech-docs/new-build-system/tips#TOC-Improving-Build-Server-performance

第3步。确保你在模块(app)build.gradle中使用最新的buildToolsVersion

 android { buildToolsVersion "23.0.2" [...] 

“…将所有模块中的构build工具版本更新到最新版本(23.0.2),它将使用一个新的更快版本的dex,这有助于即时运行和完整版本更快一点“。

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

第4步。使用最新的Gradle构build工具

在您的项目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首选项中,确保select了“使用默认的Gradle包装器”。 我build议重新启动Android Studio以确保Gradle守护程序重新启动。

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

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

只有解决scheme,为我工作是禁用即时运行。

Android Studio – >首选项 – >生成,执行,部署 – >即时运行 – >取消勾选'启用即时运行[…]'

build立从2分钟到40秒。

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

我search了很多,我做了和你一样的configuration,即使它有一点帮助,编译和运行实际的应用程序仍然是痛苦的(有时需要2-3分钟,当我改变一行代码但是当我做了更多的工作时,通常需要8分钟,而且我的电脑在这段时间内完全被冻结了)。

但足够的谈话,让我们解决这个问题 “app:transformClassesWithDexForDebug”的function在于,它解决了Dalvik(5.0之前版本,api 21)操作系统版本的一些依赖关系,什么是重要的 – 这需要花费很多时间。 您不需要开发它,因为您可以在> = 21上testing您的应用程序,因此为开发和发布创build独立的产品风格。 这是我的gradle构build使用它:

 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变体来构build你的应用程序。 点击查看 – >工具窗口 – >生成工具,并确保你有build立变种设置为'devDebug'

对于一些人来说,这可能就够了。 我在这里发现了很multithreading,并且也是以这个产品味道的东西结束的reddit,但是这实际上并没有帮助我。 帮助我的是手动提升gradle。 既然你已经试过了,我认为你是正确的,但是我build议你使用新版本的Gradle版本2.9,它的性能提高了40%,超过了2.8。

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

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

你的应用程序是否有数据库? 数据库是否有大尺寸?

如是:

  • 从资产文件夹(或任何你保留的地方)中删除数据库,然后进行构build
  • 衡量构build时间的差异
  • 在我的情况下:这是一个从45秒到15秒戏剧性的差异

如果不:

  • 在增量构build期间监控Gradle控制台,看看哪些操作花费最多的时间