在今天的谷歌I/O大会上,Android Studio团队发布了基于Gradle 4.0 M2的Android Gradle插件3.0的第一个预览版本。它带来了重大的性能改进,特别是对于有大量子项目的构建。在这篇博文中,我们将解释你可以从这个预览版中期待什么,以及Android Studio和Gradle团队如何实现这些改进。在深入探讨之前,让我们回顾一下是什么目标导致了当前Android构建系统的诞生。
移动开发的复杂性
与构建类似规模的传统Web或服务器应用程序相比,开发移动应用程序在本质上更加复杂。一个应用程序需要支持具有不同外围设备、不同屏幕尺寸和相对较慢的硬件的各种设备。流行的免费模式又增加了一层多样性,需要为免费和付费版本的应用程序提供不同的代码路径。为了给每台设备和目标受众提供一个快速、纤细的应用程序,构建系统需要在前面做很多繁重的工作。
为了提高开发者的工作效率,减少运行时的开销,Android构建工具提供了几种语言和源码生成器,例如Java、RenderScript、AIDL和Native代码。将一个应用程序和它的库一起打包,涉及到高度可定制的合并和收缩步骤。Android Studio团队面临的挑战是,在不向开发者暴露底层复杂性的情况下,将所有这些自动化。开发人员可以专注于编写他们的生产代码。
最后但并非最不重要的是,开发人员希望构建工具能够管理他们的依赖关系,具有可扩展性并提供深度的IDE集成。
Gradle非常适合应对这些挑战,Android Studio团队在Gradle平台之上创建了一个非常棒的Android构建工具。
性能挑战
无论插件多么优雅和可扩展,无论IDE集成多么无缝,当事情花的时间太长时,开发者就会变得没有生产力和沮丧。在过去的几年里,Android Studio团队在性能方面取得了稳步的进展。仿真器变得更快,通过即时运行和其他改进,部署一个应用程序的时间减少了几个数量级。这些步骤现在已经暴露了构建本身是最后的瓶颈。Android Studio团队和Gradle团队不断改进插件和平台的性能,但到目前为止,这还远远不够。基本的设计问题阻碍了伟大的性能。
因此,Gradle公司和谷歌在2016年底联手将这种情况控制住。这项工作被分成了三个方面。
- 对Gradle和它的Java支持的一般改进。更快的最新检查、避免编译、稳定的增量编译和平行依赖性下载。
- 对Android工具的一般改进,如dex和代码缩减,包括增量dexing。
- 用于Gradle中变体感知依赖管理的新API和使用这些新API的Android插件。
后者让Android Studio团队最终摆脱了很多低效的变通方法,他们不得不因为这些缺失的API而建立。
为了理解为什么变体意识的依赖性管理如此重要,想象一下你有一个依赖单个库的应用程序。它们都支持ARM和X86架构,都有免费和付费版本,而且都可以为调试和生产而构建。这就形成了总共8个变体。但是,在任何特定的时间点上,一个开发者都只致力于一个变体,例如 "免费x86调试 "变体。
到目前为止,Android插件必须在构建生命周期的早期检查应用程序的依赖关系,以选择正确的库的变体来构建。这个早期阶段被称为配置时间,在此期间,Gradle决定它需要以何种顺序运行哪些任务。在配置时间做更多的工作,意味着无论用户选择了哪些任务,构建速度都会变慢。它还会影响到与IDE同步构建所需的时间。Android插件的急切依赖性检查导致了配置时间的组合式爆炸,因为更多的子项目被添加到构建中。
有了Gradle新的变体感知依赖性管理,这种情况完全改变了。Android插件现在可以为不同的变体维度(如产品风味和构建类型)提供匹配策略,Gradle在依赖关系解析中使用这些策略来选择上游库的正确变体。这完全消除了在配置时解决依赖关系的需要,也允许Android插件只构建应用程序需要的库的部分。
在一个有130个子项目的特别大的应用程序中,配置项目的时间从使用Android 2.3工具的3分钟到10秒下降到使用Android 3.0的2秒以下。清洁构建的时间从5分钟以上降到了1分钟左右。当与新的避免编译功能相结合时,对增量构建的影响是巨大的。做一个单行修改和组装项目的时间降到了9秒左右。对于单体项目来说,这些数字并不那么令人印象深刻,但它们表明,现在的构建系统在模块化的应用程序中工作非常有效。
最后但同样重要的是,Android Studio团队将使Android插件3.0与Gradle构建缓存兼容。构建缓存允许跨清洁构建和跨机器边界重复使用构建输出。这意味着开发者可以重复使用CI生成的构建输出,构建管道可以重复使用早期阶段的结果。它也加快了开发者机器上功能分支之间的切换。初步测试是有希望的,上面提到的大型安卓应用的清洁构建在使用缓存时从60秒下降到20秒左右。
试一试
Android Studio团队已经写了一份全面的迁移指南。社区插件可能会有兼容性问题,因为它们中的许多都依赖于现在工作方式不同的内部结构。
如果你正在开发Android项目,请试一试预览版,并告诉我们你的构建时间有多大的改善。试着把你的应用模块化多一点,拆分api 和implementation 依赖关系,以获得更大的性能提升。你可以使用Build Scans和它的时间线视图来深入了解你的构建性能,哪些任务被执行了,它们花了多长时间。
如果你是一个Android插件的作者,新版本可能需要对你的插件进行一些修改,以保持兼容。如果你在迁移过程中遇到任何问题,请提交一个问题。
下一步是什么?
你可以期待Gradle方面的更多改进。例如,我们目前正在研究默认情况下的并行任务执行。
我们也可以期待Android Studio团队提供更多的性能智能,包括Android Studio的优化,以便在同步项目时尽量少做工作。Gradle和Android Studio团队在这方面也在进行合作。
随着alpha版本的成熟和插件作者的适应,对社区插件的支持将得到改善。越多的人提供反馈,这些伟大的改进就能越快地被发布为稳定版本。