Gradle Build太长

时间:2016-10-04 10:28:51

标签: android android-studio gradle android-build

在启用MultiDex后,Gradle构建现在需要太长时间(字面意思是它在运行1小时后无法完成构建)。我按照https://developer.android.com/studio/build/multidex.html站点上给出的步骤在app中配置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控制台停止的任务。任何帮助,将不胜感激。我还需要在棒棒糖前设备中测试应用程序。

修改

问题只发生在我在棒棒糖前测试设备中测试我的应用程序时。主要测试设备的建设似乎工作正常。为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$1.doRun(DefaultFileLockContentionHandler.java:67)
        at org.gradle.cache.internal.locklistener.DefaultFileLockContentionHandler$1.run(DefaultFileLockContentionHandler.java:54)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.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以获取完整的日志。

7 个答案:

答案 0 :(得分:4)

感谢您的帮助。我解决了这个问题。显然这个问题是因为(我认为)JaCoCo和我的班级德兴一起去了,并发出了锁。我通过移除应用程序build.gradle中的testCoverageEnabled=true行来解决此问题。

如果你们中的任何人遇到类似的问题。创建两个构建风格(prod和开发)并仅为开发风格添加行testCoverageEnable=true并将其设置为false,否则在哪里。同时确保您的开发将minSdkVersion设置为21(Lollipop),因为dexing已完成ART,基本上您不会遇到此问题。

答案 1 :(得分:1)

除了在其他答案中给出的所有gradle调整之外,您还可以执行诸如不时地结束gradle过程之类的操作。根据我的经验,这样做并开始新的构建解决了这个问题。

答案 2 :(得分:1)

转到控制台中的app文件夹并运行:

./ gradlew build --debug

这可以为您提供大量信息。 通常当gradle挂起时,它是由外部依赖引起的,不能被追溯。

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

答案 3 :(得分:0)

试试这个

    android {
        compileSdkVersion 24
        buildToolsVersion "24.0.0"

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

答案 4 :(得分:0)

首先确保您的gradle是最新的android studio更新后删除无效缓存并重新启动然后最后在全局Gradle设置检查“离线工作”它的工作对我来说也给它一试。 enter image description here

答案 5 :(得分:0)

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

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

org.gradle.daemon=true

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

org.gradle.parallel=true

Global gradle.properties

我们主目录中属性文件中定义的属性优先于项目目录中文件中定义的属性。这背后的原因是您希望避免在构建服务器上使用Gradle守护程序,其中启动时间不如内存消耗重要:

/Users/~/.gradle/gradle.properties

like this

答案 6 :(得分:0)

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