在transformClassesWithDexForDebug

时间:2015-12-08 14:56:04

标签: gradle android-build

构建我的Android应用大约需要90秒(“fast”),每次更新代码最多需要3分钟。完全浪费时间,我认为解决方案必须触手可及。我尝试调查这个问题,发现了不同的博客帖子和SO答案的建议,其中大部分是我尝试过的。

  • 我的gradle.properties文件包含org.gradle.deamon = true
  • 我使用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时很容易每天丢失一个多小时。我不确定灵活性对我来说是否值得这么多。

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

6 个答案:

答案 0 :(得分:31)

编辑:此时,我建议您在1.5安装时并排运行Android Studio 2.x.您可以访问即时运行,这实际上有助于所有更新的工具。如果你在1.5上阅读...

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

使用此配置,您的第一个IDE构建需要相同的时间,但增量构建更快,即使您修改了类。如果修改附加的库,则会失去一些好处。

步骤1.(如果您有幸瞄准> = 21的minSdkVersion,请跳过此处。)

@vanomart的回答是使用> = 21的minSdkVersion调试风格没有错,但唯一需要的部分是将以下内容添加到模块(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

答案 1 :(得分:12)

只有对我有用的解决方案才能禁用即时运行。

Android Studio - >偏好 - >构建,执行,部署 - >即时运行 - >取消选中“启用即时运行[...]”

构建从2分钟到40秒。

答案 2 :(得分:11)

升级到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

答案 3 :(得分:6)

我遇到了同样的问题,我花了大约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构建应用。点击查看 - >工具Windows - >构建工具并确保将构建变量设置为'devDebug'

对某些人来说,这可能已经足够了。我在SO中找到了很多线程,并且在reddit上发现了这个产品风味的东西,但这实际上并没有帮助我。帮助我的是手动升级gradle。既然你已经尝试过,我认为你走的是正确的轨道,但我建议使用更新的gradle版本2.9,其中“40% improved performance”超过2.8。

答案 4 :(得分:0)

这似乎是Android Studio 2.0预览中引入的新Instant Run机制的一部分,它负责检测应用中的每个方法,以便为将来的代码补丁创建执行分支。我担心这就是为什么它非常慢。

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

答案 5 :(得分:0)

您的应用程序是否有数据库?数据库的大小是否很大?

如果是:

  • 从资产文件夹中删除数据库(或保存它的任何位置)并执行构建
  • 衡量构建时间的差异
  • 在我的情况下:这是一个显着的差异,从45秒到15秒

如果否:

  • 在增量构建期间监视Gradle控制台并查看哪些操作占用的时间最多