最近,我承担了将 Kure 的 Android 代码库迁移到 AndroidX 的任务。这彷佛是尝试和修复项目构建速度的绝佳机会。Gradle,因为速度缓慢且资源密集,老是有一个糟糕的表明,但我很惊讶项目的构建配置的微小变化能够大大提升构建速度。html
为了让你了解我从干净的构建中脱离的时间,这里是构建扫描的先后指标。android
从5.5分钟降低到17秒?太疯狂了。bash
经过优化能够轻松实现,便可进一步缩短构建时间。可是为了保持这篇文章的初学友好,我将故意专一于为接近这个指标而采起的轻微,无痛的措施。app
在开始优化以前,重要的是对咱们的项目进行基准测试,看看它目前须要多长时间才能构建。Gradle 有一个方便的扫描选项,你可使用它来分析任务的性能。在 Android Studio 上启动终端并执行如下命令:jvm
./gradlew assembleDebug --scan
复制代码
构建成功完成后,它将提示你接受服务条款以上载构建扫描结果。输入 yes 继续。完成发布后,你将在终端上得到一个连接以检查构建扫描。打开连接。工具
网站上有不少选项,但为了简洁起见,咱们只会看一下最重要的内容。post
摘要 视图显示已运行任务的摘要以及完成这些任务所需的时间。但咱们在这里感兴趣的是性能部分。它为你提供了整体构建时间的更详细分类,以下所示。性能
在性能部分下,有一个**“设置和建议”**选项卡,能够为你提供有关如何提升构建速度的建议。咱们来看看吧。测试
Android 团队不断改进和发展 Android 构建系统。所以,大多数状况下,只需采用最新版本的工具便可得到重大改进。gradle
在这个重构时,咱们的项目是在 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.5分钟,但仍然不够好。在调查终端中的构建日志后,我遇到了一条咱们感兴趣的行:
增量编译基本上能够防止浪费地编译整个源文件集,而只编译已更改的文件。查看日志,很明显咱们没有利用此功能。它建议咱们使用 android.enableSeparateAnnotationProcessing = true,但因为咱们在项目中使用 Kotlin,咱们不该该使用 'annotationProcessor' 配置。
幸运的是,Kotlin 版本1.3.30增长了对增量注释处理的支持。
打开模块级 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
复制代码
让咱们再次运行构建。🤞🏼🤞🏼🤞🏼
咱们如今处于最后阶段。还记得咱们在更新 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
复制代码
有了这些,让咱们看看咱们的构建速度指标:
这毫不是对能够优化项目构建速度的全部方法的普遍报道。还有不少其余的东西我没有在这篇文章中讨论,例如在使用 MultiDex 时使用 minSdk 21,预先解析你的库,禁用 PNG 运算等等 - 仅举几例。
可是大多数这些配置都须要更深刻地了解Android的构建系统以及处理大型多模块项目的经验(这些项目的好处最明显)。我上面提到的步骤很容易被一个项目归入项目,即便是初级开发人员,也有很大的收益。我但愿这能够帮助你减小你的构建速度!
好吧,直到下一次,优秀!✌🏼