Сборка 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 с моей старой машины, и все началось гораздо быстрее.