早安 我们从星期一开始,材料是专门为
“ Android-developer”课程的学生准备的
。 高级课程 。
”
我最近将Android代码库迁移到了AndroidX上的
Kure 。 在我看来,这是一个提高项目组装速度的绝佳机会。 由于速度慢和资源消耗,Gradle一直声誉不佳,但令我感到惊讶的是,对装配配置进行小的更改可能会极大地提高其速度。
在优化之前/之后查看程序集扫描指标
优化之前
经过优化️️从5.5分钟减少到
17秒?? 发疯!通过优化来进一步减少组装时间并不是很困难。 但是,为了使该帖子对于初学者来说容易理解,我将刻意关注为接近该指标而采取的一些细微而无痛的措施。
首先!
在开始优化之前,测试我们的项目以找出构建它需要多长时间是很重要的。 Gradle有一个方便的扫描选项,可用于分析任务的性能。 在Android Studio中启动终端并运行以下命令:
./gradlew assembleDebug --scan
成功完成组装后,将要求您接受服务条款以下载扫描结果。 输入
是继续。 发布完成后,您将收到指向终端的链接,以检查扫描。 打开它。
该站点上有很多选项,但是为了简洁起见,我们只会考虑最重要的内容。摘要显示有关已完成任务及其完成时间的摘要信息。 但是,我们感兴趣的是“
性能”部分。 它将对总构建时间进行更详细的细分,如下所示。

在“性能”部分中,有一个
“设置和建议”选项卡,其中提供了有关提高构建速度的建议。 让我们看看它们。

在本节中,我们可以找到一些简单的修复方法来提高速度。 因此,让我们继续并在我们的项目中应用这些更正。
步骤1:升级工具
Android团队正在不断改进和开发构建系统。 因此,在大多数情况下,只需安装最新版本的工具箱,即可获得显着的改进。
在此重构过程中,我们的项目使用的是Android Studio的Gradle插件
3.2.1 版本 (
比最新发行版还早几个版本 )。
您可以点击
此链接以获取最新版本的Gradle插件。 在撰写本文时,最新
版本为3.4.0。但是这里有一个陷阱,我们必须记住:
( 注意:使用Gradle 5.0或更高版本时,Gradle守护程序的默认大小从1 GB减小到512 MB。这可能导致较差的构建性能。要覆盖此默认设置,请在gradle.properties中指定Gradle守护程序的内存大小。您的项目。)https://developer.android.com/studio/releases/gradle-plugin当使用Gradle 5.0及更高版本时,我们将需要显式增加内存大小,以便我们的构建速度不会降低。 我们将在一分钟内返回到此。打开顶级
build.gradle文件,您将在项目的根目录中找到该文件,并将以下行添加到
依赖项部分 :
classpath 'com.android.tools.build:gradle:3.4.0'
您还需要在
gradle/wrapper/gradle-wrapper.properties
中的Gradle Wrapper属性文件中更新
分发URL 。 将URL更新为以下内容。
(
此链接将在Android Gradle插件页面上提供 。 )
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
如果Kotlin Gradle插件的版本低于
1.3.0 ,则在使用Kotlin时会遇到错误
。 如果是这样,请使用IDE工具提示将Kotlin的Gradle插件更新为最新版本(在撰写本文时,此
版本为1.3.31 )。
好的,让我们从终端再次运行构建,以查看是否进行了任何改进。

步骤#2:更新配置
因此,我们能够将构建时间缩短约2.5分钟,但这还不够好。 在终端中研究了构建日志后,我碰到了一条让我们感兴趣的行:
(>任务:应用程序:compileDevelopDebugJavawithJavac
Gradle可能会禁用增量编译,因为以下注释处理器不是增量注释处理器:butterknife-compiler-10.1.0.jar(com.jakewharton:butterknife-compiler:10.1.0),dagger-compiler-2.9.jar(com.google。匕首:dagger-compiler:2.9)。
考虑在gradle.properties文件中设置实验性的android.enableSeparateAnnotationProcessing-true标志,以在单独的任务中触发注释处理并执行增量编译。)增量编译从根本上防止了整个源文件集的浪费编译,而是仅编译那些已修改的文件。 从日志中很明显,我们没有使用此功能。 他建议我们使用
android.enableSeparateAnnotationProcessing=true
,但是在任何情况下都不要使用
“ annotationProcessor”配置,因为在我们的项目中使用了Kotlin。
幸运的是,Kotlin的
1.3.30版增加了对逐步处理注释的支持。
https://kotlinlang.org/docs/reference/kapt.html(注释的增量处理(从1.3.30开始)
从版本1.3.30开始,
kapt
支持将增量批注处理作为实验功能。 当前,仅当使用的所有注释处理器均为增量处理器时,才可以增量执行注释处理。
要启用增量注释处理,请将以下行添加到
gradle.properties
文件中:
kapt.incremental.apt=true
请注意,增量注释处理要求还启用
增量编译 。)
因此,让我们开始:
- 1.将annotationProcessor配置更改为kap
- 2.启用实验性增量注释处理标志
打开模块的
build.gradle
文件,并将以下行添加到文件顶部:
apply plugin: 'kotlin-kapt'
然后在dependencies部分更改所有annotationProcessor配置,以使用kapt。 例如:
//
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
//
kapt 'com.google.dagger:dagger-compiler:2.9'
现在打开位于项目根目录中的
gradle.properties文件,并添加以下行:
kapt.incremental.apt=true
让我们再次运行构建。

好吧,看来我们已经取得了一些进展。
步骤#3:Gradle属性
我们处于最后阶段。 还记得我们在更新Gradle插件版本时遇到的技巧吗? 事实证明,较新版本的Gradle将使用的内存大小减少到512 MB。 这是为了确保弱小的计算机不会占用过多的内存。 我有一台具有16 GB RAM的计算机,因此我可以负担大约2-3 GB的Gradle守护程序,但是您的数字可能会有所不同。
打开位于项目根目录中的
gradle.properties文件,然后添加以下行。 确保选择适合您要求和计算机规格的尺寸。
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
在执行此操作的同时,我们还要在属性中启用并行程序集和按需调整。
这是我的
gradle.properties
文件的最终版本
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构建系统有更深入的了解,并需要具有处理大型多模块项目的经验(在这些项目中,收益最为明显)。 我上面提到的步骤甚至对于初级开发人员来说也很容易实现,并且具有明显的优势。 希望这可以帮助您提高构建速度!
下次见,平安降临!