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
除了其他答案中给出的所有 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);
命令,它应该退出此循环
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
除了其他答案中给出的所有 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);
命令,它应该退出此循环