Android 加速构建方案对比

1,511 阅读5分钟
原文链接: www.diycode.cc

本文原创,原文发布于个人博客 Android 加速构建方案对比 - Yong's Blog

在知乎上看到了这个问题:有什么办法能加快Android Sudio中Gradle build速度?,因为刚好在开发和维护 Freeline ,所以也整理了一下 Android 上各种加速构建的方案和对比。

Instant Run

  • Pros

    • Google 官方支持的增量编译方案,随着 Android Studio 的迭代持续优化
    • 相对来说更加稳定,零配置,基本无侵入性影响
    • 几秒内可以完成编译,速度非常快
  • Cons

    • 对于可以修改的地方有局限性,具体可以参考官方文档
    • 除了资源修改之外,修改 Java 文件会重启整个应用,从 Launcher Activity 重新进入,如果是在开发一个层级较深的 UI 页面的话,使用起来不方便(当然,也可以手动关掉 Activity 重启,不过可能带来编译后应用没有更新的问题,具体方法可以参考官方文档
    • 增量过的代码不支持 debug
    • 对于复杂的工程结构支持程度不高
    • 不支持 Kotlin
  • 相关链接

Buck/okbuck

JRebel for Android

  • Pros

    • 在 Instant Run 之前就已经存在的 Android 平台上的增量编译解决方案,zeroturnround 有大量 JVM 上热部署的实践积累
    • 零配置,只需安装 Android Studio 插件,立刻可以运行
    • 相比 Instant Run 支持的范围广,参考链接
    • 支持 Retrolambda 与部分流行注解库
    • 字节码层面的动态加载,理论上支持几乎所有基于 JVM 语言,包括 Kotlin、Groovy 等
  • Cons

    • 收费,价格较高,可以参考链接
    • 不支持 databinding
    • 只有收费版才能 debug,有专门的 debug 工具
    • Crash 后需要重新全量编译,单次全量编译、安装的速度非常慢
  • 相关链接

Freeline

LayoutCast 也是一个常用的加速编译的方案,不过对多 module 的工程支持不足,所以只能算是一个增量编译的工具原型,通常都需要改造一下才能在复杂工程上应用起来,没办法满足开箱即用的需求,因此就不加入上面的比较了。

下面再说下如何选择上面方案的问题。

如果团队里所有人都是清一色 Mac 配置,而且是刚刚起步或者没有什么历史包袱的项目的话,可以考虑一开始就把构建系统迁移到 buck 上,这样子随着工程的膨胀,基本上也不会遇见编译速度太慢的问题。而对于那些本身已经有一定量级的工程还要迁移到buck上的话,需要考虑时间成本的问题,大工程迁移构建系统就算有 okbuck 的帮助,时间上还是会耗费不少的,甚至可能会需要修改 buck 的源码来适配自己的项目。另外,在使用 buck 的时候,最好能够对工程模块进行合理拆分,拆成更多的小单元,也能够显著地提高整体的编译速度。当然 buck 也存在着明显的问题,问题的根源在于其是一套独立的,与 Gradle 完全不一样的构建系统,这意味着很多可以应用在 Gradle 工程上的 plugins,都需要单独移植到 buck 上,以及使用 buck 打出来的包跟 Gradle 打出来的包,可能是会存在差异的,不能单纯地直接使用 buck 打 debug 包,然后使用 Gradle 构建 release 包。

对于个人开发者的小工程,Instant Run 基本上已经够用了。不差钱的朋友或者使用了 Kotlin 等基于 JVM 的语言,也可以选择试试看 JRebel for Android (前提是如果你愿意付费的话,否则只有一段时间的免费试用期)。

[硬广植入]

如果上面的情况无法满足的话,也很欢迎你来体验一下 Freeline 看看。Freeline 的优点上面已经提到了,基本上可以覆盖到日常开发的大多数 case。Freeline 基本上做到了每次编译都只会去处理有改动的文件,不论是 Java 文件还是资源文件,整个流程是真正意义上的增量编译。同时,社区内也有第三方开发者提供了 Android Studio 的 IDE 插件,可以无缝结合到日常的开发中。使用了 Freeline 之后,除了全量编译的时候,基本上告别了发烫的笔记本电脑和狂转的风扇了,再也不会因为各种编译情况下 Android Studio 卡的无法正常使用了。

Freeline 开源以后,已经有挺多 Android 应用接入了 Freeline 来加速日常开发的编译过程。当然,Freeline 也并不是一个完美的解决方案。也存在着从入门到放弃的例子,比如经常需要清理缓存才能开发某功能,而 Freeline 在清理完缓存会只能全量编译,导致最终放弃了 Freeline。Freeline 从原理的本质来说其实是基于 Gradle 构建系统的一套 hack 方案,因此还会存在着一些兼容性问题,这也是目前它还不够稳定、不是一套完美的解决方案的根本原因。

不过 Freeline 目前还在持续开发与完善中,下一步还会加入对 databinding 和 NDK 的增量编译部署的支持。接入过程或者使用过程遇见什么问题的都可以在 Github 上提 issue,我们会尽快帮助大家解决的。

希望 Freeline 能够给 Android 开发者们带来不一样的开发效率与体验,如果你喜欢我们的项目的话,也欢迎在 Github 上给我们加个 star:Github - alibaba/freeline: Freeline is a fast build and deployment tool for Android

最后贴上在知乎上的回答:有什么办法能加快Android Sudio中Gradle build速度? - Yong Huang 的回答 - 知乎