Сборка Android-студии замедлилась после добавления новых библиотек?
В моем приложении используются компоненты старой архитектуры. Я хочу перейти к новым компонентам архитектуры Android.
С этой целью я добавил связанные зависимости в зависимости от комнаты в начале, после чего сборка была нормальной.
Но когда я попытался добавить зависимости для Lyfecycles, LiveData и ViewModel, как упоминалось здесь.
Процесс сборки приложения значительно замедлился, для сборки apk требуется 5 минут и более.
Следующие зависимости добавлены в app build.gradle:
compile "android.arch.lifecycle:runtime:1.0.0-alpha5"
compile "android.arch.lifecycle:extensions:1.0.0-alpha5"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha5"
Также мне нужно включить разъем для совместимости с Java 8 следующим образом:
defaultConfig {
........
jackOptions {
enabled true
}
}
После добавления всех этих компонентов процесс сборки значительно замедлился. Я попытался сделать некоторые пользовательские изменения параметров VM для некоторых параметров, перейдя в Help -> Edit custom VM options
-Xmx5120m
Я установил его почти на 5 ГБ, но ничего не сработало для меня. Я считаю, что у моей машины достаточно аппаратных средств. (8 ГБ оперативной памяти, Windows 10, 1 ТБ HDD, AMD A8)
В моем приложении используются многие сервисы google, такие как API Gmail, API Firebase, некоторые другие библиотеки, которые я исчерпал лимит ссылок на 64 КБ? Но я уже включил multidexing, как упомянуто здесь.
Это произошло из-за новых компонентов архитектуры или чего-то еще? Как ускорить процесс сборки?
Обновление:
В одном из ответов ниже Budius был предложен script, который будет отображать тайминги, полученные каждым процессом сборки, я выполнил его в своем приложении, вот результаты:
BUILD SUCCESSFUL
Total time: 18 mins 28.44 secs
Task timings:
480ms :app:mergeDebugResources
2516ms :app:processDebugResources
487725ms :app:transformClassesWithPreJackPackagedLibrariesForDebug
29213ms :app:transformClassesWithPreJackRuntimeLibrariesForDebug
752ms :app:transformResourcesWithMergeJavaResForDebug
556894ms :app:transformJackWithJackForDebug
5184ms :app:transformNativeLibsWithMergeJniLibsForDebug
17524ms :app:packageDebug
Большая часть таймингов берется Джеком.
Я попробовал канарейку версии, предложенную ниже в ответе Bryan. следующая - вывод времени, затраченного на процесс сборки:
BUILD SUCCESSFUL in 6m 11s
42 actionable tasks: 33 executed, 9 up-to-date
Task timings:
608ms :app:preDebugBuild
350ms :app:mergeDebugResources
394ms :app:processDebugManifest
2543ms :app:processDebugResources
9410ms :app:javaPreCompileDebug
46585ms :app:compileDebugJavaWithJavac
262ms :app:compileDebugShaders
395ms :app:mergeDebugAssets
5835ms :app:packageInstantRunResourcesDebug
98922ms :app:transformClassesWithDesugarForDebug
334ms :app:transformClassesWithExtractJarsForDebug
7765ms :app:transformClassesWithInstantRunVerifierForDebug
23117ms :app:transformNativeLibsWithMergeJniLibsForDebug
10128ms :app:transformResourcesWithMergeJavaResForDebug
16565ms :app:transformClassesWithInstantRunForDebug
11825ms :app:transformClassesWithInstantRunSlicerForDebug
84703ms :app:transformClassesWithDexBuilderForDebug
17061ms :app:transformDexArchiveWithDexMergerForDebug
1706ms :app:transformDexWithInstantRunDependenciesApkForDebug
9770ms :app:transformDexWithInstantRunSlicesApkForDebug
10571ms :app:packageDebug
1387ms :app:buildInfoGeneratorDebug
Итак, я удалил гнездо и переключился на эту версию canary, сборка быстрее, чем предыдущая, но все же медленная для использования.
Ответы
Ответ 1
Jack Toolchain устарел и все еще находился в экспериментальной фазе до его устаревания. Хотя процесс генерации кода может быть медленным (как упоминал @FlorescuGeorgeCătălin), он обычно не вызывает таких чрезмерно медленных сроков сборки. Я подозреваю, что причиной медленного времени сборки является Jack Toolchain; как он известен медленно.
Если вам нужны функции языка Java 8, я предлагаю вам перейти на канаринную версию Android Studio 3.0, которая имеет их встроенный.
Если это не вариант, вы можете вместо этого использовать Retrolambda, который включает в себя большинство тех же функций языка Java 8.
Ответ 2
В вашем вопросе много оснований полагать, что это или это может быть, что есть "лоты". Но время очень легко измерить, а gradle делит процесс сборки на несколько меньших задач. Поэтому я думаю, что ваше лучшее действие - измерить каждую задачу, и вы можете сравнить то, что занимает так много времени.
Вот script, который я сделал для измерения времени сборки, просто добавьте его в корневую папку вашего проекта и сверху -level gradle файл добавить apply from: 'time.gradle'
timer.gradle
import java.util.concurrent.TimeUnit
class TimingsListener implements TaskExecutionListener, BuildListener {
private long startTime
private timings = []
@Override
void beforeExecute(Task task) {
startTime = System.nanoTime()
}
@Override
void afterExecute(Task task, TaskState taskState) {
def ms = TimeUnit.MILLISECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS);
timings.add([ms, task.path])
}
@Override
void buildFinished(BuildResult result) {
println "Task timings:"
for (timing in timings) {
if (timing[0] >= 250) {
printf "%7sms %s\n", timing
}
}
}
@Override
void buildStarted(Gradle gradle) {}
@Override
void projectsEvaluated(Gradle gradle) {}
@Override
void projectsLoaded(Gradle gradle) {}
@Override
void settingsEvaluated(Settings settings) {}
}
gradle.addListener new TimingsListener()
Ответ 3
Поскольку библиотека имеет обработчик аннотации, он должен генерировать новый код в сгенерированные классы. Кинжал также является библиотекой, которая генерирует код. Butterknife то же самое.
Вы можете найти их в папке проекта app/build/generated
.
Подробнее о процессоре аннотации здесь.
Также может быть с вашего жесткого диска. SSD может дать вам гораздо большую вычислительную мощность.
Ответ 4
Вы установили Gradle в Offline Work
и попытались Edit custom VM options
увеличить размер кучи?
Другим решением является обновление Android Studio до Android Studio 3.0, которые также увеличивают скорость сборки
Ответ 5
Файл → Настройки → (Левая сторона) Сборка, выполнение, разработка → Инструменты сборки → Gradle
В разделе "Глобальные настройки Gradle" появится флажок "Автономная работа". Проверьте его.
Вы сделали это?
Ответ 6
Добавьте в build.gradle следующее внутри android {}
dexOptions {
incremental true
javaMaxHeapSize "4g"
}
Задайте в файле gradle.properties следующее:
org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
android.enableBuildCache=true
org.gradle.caching=true
Ответ 7
Это длинный снимок, но есть ли на вашем тестовом компьютере настоящее устройство для Android? Я действительно замечаю, что моя AS работает очень медленно, если у меня подключены мои тестовые устройства, возможно, у adb возникают проблемы и это замедляет работу системы.
В качестве альтернативы я обновил до 16 гб процессора i7 с моей старой машины, и все началось гораздо быстрее.