Gradle 构建时间过长

Gradle Build too long

启用 MultiDex 后

Gradle 构建现在花费的时间太长(从字面上看,它在 运行 后 1 小时内无法完成构建)。我按照 https://developer.android.com/studio/build/multidex.html 网站上给出的步骤在应用程序中配置 MultiDex。

以下是我的 gradle 控制台的摘录。

:app:compileDevelopmentDebugNdk UP-TO-DATE
:app:compileDevelopmentDebugSources
:app:mergeDevelopmentDebugShaders UP-TO-DATE
:app:compileDevelopmentDebugShaders UP-TO-DATE
:app:generateDevelopmentDebugAssets UP-TO-DATE
:app:mergeDevelopmentDebugAssets UP-TO-DATE
:app:unzipJacocoAgent UP-TO-DATE
:app:transformClassesWithJacocoForDevelopmentDebug UP-TO-DATE
:app:transformClassesWithDexForDevelopmentDebug

最后一个任务 :app:transformClassesWithDexForDevelopmentDebug 是 gradle 控制台停止的任务。任何帮助,将不胜感激。我还需要在棒棒糖之前的设备上测试该应用程序。

编辑

仅当我在 pre-lollipop 测试设备中测试我的应用程序时才会出现此问题。构建主要测试设备似乎工作正常。为 Nexus 6P 构建时需要 8.12 秒。但我也想测试棒棒糖之前的设备。

编辑 2

根据@Gillis 的建议,我附上了我的堆栈跟踪

10:19:10.558 [DEBUG] [org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
10:19:10.558 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
10:19:10.559 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
10:19:10.559 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
10:19:10.559 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
10:19:10.559 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
10:19:10.559 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
10:19:20.555 [DEBUG] [org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
10:19:20.560 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
10:19:20.560 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
10:19:20.561 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
10:19:20.561 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
10:19:20.561 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired.
10:19:20.561 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.

我也尝试删除我的 /home/.gradle 文件夹,但仍然没有成功。显然在获取锁的过程中存在循环。

我也附上了我的 jstacktrace

"File lock request listener" #27 prio=5 os_prio=31 tid=0x00007fb9b2c20800 nid=0x5d07 runnable [0x0000700001961000]
   java.lang.Thread.State: RUNNABLE
        at java.net.PlainDatagramSocketImpl.receive0(Native Method)
        - locked <0x00000006c026d670> (a java.net.PlainDatagramSocketImpl)
        at java.net.AbstractPlainDatagramSocketImpl.receive(AbstractPlainDatagramSocketImpl.java:143)
        - locked <0x00000006c026d670> (a java.net.PlainDatagramSocketImpl)
        at java.net.DatagramSocket.receive(DatagramSocket.java:812)
        - locked <0x00000006c0bc5df0> (a java.net.DatagramPacket)
        - locked <0x00000006c026d630> (a java.net.DatagramSocket)
        at org.gradle.cache.internal.FileLockCommunicator.receive(FileLockCommunicator.java:60)
        at org.gradle.cache.internal.locklistener.DefaultFileLockContentionHandler.doRun(DefaultFileLockContentionHandler.java:67)
        at org.gradle.cache.internal.locklistener.DefaultFileLockContentionHandler.run(DefaultFileLockContentionHandler.java:54)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl.run(StoppableExecutorImpl.java:40)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

完整日志请参考this pastebin

试试这个

    android {
        compileSdkVersion 24
        buildToolsVersion "24.0.0"

        dexOptions {
            javaMaxHeapSize "4g"
        }
        ....
    }

首先确保你的 gradle 也是最新的 android studio 更新后删除无效缓存并重新启动,然后最后在 全局 Gradle 设置 检查 "Offline Work" 它对我的工作也试一试。

提高 Gradle 任务执行性能的一些技巧:

Gradle 守护进程 如果你告诉 Gradle 使用守护进程来构建,你可以减少 Gradle 的启动时间(在我的电脑上减少到两秒):

org.gradle.daemon=true

并行项目执行 如果您正在构建一个具有许多子模块依赖项的非常复杂的项目,这确实会产生重大影响:

org.gradle.parallel=true

全球gradle.properties

我们主目录中 属性 文件中定义的属性优先于我们项目目录中文件中定义的属性。这背后的原因是你想避免在你的构建服务器上使用 Gradle 守护进程,因为启动时间比内存消耗更重要:

/Users/~/.gradle/gradle.properties

like this

除了其他答案中给出的所有 gradle 调整之外,您还可以不时地结束 gradle 进程。根据我的经验,这样做并开始全新构建可以解决问题。

转到控制台中的应用程序文件夹,然后运行:

./gradlew build --debug

这为您提供了很多信息,了解出了什么问题。 通常 gradle 挂起是由无法恢复的外部依赖引起的。

您可以尝试在 android studio 中启用离线模式,看看这是否真的是问题所在。

感谢您的大力帮助。我解决了这个问题。显然这个问题是因为(我想)JaCoCo 和我的 class dexing 一起进行了 dexing 并发出了锁。我通过删除应用 build.gradle 中的 testCoverageEnabled=true 行来修复此问题。

万一你们运行遇到类似的问题。创建两个构建风格(生产和开发)并添加行 testCoverageEnable=true 仅用于开发风格并将其设置为 false 其他地方。还要确保您的开发已将 minSdkVersion 设置为 21 (Lollipop),因为已为 ART 完成 dexing,基本上您不会 运行 陷入此问题。

您可以在程序末尾使用 exit(0); 命令,它应该退出此循环