添加新库后,Android studio构建速度变慢了吗?

pcj*_*pcj 16 android gradle android-build android-gradle-plugin

我的应用程序使用旧架构组件.我想转向新的Android架构组件.

为此,我在开始时添加了与房间相关的依赖项,之后构建正常.

但是,当我尝试添加了Lyfecycles,LiveData和视图模型的依赖,提到这里.

应用程序构建过程大大减慢,构建apk需要5分钟和更长的时间.

在app的build.gradle中添加了以下dependecies:

    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"
Run Code Online (Sandbox Code Playgroud)

此外,我必须启用插孔以实现Java 8兼容性,如下所示:

defaultConfig {
........
        jackOptions {
            enabled true
        }
    }
Run Code Online (Sandbox Code Playgroud)

添加所有这些组件后,构建过程已大大减慢.我尝试通过转到某些参数来进行一些自定义VM选项更改Help -> Edit custom VM options

-Xmx5120m
Run Code Online (Sandbox Code Playgroud)

我把它设置为几乎5 GB,但对我来说没有任何作用.我相信我的机器有足够的硬件.(8 GB RAM,Windows 10,1TB HDD,AMD A8)

我的应用程序使用了许多谷歌服务,如Gmail API,Firebase API,其他一些库我用尽了64K参考限制?但是我已经启用了这里提到的多索引.

这是因为新的架构组件还是其他原因而发生的?如何使构建过程更快?

更新:

下面的答案之一Budius提出了一个脚本,它将显示每个构建过程所采用的时间,我在我的应用程序中执行它的结果是:

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
Run Code Online (Sandbox Code Playgroud)

大多数时间都是杰克.

我尝试了下面的答案由Bryan建议的canary版本以下是构建过程所需的时间输出:

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
Run Code Online (Sandbox Code Playgroud)

所以我删除了插孔并切换到这个金丝雀版本,构建比以前更快,但仍然使用缓慢.

Bud*_*ius 7

您的问题很多都基于这样或那样的假设,即存在"批次".但是时间很容易衡量,并且gradle将构建过程分成几个较小的任务.所以我想你最好的行动就是衡量每项任务,而不是比较你所花费的时间.

这是我用来衡量构建时间的脚本,只需添加它来执行项目的根文件夹并在顶级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()
Run Code Online (Sandbox Code Playgroud)


Bry*_*yan 6

Jack Toolchain已弃用,在弃用之前仍处于试验阶段.虽然生成代码的过程可能很慢(如@FlorescuGeorgeCătălin所提到的),但它通常不会导致如此过慢的构建时间.我怀疑你的构建时间慢的原因是Jack Toolchain; 因为 出了名的 .

如果你想要Java 8语言功能,我建议你转移到内置的Android Studio 3.0 的canary版本.

如果这不是一个选项,您可以使用Retrolambda,其中包括大多数相同的Java 8语言功能.