构建我的Android应用程序大约需要90秒("快速"),每次更新代码最多需要3分钟.完全浪费时间,我认为解决方案必须触手可及.我尝试调查这个问题,发现了不同的博客帖子和SO答案的建议,其中大部分是我尝试过的.
我有ordle.prodle.deperton = 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%:app:transformClassesWithDexForDebug
这个过程到底在做什么?我可以找到崩溃的人,但它对我来说很好,除了它花了很多时间.我是否需要它,因为此时我真的不需要Dex?
此外,我有13个依赖项和3个testCompile依赖项.我已经指出了特定的播放包,所以我不编译我不需要的东西.如果我理解正确,gradle正在构建每个项目构建的所有库.如果这是正确的,有没有办法跳过它?我可以自己构建它们作为已包装的库并包含它们而不需要每次处理它们吗?这可能会让我失去一些灵活性,以便将来改变依赖关系,但在这一点上,我觉得我在等待gradle时每天都会轻松失去一个多小时.我不确定灵活性对我来说是否值得这么多.
我期待得到关于如何改进构建过程的任何指示.先感谢您.
编辑:此时,我建议您在1.5安装时并排运行Android Studio 2.x. 您可以访问即时运行,这实际上有助于所有更新的工具.如果你留在1.5阅读...
我已经设法将Android Studio 1.5调试版本从2分钟加速到30秒.这可能不适用于您的命令行执行,但可能更快.
使用此配置,您的第一个IDE构建需要相同的时间,但即使您修改了类,增量构建也会更快.如果修改附加库,则会失去一些收益.
步骤1.(如果你足够幸运,目标minSdkVersion> = 21,请跳过此.)
@vanomart对minSdkVersion调试风格> = 21的回答并没有错,但唯一需要的部分是将以下内容添加到模块(app)build.gradle中,并确保在Build Variants选项卡中调试时调用 dev:
android { [...] productFlavors { dev { minSdkVersion 21 //The important bit. } prod { minSdkVersion 15 //Example. Set to your real requirement. } }
第2步.增量构建和预处理库.
在您的模块(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.确保您在模块(app)build.gradle中使用最新的buildToolsVersion.
android { buildToolsVersion "23.0.2" [...]
"...将所有模块中的构建工具版本更新到最新版本(23.0.2).[...]它将使用一个新的更快版本的dex,这有助于即时运行和完整构建更快一点".
资料来源:http://tools.android.com/tech-docs/instant-run
步骤4.使用最新的Gradle构建工具
在项目build.gradle中,设置为latest(当前为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首选项中,确保选中"使用默认Gradle包装器".我建议重新启动Android Studio以确保Gradle守护程序重新启动.
"在许多情况下,Gradle 2.9在执行增量构建时比Gradle 2.8快得多."
资料来源:docs.gradle.org/current/release-notes
升级到Android Studio 2.1和Android Gradle Plugin v2.1.0已基本解决了这个问题.安装更新的IDE后,系统还会提示您更新Gradle插件.如果root build.gradle文件包含以下行,您就会知道自己拥有正确的版本:
classpath 'com.android.tools.build:gradle:2.1.0'
重要信息:除了升级之外,还需要将分配给Gradle守护程序的内存量增加到2048mb,这样它就可以执行这个昂贵的dex-ing步骤.为此,请将以下内容添加到root gradle.properties文件中:
org.gradle.jvmargs = -Xmx2048m
在上面的问题中,我的构建时间同样慢,但升级后我的构建速度显着提高.有关详细信息,请参阅此处Android Gradle Plugin v2.1.0的发行说明:
http://developer.android.com/tools/revisions/gradle-plugin.html
只有对我有用的解决方案是禁用即时运行.
Android Studio - >首选项 - >构建,执行,部署 - >即时运行 - >取消选中'启用即时运行[...]'
构建时间从2分钟到40秒不等.
我遇到了同样的问题,我花了大约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') ... }
接下来要确保您实际使用此构建版本构建应用程序 .单击View - > Tool Windows - > Build tools并确保将构建变量设置为'devDebug'
对某些人来说,这可能已经足够了.我在SO中找到了很多线程,并且在reddit上发现了这个产品风味的东西,但这实际上并没有帮助我.帮助我的是手动升级gradle.既然你已经尝试过,我认为你走的是正确的轨道,但我建议使用更新的gradle版本2.9,其性能比 '2.8 提高了40%.