超快 Android 构建

在今天的 Google I/O 大会上,Android Studio 团队发布了基于 Android Gradle 插件 3.0 的第一个预览版本,该插件基于 Gradle 4.0 M2。它带来了重大的性能改进,特别是对于具有大量子项目的构建。在本博文中,我们将解释您对这个预览版本的期待以及 Android Studio 和 Gradle 团队如何实现这些改进。在深入探讨之前,让我们回顾一下导致创建当前 Android 构建系统的目标。

移动开发的复杂性

开发移动应用程序本质上比构建类似规模的传统 Web 或服务器应用程序更复杂。应用程序需要支持各种具有不同外设、不同屏幕尺寸和相对较慢硬件的设备。流行的免费增值模式增加了另一层多样性,需要为应用程序的免费版和付费版提供不同的代码路径。为了为每台设备和目标受众提供快速、精简的应用程序,构建系统需要在前期完成大量繁重的工作。

为了提高开发人员的生产力并减少运行时开销,Android 构建工具提供了多种语言和源代码生成器,例如 Java、RenderScript、AIDL 和原生代码。将应用程序与其库一起打包涉及高度可定制的合并和缩减步骤。Android Studio 团队面临着自动执行所有这些操作而不会向开发人员暴露底层复杂性的挑战。开发人员可以专注于编写他们的生产代码。

最后但并非最不重要的是,开发人员期望构建工具能够管理他们的依赖项,可扩展且提供深度 IDE 集成。

Gradle 非常适合这些挑战,Android Studio 团队在 Gradle 平台之上创建了一个出色的 Android 构建工具。

性能挑战

无论插件多么优雅和可扩展,无论IDE集成多么无缝,当事情花费太长时间时,开发人员就会变得没有效率且沮丧。Android Studio团队在过去几年中一直在稳步提升性能。模拟器变得更快,使用Instant Run和其他改进,部署应用程序的时间减少了几个数量级。这些步骤现在已经将构建本身暴露为最终的瓶颈。Android Studio团队和Gradle团队一直在不断改进插件和平台的性能,但到目前为止,这还不够。基本的设计问题阻碍了良好的性能。

因此,Gradle Inc.和Google在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 performance comparison

最后但并非最不重要的一点是,Android Studio 团队将使 Android 插件 3.0 与 Gradle 构建缓存 兼容。构建缓存允许在干净构建和跨机器边界之间重用构建输出。这意味着开发人员可以重用 CI 生成的构建输出,并且构建管道可以重用早期阶段的结果。它还加快了在开发人员机器上切换功能分支的速度。初步测试很有希望,使用缓存时,上述大型 Android 应用程序的干净构建时间从 60 秒下降到大约 20 秒。

试试看

Android Studio 团队已经编写了一份全面的 迁移指南。可能存在与社区插件的兼容性问题,因为其中许多插件依赖于现在工作方式不同的内部机制。

如果您正在开发 Android 项目,请试用预览版,并告诉我们您的构建时间在开箱即用情况下提高了多少。尝试更多地模块化您的应用程序,并拆分 apiimplementation 依赖项,以获得更大的性能提升。您可以使用 Build Scans 及其 时间线 视图深入了解构建的性能,哪些任务已执行以及它们花费了多长时间。

如果您是 Android 插件作者,新版本可能需要对您的插件进行一些更改才能保持兼容性。如果您在迁移过程中遇到任何问题,请 提交问题

下一步是什么?

您可以在 Gradle 方面期待更多改进。例如,我们目前正在努力默认情况下并行执行任务。

同样可以肯定的是,Android Studio 团队将带来更多性能方面的智能,包括 Android Studio 优化,以便在同步项目时尽可能少地执行工作。Gradle 和 Android Studio 团队也在合作进行这项工作。

随着 alpha 版本的成熟和插件作者对其进行调整,对社区插件的支持将得到改善。反馈的人越多,这些重大改进就能越快地发布为稳定版本。

讨论