Android 即时 运行 缓慢构建
Android Instant Run Slow Builds
我一直听到即时的 运行 讨论,好像它的状态很好,但是我和我的团队经常遇到该功能的重大问题,并且因此导致编码体验下降。
在即时 运行 之前,我们的干净构建是 ~1 分 30 秒,之后我们得到的构建是 ~25 秒或偶尔的 40 秒。虽然 instant 运行 有时确实似乎将构建时间减少到 6-12 秒,但在其他时候,它导致我们进入疯狂的长构建,我们已经看到它需要长达 13 分钟,这在很大程度上抵消了从增量编译。
似乎大多数时候,小的变化仍然需要 40 秒。有时是 6 秒,但这种情况很少见。
感觉很像即时 运行 降低了我们持续高效工作的能力。以下是我们应用程序的一些特定配置:
Android Studio 2.1.1,Android 插件 2.1
multiDexEnabled true
dexOptions {
preDexLibraries true
javaMaxHeapSize "4g"
maxProcessCount 4
incremental true
dexInProcess true
}
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx6g -XX:MaxPermSize=512m
我们是不是做错了什么,或者有人找到解决办法了吗?
编辑:几个开发者似乎遇到了这个问题。我正在跟踪 a bug here. 欢迎加注星标并加入讨论。
我们现在从即时 运行 中获得了更好的性能。以下是我们所做的更改:
- 我们发现 Lombok 在即时 运行 的守护进程中导致内存泄漏。我们发现内存泄漏是因为使用刚预热的守护进程,我们的构建将花费大约 15 秒,但在构建应用程序更改一个小时后,我们的构建将开始花费 > 1 分钟来进行最简单的更改。我们发现将我们的应用程序从 lombok 迁移出来修复了内存泄漏。
- 我们停止使用即时 运行 热和暖代码交换。我们发现这些经常导致错误或问题,更不用说您需要注意您正在更改的内容是否需要重新加载
Application
。相反,我们开始使用冷交换功能。冷交换由 "Rerun" 按钮触发,它是 Android Studio 中播放/开始按钮右侧的 4 个按钮。这是停止按钮,箭头从左手边出来并向上。即时冷交换代码 运行 我们发现它更可靠,它还执行完整的应用程序重启,本质上就像正常构建一样,只是速度更快。
- 升级到最新的Android Studio 插件版本。插件变得更好了。它仍然有问题,但它更好。我希望插件 2.3
能修复更多错误
总体来说还是不够完美。我仍然不得不忍受奇怪的构建问题,并且偶尔进行构建清理。仍然感觉像测试版。
我一直听到即时的 运行 讨论,好像它的状态很好,但是我和我的团队经常遇到该功能的重大问题,并且因此导致编码体验下降。
在即时 运行 之前,我们的干净构建是 ~1 分 30 秒,之后我们得到的构建是 ~25 秒或偶尔的 40 秒。虽然 instant 运行 有时确实似乎将构建时间减少到 6-12 秒,但在其他时候,它导致我们进入疯狂的长构建,我们已经看到它需要长达 13 分钟,这在很大程度上抵消了从增量编译。
似乎大多数时候,小的变化仍然需要 40 秒。有时是 6 秒,但这种情况很少见。
感觉很像即时 运行 降低了我们持续高效工作的能力。以下是我们应用程序的一些特定配置:
Android Studio 2.1.1,Android 插件 2.1
multiDexEnabled true
dexOptions {
preDexLibraries true
javaMaxHeapSize "4g"
maxProcessCount 4
incremental true
dexInProcess true
}
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx6g -XX:MaxPermSize=512m
我们是不是做错了什么,或者有人找到解决办法了吗?
编辑:几个开发者似乎遇到了这个问题。我正在跟踪 a bug here. 欢迎加注星标并加入讨论。
我们现在从即时 运行 中获得了更好的性能。以下是我们所做的更改:
- 我们发现 Lombok 在即时 运行 的守护进程中导致内存泄漏。我们发现内存泄漏是因为使用刚预热的守护进程,我们的构建将花费大约 15 秒,但在构建应用程序更改一个小时后,我们的构建将开始花费 > 1 分钟来进行最简单的更改。我们发现将我们的应用程序从 lombok 迁移出来修复了内存泄漏。
- 我们停止使用即时 运行 热和暖代码交换。我们发现这些经常导致错误或问题,更不用说您需要注意您正在更改的内容是否需要重新加载
Application
。相反,我们开始使用冷交换功能。冷交换由 "Rerun" 按钮触发,它是 Android Studio 中播放/开始按钮右侧的 4 个按钮。这是停止按钮,箭头从左手边出来并向上。即时冷交换代码 运行 我们发现它更可靠,它还执行完整的应用程序重启,本质上就像正常构建一样,只是速度更快。 - 升级到最新的Android Studio 插件版本。插件变得更好了。它仍然有问题,但它更好。我希望插件 2.3 能修复更多错误
总体来说还是不够完美。我仍然不得不忍受奇怪的构建问题,并且偶尔进行构建清理。仍然感觉像测试版。