Android 添加新库后工作室构建变慢了?
Android studio build slowed down after adding new libraries?
我的应用程序使用旧架构组件。我想搬到新 android architecture components.
为此我在一开始添加了房间相关的依赖,之后构建正常。
但是当我尝试为 Lyfecycles、LiveData 和 ViewModel 添加依赖项时,如前所述 here。
应用程序构建过程明显变慢,构建 apk 需要 5 分钟和更多时间。
在应用的 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
}
}
添加所有这些组件后,构建过程已大大减慢。我尝试通过转到 Help -> Edit custom VM options
对某些参数进行一些自定义 VM 选项更改
-Xmx5120m
我将其设置为将近 5 GB,但对我没有任何作用。我相信我的机器有足够的硬件。 (8 GB 内存,Windows 10、1TB 硬盘,AMD A8)
我的应用程序使用了许多 google 服务,例如 Gmail API、Firebase APIs,我是否用尽了 64K 的引用限制?但是我已经启用了提到的多索引 here。
发生这种情况是因为新的架构组件还是其他原因?如何加快构建过程?
更新:
下面 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
大部分时间都是Jack占的。
我尝试了 canary version suggested in below answer by 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
所以我删除了 jack 并切换到这个金丝雀版本,构建速度肯定比以前快,但使用起来仍然很慢。
由于库有注解处理器,他必须在生成的类中生成新代码。 Dagger 也是一个生成代码的库。黄油刀一样。
您可以在 app/build/generated
项目文件夹中找到它们。
您可以查看有关注释处理器的更多信息here。
也可以来自您的硬盘。 SSD 可以为您提供更多的处理能力。
Jack 工具链是 deprecated, and was still in an experimental phase before its deprecation. Although the process of generating code can be slow (as @FlorescuGeorgeCătălin mentioned) it doesn't usually cause such excessively slow build times. I suspect the cause of your slow build times is the Jack Toolchain; as it is notoriously 。
如果你想要Java8种语言功能我建议你移到canary version of Android Studio 3.0 which has them built-in.
如果这不是一个选项,您可以改用 Retrolambda,它包括大部分相同的 Java 8 种语言功能。
关于你的问题的很多内容都是基于这样或那样的假设,即有 "lots"。但是时间是很容易衡量的东西,gradle 将构建过程分成几个较小的任务。所以我猜你最好的行动是衡量每项任务,然后你就可以比较花费这么长时间的任务。
Here is a script I made to measure build times,只需将其添加到项目的根文件夹中,然后在顶层 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()
您是否将 Gradle 设置为 Offline Work
并尝试将 Edit custom VM options
设置为更大的堆大小?
另一个解决方案是将 Android Studio 升级到 Android Studio 3.0,这也会提高构建速度
文件 -> 设置 ->(左侧)构建、执行、开发 -> 构建工具 -> Gradle
在 "Global Gradle Settings" 下会有一个名为 "Offline Work" 的复选框。检查一下。
你做到了吗?
在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
希望不大,但是您的测试机是否连接了真实的 android 设备?我实际上注意到,如果我连接了测试设备,我的 AS 运行得非常慢,可能是 adb 有问题,这会减慢系统速度。
或者,我确实从我的旧机器升级到 16gb ram i7 处理器,然后事情开始 运行 快得多。
我的应用程序使用旧架构组件。我想搬到新 android architecture components.
为此我在一开始添加了房间相关的依赖,之后构建正常。
但是当我尝试为 Lyfecycles、LiveData 和 ViewModel 添加依赖项时,如前所述 here。
应用程序构建过程明显变慢,构建 apk 需要 5 分钟和更多时间。
在应用的 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
}
}
添加所有这些组件后,构建过程已大大减慢。我尝试通过转到 Help -> Edit custom VM options
-Xmx5120m
我将其设置为将近 5 GB,但对我没有任何作用。我相信我的机器有足够的硬件。 (8 GB 内存,Windows 10、1TB 硬盘,AMD A8)
我的应用程序使用了许多 google 服务,例如 Gmail API、Firebase APIs,我是否用尽了 64K 的引用限制?但是我已经启用了提到的多索引 here。
发生这种情况是因为新的架构组件还是其他原因?如何加快构建过程?
更新:
下面 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
大部分时间都是Jack占的。
我尝试了 canary version suggested in below answer by 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
所以我删除了 jack 并切换到这个金丝雀版本,构建速度肯定比以前快,但使用起来仍然很慢。
由于库有注解处理器,他必须在生成的类中生成新代码。 Dagger 也是一个生成代码的库。黄油刀一样。
您可以在 app/build/generated
项目文件夹中找到它们。
您可以查看有关注释处理器的更多信息here。
也可以来自您的硬盘。 SSD 可以为您提供更多的处理能力。
Jack 工具链是 deprecated, and was still in an experimental phase before its deprecation. Although the process of generating code can be slow (as @FlorescuGeorgeCătălin mentioned) it doesn't usually cause such excessively slow build times. I suspect the cause of your slow build times is the Jack Toolchain; as it is notoriously
如果你想要Java8种语言功能我建议你移到canary version of Android Studio 3.0 which has them built-in.
如果这不是一个选项,您可以改用 Retrolambda,它包括大部分相同的 Java 8 种语言功能。
关于你的问题的很多内容都是基于这样或那样的假设,即有 "lots"。但是时间是很容易衡量的东西,gradle 将构建过程分成几个较小的任务。所以我猜你最好的行动是衡量每项任务,然后你就可以比较花费这么长时间的任务。
Here is a script I made to measure build times,只需将其添加到项目的根文件夹中,然后在顶层 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()
您是否将 Gradle 设置为 Offline Work
并尝试将 Edit custom VM options
设置为更大的堆大小?
另一个解决方案是将 Android Studio 升级到 Android Studio 3.0,这也会提高构建速度
文件 -> 设置 ->(左侧)构建、执行、开发 -> 构建工具 -> Gradle
在 "Global Gradle Settings" 下会有一个名为 "Offline Work" 的复选框。检查一下。
你做到了吗?
在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
希望不大,但是您的测试机是否连接了真实的 android 设备?我实际上注意到,如果我连接了测试设备,我的 AS 运行得非常慢,可能是 adb 有问题,这会减慢系统速度。
或者,我确实从我的旧机器升级到 16gb ram i7 处理器,然后事情开始 运行 快得多。