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

как это

Сначала убедитесь, что ваш Gradle обновлен и Android Studio. После обновления удалите недействительный кеш и перезапустите, затем, наконец, в Global Gradle Setting, отметьте "Offline Work", его работа для меня тоже, попробуйте. введите описание изображения здесь

Вы можете использовать exit(0); команда в конце вашей программы, и она должна выйти из этого цикла

Попробуй это

    android {
        compileSdkVersion 24
        buildToolsVersion "24.0.0"

        dexOptions {
            javaMaxHeapSize "4g"
        }
        ....
    }
Другие вопросы по тегам