Gradle Build слишком долго
Сборка Gradle теперь занимает слишком много времени (буквально она не завершает сборку после запуска в течение примерно 1 часа) после включения MultiDex. Я следовал инструкциям на сайте 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
это тот, где консоль останавливается. Любая помощь будет оценена. Мне также нужно протестировать приложение на устройствах перед леденцом на палочке.
редактировать
Проблема возникает только тогда, когда я тестирую свое приложение в тестовом устройстве перед леденцом на палочке. Сборка для основного тестового устройства, кажется, работает нормально. На сборку 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)
пожалуйста, обратитесь к этому каталогу для полного журнала.
6 ответов
Спасибо за вашу благодарную помощь. Я решил эту проблему. Очевидно, проблема заключалась в том, что (я предполагаю, что) JaCoCo дексировал вместе с моим дексингом класса и выдавал блокировки. Я исправил это, удалив testCoverageEnabled=true
строка в build.gradle моего приложения.
На случай, если кто-нибудь из вас столкнется с подобной проблемой. Создайте два варианта сборки (prod и development) и добавьте строку testCoverageEnable=true
только для развития вкуса и установите его в ложь еще где. Также убедитесь, что ваша разработка имеет minSdkVersion
установите значение 21 (Lollipop), так как декстинг для ART сделан, и в принципе вы не столкнетесь с этой проблемой.
Перейдите в папку вашего приложения в консоли и запустите:
./gradlew build --debug
это дает вам много информации о том, что идет не так. обычно, когда gradle зависает, это вызвано внешней зависимостью, которую невозможно получить.
Вы можете попробовать включить автономный режим в Android Studio, чтобы увидеть, действительно ли это проблема.
Помимо всех настроек, описанных в других ответах, вы также можете время от времени делать что-то вроде завершения процесса оценки. По моему опыту, решение этой проблемы и начало новой сборки решают проблему.
Несколько советов по повышению производительности выполнения задач Gradle:
Gradle Daemon Вы можете уменьшить время запуска Gradle (на моем компьютере до двух секунд), если вы скажете Gradle использовать демон для сборки:
org.gradle.daemon=true
Параллельное выполнение проекта Это действительно может иметь существенное значение, если вы строите очень сложный проект с множеством зависимостей подмодулей:
org.gradle.parallel=true
Глобальный gradle.properties
Свойства, определенные в файле свойств в нашем домашнем каталоге, имеют приоритет над свойствами, определенными в файле в нашем каталоге проектов. Причина этого заключается в том, что вы хотите избежать использования демона Gradle на серверах сборки, где время запуска менее важно, чем потребление памяти:
/Users/~/.gradle/gradle.properties
Вы можете использовать exit(0);
команда в конце вашей программы, и она должна выйти из этого цикла
Попробуй это
android {
compileSdkVersion 24
buildToolsVersion "24.0.0"
dexOptions {
javaMaxHeapSize "4g"
}
....
}