Android 加速构建方案对比

Android · lomanyong · 于 发布 · 最后由 diycodes回复 · 3536 次阅读
1869

本文原创,原文发布于个人博客 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 的回答 - 知乎

本帖已被设为精华帖!
共收到 3 条回复
1049
jackwang · #1 ·

Very Good !

30
d_clock · #2 ·

不错,可以试试,buck的迁移成本有点高,而且不支持Windows。

96
diycodes · #3 ·
  • 原创:是
  • 有用:是,目前加速构建方式多种多样,大部分开发者很难知道该如何选择,本文在一定程度上可以帮助开发者对这些加速构建方式进行初步筛选。
  • 更好:作为评测对比类文章,并没有发现更好的内容。
  • 总评:对开发者有一定帮助。

来自Diycode 原创技术文章奖励计划 委员会点评,建议赞赏50元,希望作者联系站长@jixiaohua 微信jixiaohua888 ,注名diycode 赞赏

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册