Сборка Gradle слишком длинная

#android #android-studio #gradle #android-build

#Android #android-studio #gradle #android-сборка

Вопрос:

Сборка 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 — это та, в которой консоль gradle останавливается. Любая помощь будет оценена. Мне также нужно протестировать приложение на устройствах до lollipop.

Редактировать

Проблема возникает только тогда, когда я тестирую свое приложение на тестовом устройстве до lollipop. Сборка для основного тестового устройства, похоже, работает нормально. При сборке для Nexus 6P требуется 8,12 секунды. Но я тоже хочу протестировать устройства до lollipop.

Редактировать 2

Согласно совету @ Gillis я прикрепляю свой stacktrace

 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)
  

пожалуйста, обратитесь к этому pastebin для получения полного журнала.

Комментарии:

1. для такого вопроса, как компиляция, занимает слишком много времени, ответ прост… купить лучший ПК / Mac

2. iMac (27-дюймовый, конец 2012 года) 3,2 ГГц Intel Core i5, 8 ГБ 1600 МГц DDR3, NVIDIA GeForce GTX 675MX 1024 МБ

3. Как говорит @Selvin, если конфигурация вашего ПК низкая, то обычно требуется время, но я предполагаю, что это не так низко, что для завершения сборки потребуется час, даже в моем двухъядерном процессоре она завершается в течение 1 или 2 минут.

4. @androidXP Я четко заявил, что пытался использовать MultiDex, поскольку ранее у меня была ошибка переполнения dex с количеством методов, превышающих 65 тыс. Я использовал значительное количество библиотек.

5. хотите верьте, хотите нет, проблема в том, что из-за вашего интернет-соединения проверьте автономную работу в настройках-> Buildtools-> Gradle и повторите попытку.

Ответ №1:

Спасибо за вашу неоценимую помощь. Я решил эту проблему. По-видимому, проблема заключалась в том, что (я полагаю, что) JaCoCo работал вместе с моим классом dexing и выдавал блокировки. Я исправил это, удалив testCoverageEnabled=true строку в build.gradle моего приложения.

На случай, если кто-нибудь из вас, ребята, столкнется с подобной проблемой. Создайте два варианта сборки (prod и development) и добавьте строку testCoverageEnable=true только для варианта разработки и установите для нее значение false в другом месте. Также убедитесь, что в вашей разработке minSdkVersion установлено значение 21 (Lollipop), поскольку дексирование выполняется для ART, и, по сути, вы не столкнетесь с этой проблемой.

Комментарии:

1. Но если вы удалите «testCoverageEnable», вы не сможете получить отчет о тестовом покрытии, верно?

2. создайте несколько вариантов и включите testCoverage для версий post lollipop.

3. это решение спасло мой день

4. Thnaks много, я пару дней пытался решить эту проблему. Хотя иногда причина может быть другой, я бы посоветовал сначала проверить эту опцию, если эта строка есть в файле gradle.

5. Хотя проблема со сборкой исчезла, но не удалось получить отчет о покрытии. minSdkVersion 21 не работает. Также product flavors не распознает слово «testCoverageEnabled».

Ответ №2:

Помимо всех настроек gradle, приведенных в других ответах, вы также можете делать что-то вроде завершения процесса gradle время от времени. По моему опыту, выполнение этого и запуск новой сборки решают проблему.

Ответ №3:

перейдите в папку вашего приложения на консоли и запустите:

./gradlew build —debug

это дает вам много информации о том, что идет не так. обычно, когда gradle зависает, это вызвано внешней зависимостью, которую невозможно восстановить.

Вы можете попробовать включить автономный режим в Android Studio, чтобы узнать, действительно ли это проблема.

Комментарии:

1. Эй, чувак, спасибо за твой совет. Я также прикрепил свой журнал отладки и stacktrace. Кажется, есть цикл при получении блокировки пробуждения.

Ответ №4:

Попробуйте это

     android {
        compileSdkVersion 24
        buildToolsVersion "24.0.0"

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

Комментарии:

1. Попробовал и не повезло.

2. org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=2048m это мои свойства gradle

3. Если это не работает для вас, попробуйте чистую установку Android studio.

Ответ №5:

Сначала убедитесь, что ваш gradle обновлен, также android studio после обновления удаляет недопустимый кеш и перезапускается, затем, наконец, в глобальной настройке Gradle установите флажок «Автономная работа», чтобы я тоже попробовал. введите описание изображения здесь

Комментарии:

1. Я тоже пробовал это. Я использую gradle версии 3.1 и buildTools версии 2.2, которые я пробовал и с включенной автономной работой

2. У меня средний, если не быстрый интернет. Так что регулярно моя сборка не займет более 12 секунд. (под сборкой я подразумевал синхронизацию). Моя скорость интернета составляет 200 Мбит / с, чего, я думаю, достаточно для быстрой загрузки всех зависимостей. Но на всякий случай я также попробовал включить автономный режим.

Ответ №6:

Несколько советов по повышению производительности выполнения задач Gradle:

Демон Gradle Вы можете уменьшить время запуска Gradle (на моем компьютере до двух секунд), если вы укажете Gradle использовать демон для сборки:

 org.gradle.daemon=true
  

Параллельное выполнение проекта
Это действительно может иметь существенное значение, если вы создаете очень сложный проект со многими зависимостями от подмодулей:

 org.gradle.parallel=true
  

Глобальный gradle.properties

Свойства, определенные в файле свойств в нашем домашнем каталоге, имеют приоритет над свойствами, определенными в файле в каталоге нашего проекта. Причиной этого является то, что вы хотите избежать использования демона Gradle на своих серверах сборки, где время запуска менее важно, чем потребление памяти:

 /Users/~/.gradle/gradle.properties
  

вот так

Ответ №7:

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