#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
это мои свойства gradle3. Если это не работает для вас, попробуйте чистую установку 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);
команду в конце вашей программы, и она должна выйти из этого цикла