[译]如何提高Android项目的构建速度

3,019 阅读5分钟

翻译说明:

原标题: How to improve the build speed of your Android projects

原文地址: www.freecodecamp.org

原文作者: Prateek Phoenix

最近,我承担了将 Kure 的 Android 代码库迁移到 AndroidX 的任务。这似乎是尝试和修复项目构建速度的绝佳机会。Gradle,由于速度缓慢且资源密集,总是有一个糟糕的代表,但我很惊讶项目的构建配置的微小变化可以大大提高构建速度。

为了让你了解我从干净的构建中脱离的时间,这里是构建扫描的前后指标。

预优化
预优化🐢🐢

后优化⚡️⚡️

从5.5分钟下降到17秒?太疯狂了。

通过优化可以轻松实现,即可进一步缩短构建时间。但是为了保持这篇文章的初学友好,我将故意专注于为接近这个指标而采取的轻微,无痛的措施。

但首先!

在开始优化之前,重要的是对我们的项目进行基准测试,看看它目前需要多长时间才能构建。Gradle 有一个方便的扫描选项,你可以使用它来分析任务的性能。在 Android Studio 上启动终端并执行以下命令:

./gradlew assembleDebug --scan

构建成功完成后,它将提示你接受服务条款以上载构建扫描结果。输入 yes 继续。完成发布后,你将在终端上获得一个链接以检查构建扫描。打开链接。

网站上有很多选项,但为了简洁起见,我们只会看一下最重要的内容。

摘要 视图显示已运行任务的摘要以及完成这些任务所需的时间。但我们在这里感兴趣的是性能部分。它为你提供了总体构建时间的更详细分类,如下所示。

在性能部分下,有一个**“设置和建议”**选项卡,可以为你提供有关如何提高构建速度的建议。我们来看看吧。

第1步:更新你的工具

Android 团队不断改进和发展 Android 构建系统。因此,大多数情况下,只需采用最新版本的工具即可获得重大改进。

在这个重构时,我们的项目是在 Android Studio 的 Gradle 插件版本3.2.1 (比最新版本早几个版本)。

你可以访问此链接以获取最新版本的 Gradle 插件的版本。

在撰写本文时,最新版本恰好是版本3.4.0。

但它伴随着我们需要记住以后的问题:

developer.android.com/studio/rele…

使用 Gradle 5.0 及更高版本时,我们需要显式增加堆大小以确保我们的构建速度不会恶化。我们将在一分钟内回到这一点。

打开你将在项目根目录中找到的顶级 build.gradle 文件,并在 dependencies 部分中添加以下行:

classpath 'com.android.tools.build:gradle:3.4.0'

你还需要更新位于 gradle/wrapper/gradle-wrapper.properties 的 gradle 包装器属性文件中的分发 URL 。将 URL 更新为以下内容。(此链接将在Android Gradle插件发布页面上提供。)

distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

如果你在项目中使用 Kotlin,如果你的 Kotlin Gradle 插件的版本低于1.3.0,则会遇到错误。如果是这种情况,请使用 IDE 的提示将你的 Kotlin Gradle 插件更新到最新版本(在撰写本文时恰好是版本1.3.31)。

好吧,让我们再次从终端运行构建,看看我们是否实现了任何改进。

步骤2:更新配置

所以我们能够从构建时间开始大约2.5分钟,但仍然不够好。在调查终端中的构建日志后,我遇到了一条我们感兴趣的行:

增量编译基本上可以防止浪费地编译整个源文件集,而只编译已更改的文件。查看日志,很明显我们没有利用此功能。它建议我们使用 android.enableSeparateAnnotationProcessing = true,但由于我们在项目中使用 Kotlin,我们不应该使用 'annotationProcessor' 配置。

幸运的是,Kotlin 版本1.3.30增加了对增量注释处理的支持。

kotlinlang.org/docs/refere…

那么我们

  1. 将 annotationProcessor 配置更改为 kapt
  2. 启用增量注释处理实验标志

打开模块级 build.gradle 文件,并将以下行添加到文件顶部:

apply plugin: 'kotlin-kapt'

接下来,更改依赖项部分中的所有 annotationProcessor 配置以使用 kapt。这是一个例子:

//Before
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'

//After
kapt 'com.google.dagger:dagger-compiler:2.9'

现在打开位于项目根目录的 gradle.properties 文件,并添加以下行:

kapt.incremental.apt=true

让我们再次运行构建。🤞🏼🤞🏼🤞🏼

好吧,看起来我们到了那里。

第3步:Gradle 属性

我们现在处于最后阶段。还记得我们在更新 Gradle 插件版本时遇到的问题吗?结果是较新版本的 Gradle 将堆大小减小到512 MB。这是为了确保低端机器不会窒息。我在16台机器上,所以我可以给 Gradle 守护进程提供2-3gig,但你的里程可能会有所不同。

打开位于项目根目录的 gradle.properties 文件,然后添加以下行。请记住根据您的要求和机器规格选择尺寸。

org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

虽然我们在这里,但我们还可以在属性中启用并行构建和按需配置。

这是我的最终 gradle.properties 文件的样子:

org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

org.gradle.parallel=true

org.gradle.configureondemand=true

kapt.incremental.apt=true
  • org.gradle.parallel - 此标志允许 Gradle 并行而不是按顺序在项目中构建模块。这仅对多模块项目有益。
  • org.gradle.configureondemand - 此标志仅配置项目所需的模块,而不是构建所有模块。

有了这些,让我们看看我们的构建速度指标:

这绝不是对可以优化项目构建速度的所有方法的广泛报道。还有很多其他的东西我没有在这篇文章中讨论,例如在使用 MultiDex 时使用 minSdk 21,预先解析你的库,禁用 PNG 运算等等 - 仅举几例。

但是大多数这些配置都需要更深入地了解Android的构建系统以及处理大型多模块项目的经验(这些项目的好处最明显)。我上面提到的步骤很容易被一个项目纳入项目,即使是初级开发人员,也有很大的收益。我希望这可以帮助你减少你的构建速度!

好吧,直到下一次,优秀!✌🏼

欢迎关注 Kotlin 中文社区!

中文官网:www.kotlincn.net/

中文官方博客:www.kotliner.cn/

公众号:Kotlin

知乎专栏:Kotlin

CSDN:Kotlin中文社区

掘金:Kotlin中文社区

简书:Kotlin中文社区