有什么办法能加快Android Studio中Gradle build速度?

最近发现每次写完代码跑项目到手机上测试,Gradle build差不多要25-30秒不等才能Gradle build finish,再加上安装到手机5…
关注者
284
被浏览
47,972
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

可以先对比一下社区中常见的几款加速编译的方案:


Instant-Run:developer.android.com/s

  • Pros
    • Google官方支持的增量编译方案,随着Android Studio的迭代持续优化
    • 相对来说更加稳定,零配置,基本无侵入性影响
    • 几秒内可以完成编译,速度非常快
  • Cons
    • 对于可以修改的地方有局限性,具体可以参考官方文档:developer.android.com/s
    • 除了资源修改之外,修改 Java 文件会重启整个应用,从 Launcher Activity 重新进入,如果是在开发一个层级较深的 UI 页面的话,使用起来不方便(当然,也可以手动关掉 Activity 重启,不过可能带来编译后应用没有更新的问题,具体方法可以参考官方文档
    • 增量过的代码不支持debug
    • 对于复杂的工程结构支持程度不高
    • 不支持Kotlin

Buck/okbuck:GitHub - facebook/buck: A fast build system that encourages the creation of small, reusable modules over a variety of platforms and languages.

  • Pros
    • Facebook出品的构建工具,支持多种语言/平台的构建
    • okbuck是一个帮助gradle工程快速集成buck的工具,目前转入uber进行维护
    • 多线程并发编译,充分利用缓存,近似增量编译
    • 目前支持了retrolambda与注解(?)
  • Cons
    • 对于有历史的大型工程接入成本较高,需要较高的时间成本
    • 构建过程与gradle不同,所以第一次接入可能会存在不少的问题需要解决
    • 同理,因为构建过程与 Gradle 不同,社区上一些新的技术可能没办法很快应用上
    • 需要重新安装 APK 消耗时间较久

    • 不支持Kotlin
    • 不支持win平台

JRebel for Android:JRebel for Android

  • Pros
    • 在Instant Run之前就已经存在的Android平台上的增量编译解决方案,zeroturnround有大量JVM上热部署的实践积累
    • 零配置,只需安装Android Studio插件,立刻可以运行
    • 相比Instant Run支持的范围广,参考这篇文章:JRebel for Android and Instant Run: Hot Swaps, Warm Swaps, Cold Swaps, all the Swaps!
    • 支持lambda与部分流行注解库
    • 字节码层面的动态加载,理论上支持几乎所有基于JVM语言,包括Kotlin、Groovy等
    • 付费版提供技术支持
  • Cons

Freeline:GitHub - alibaba/freeline: Freeline is a fast build and deployment tool for Android

  • Pros
    • 支持大多数场景的增量编译
    • 支持 Retrolambda 与注解
    • 支持 so 动态替换
    • 支持 DataBinding
    • 支持 Windows/Linux/macOS
    • App crash后,仍然可以通过增量编译来修复
    • 大多数情况下增量编译可以在10s内完成
  • Cons
    • 初次接入可能存在一定的问题,需要稍微花点时间来解决
    • 在简单的工程上,与其他构建方案相比,没有明显的优势
    • 不支持删除带id的资源
    • 不支持Kotlin

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


Updata: Freeline v0.8.0 已加入对 DataBinding 的支持


利益相关:Freeline的作者...