【问题标题】:Gradle build slow on transformClassesWithDexForDebugGradle 在 transformClassesWithDexForDebug 上构建缓慢
【发布时间】:2015-12-08 14:56:04
【问题描述】:

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

  • 我有带有 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% 是 :app:transformClassesWithDexForDebug

这个过程实际上在做什么?我可以找到遇到崩溃的人,但它对我来说很好,除了它需要很多时间。我是否需要它,因为此时我真的不需要 Dex?

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

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

【问题讨论】:

  • 知道有人和我现在的情况完全一样,真是一种解脱!在此期间你有任何进展吗?谢谢!
  • 自从我发布此内容并尝试了我遇到的每一个建议以来已经有一段时间了,并取得了不同程度的成功。在@markdb314 提到的Android Studio 2.1 发布之前,没有人真正将构建速度提高到可以接受的程度。尽管之前可能可用,但只有在此版本之后,才可以清楚地执行 dex-step in process。这将我的构建时间显着缩短到平均 20-30 秒。
  • 只是好奇,你用的是新的数据绑定框架吗?
  • 不,我没有在有这些问题的项目中使用数据绑定框架。

标签: gradle android-build


【解决方案1】:

编辑:此时,我建议同时运行 Android Studio 2.x 和 1.5 安装。您可以访问即时运行,这对所有更新的工具都有帮助。如果您停留在 1.5,请继续阅读...

我已设法将 Android Studio 1.5 的调试构建时间从 2 分钟缩短到 30 秒。这可能不适用于您的命令行执行,但可能会更快。

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

第 1 步。(如果您有幸已将 minSdkVersion 设为 >= 21,请跳过此步骤。)

@vanomart 的 minSdkVersion 调试风格 >= 21 的答案没有错,但唯一需要的部分是将以下内容添加到 module (app) build.gradle 并确保您的目标在 Build Variants 选项卡中调试时开发:

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

第 2 步。 预索引库。

在您的 module (app) build.gradle 中设置以下配置。这对于 IDE 构建来说更快,而不是对于每次构建都从头开始的构建器服务器而言。

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

来源,(部分)与“提高构建服务器性能”相反: http://tools.android.com/tech-docs/new-build-system/tips#TOC-Improving-Build-Server-performance

第 3 步。确保您在 module (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

【讨论】:

  • 非常感谢!我的 gradle 构建现在快了 50%(从 2 分钟到 1 分钟)!
  • 我已经按照每个步骤正确设置了所有内容。它仍然很慢......多么垃圾的软件。谷歌让我非常失望。期间有什么进展吗?但是,构建时间从 6 分钟减少到 56 秒!非常感谢您的大力帮助!
  • 感谢戴森的回归。我的 gradle 速度明显加快,在某些情况下从 2.5 分钟缩短到几秒钟。
  • 在我的设置中,我打开了“Legacy Multidex”,打开了 shrinkResources,打开了 minifyEnabled,并且 proguard 正在运行。我已经尝试了与该主题相关的所有建议的许多不同组合。最后,唯一对我有用的是在 Android Studio 2.0 中关闭“即时运行”。我的构建时间从 6 分 30 秒缩短到 1 分 41 秒。
  • 哇...只是关于 dexOptions 的提示将我的构建时间从 4 分钟缩短到了 40 秒。对于这个小型应用程序来说仍然很糟糕,但相比之下惊人
【解决方案2】:

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

与上述问题一样,我的构建时间也很慢,但升级后我的构建速度显着提高。请在此处查看 Android Gradle 插件 v2.1.0 的发行说明以获取更多信息:

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

【讨论】:

  • 在我的例子中,org.gradle.jvmargs = -Xmx2048m 将速度提高了一个数量级。
  • 神圣的饼干!!从15分钟到1分钟!谢谢!
【解决方案3】:

唯一对我有用的解决方案是禁用即时运行。

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

构建时间从 2 多分钟缩短到 40 秒。

【讨论】:

  • 非常感谢>>即时运行也会删除文件夹中内置的任何输出 apk。我想知道为什么会这样
  • 这也对我有用。构建时间从约 80 秒变为约 12 秒。我猜他们还有一些问题需要解决。
  • 45s 到 15s - 迄今为止我在 stackoverflow 上看到的最有效的优化
【解决方案4】:

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

我用谷歌搜索了很多,我做了和你一样的配置,即使它有一点帮助,编译和运行实际的应用程序仍然很痛苦(有时我改变一个需要 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”

对于某些人来说,这可能就足够了。我在 SO 和 reddit 上发现了很多以这种产品风味结束的线程,但这实际上对我没有帮助。帮助我的是手动升级 gradle。既然你已经尝试过这样做,我认为你走在正确的轨道上,但我建议使用更新的 gradle 版本 2.9,它的 '40% improved performance' 超过 2.8。

【讨论】:

  • 感谢您回复 vanomat。这似乎真的很有希望,但是我还没有让它工作。它构建了新的 devDebug 风格,但它仍在运行相同的任务。我需要在您的构建设置中看到的 afterEvaluate 或 compileOptions 部分吗?
  • 你不应该需要编译选项和 afterEvaluate。我发现当您简单地下载新的 gradle 时它不起作用,您必须在系统上正确安装它,以便正确初始化所有 gradle 变量。此外,如果您查看项目中的 .gradle 目录,您将在那里看到一些缓存的内容。删除所有不是 2.9 的内容。 TBH,我的构建运行得更快,有时只需要几秒钟,但有时又需要 1-2 分钟。
【解决方案5】:

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

奇怪的是,即使 Instant Run 被禁用,这项任务仍在进行。我必须将“com.android.tools.build:gradle”降级到 1.3.0 以避免该任务。

【讨论】:

  • 即使我降级,我仍然看到该任务正在执行。这不是我正在寻找的解决方案。不过感谢您的建议。
  • @JustinHammenga 你降级到 1.3.0 了吗?它在 1.5.0 中也有,但在 1.3.0 中没有。
【解决方案6】:

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

如果是:

  • 从资产文件夹(或您保存它的任何位置)中删除数据库并进行构建
  • 衡量构建时间的差异
  • 在我的情况下:从 45 秒到 15 秒的差异很大

如果没有:

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

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 2017-07-25
    • 2020-11-12
    • 2014-03-31
    • 1970-01-01
    • 2015-01-22
    • 2015-08-21
    • 2023-03-05
    相关资源
    最近更新 更多