我的应用程序使用旧的架构组件。我想转移到新的android architecture components。
为此,在构建正常后,我在开头添加了与房间相关的依赖项。
但是当我尝试为Lyfecycles,LiveData和ViewModel添加依赖项时,正如here所述。
应用程序构建过程大大减慢,构建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"
此外,我必须启用jack for Java 8兼容性,如下所示:
defaultConfig {
........
jackOptions {
enabled true
}
}
添加所有这些组件后,构建过程已大大减慢。我尝试通过转到Help -> Edit custom VM options
-Xmx5120m
我将其设置为近5 GB,但对我来说没有任何效果。我相信我的机器有足够的硬件。 (8 GB RAM,Windows 10,1TB HDD,AMD A8)
我的应用程序使用了许多谷歌服务,如Gmail API,Firebase API,其他一些库我用尽了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
大多数时间都是杰克。
我尝试了以下canary version中建议的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&切换到这个金丝雀版本,构建比以前更快,但仍然使用缓慢。
答案 0 :(得分:7)
你的问题很多是基于这样或那样的假设,即有很多"。但是时间很容易衡量,并且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()
答案 1 :(得分:6)
杰克工具链是deprecated,在弃用之前仍处于试验阶段。尽管生成代码的过程可能很慢(如@FlorescuGeorgeCătălin所提到的),但通常不会导致构建时间过长。我怀疑你的构建时间慢的原因是Jack Toolchain;作为it is notoriously slow。
如果您需要Java 8语言功能,我建议您转到Android Studio 3.0的canary version,其中包含built-in。
如果这不是一个选项,您可以使用Retrolambda代替,其中包括大多数相同的Java 8语言功能。
答案 2 :(得分:2)
由于库有一个注释处理器,他必须在生成的类中生成新代码。 Dagger也是一个生成代码的库。 Butterknife一样。
您可以在app/build/generated
项目文件夹中找到它们。
您可以查看有关注释处理器here的更多信息。
也可以从您的硬盘驱动器。 SSD可以为您提供更强大的处理能力。
答案 3 :(得分:1)
您是否将Gradle设置为Offline Work
并尝试Edit custom VM options
更大的堆大小?
另一个解决方案是将Android Studio升级到Android Studio 3.0,这也会提高构建速度
答案 4 :(得分:1)
档案 - >设置 - > (左侧)构建,执行,开发 - >构建工具 - > Gradle
在“Global Gradle Settings”下,将出现一个名为“Offline Work”的复选框。检查一下。
你做过吗?
答案 5 :(得分:1)
在android {}
中的 build.gradle 中添加以下内容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
答案 6 :(得分:0)
这是一个很长的镜头,但有没有一个真正的Android设备连接到您的测试机器?我实际上注意到,如果连接了我的测试设备,我的AS运行得非常慢,可能adb出现问题并且会降低系统速度。
或者,我从旧机器升级到16gb ram i7处理器,事情开始运行得更快。