? 随着没我们的项目不断地增大,模块化、组件化,APT技术的盛行,导致module拆分过多,多module情况下很容易出现依赖关系混乱、过度依赖等问题,致使构建速度越来越慢。
? 本文针对自己的实际项目经验总结了一些提升一些Android构建速度的方法:
开启Gradle Daemon
Gradle 守护进程是一个后台进程, 它运行着繁重的构建, 然后在构建等待下一次构建的之间保持自身存在. 这使得数据和代码在下一次构建前已经准备好,并存入内存中。这显著的提高了后续构建的性能. 启用Gradle守护进程是一种节约构建时间的廉价方式。
强烈建议在所有开发机器上启用Gradle的守护进程。但是不推荐在持续集成和构建服务器环境下启用守护进程
Gradle自动管理守护进程.如果构建环境配置为利用后台程序,如果在没有可用守护进程,就会自动启动一个守护进程,或者使用现有的空闲的兼容守护进程.如果一个守护进程在3个小时内没有使用,它将会自我终结.一旦配置开发环境为使用的守护进程,守护进程通常是隐形的,容易被遗忘的.
开启并行编译
task默认是串行执行,开启并行执行提高构建速度org.gradle.parallel=true (在项目根目录gradle.properties文件中声明)
调整java堆大小
gradle默认为构建预留1G的堆空间,但对于一个相对较大的app来说还远远不够,可通过org.gradle.jvmargs=-Xmx4096M (在项目根目录gradle.properties文件中声明)配置动态调整,可根据自身设备配置来进行调整。
开启build缓存
org.gradle.caching=true
开启编译缓存
android.enableBuildCache=true
开启后台进程
org.gradle.daemon=true,此选项默认3.0以后自动开启
减少引用仓库的数量
gradle会从用户配置的repositories中顺序的查找并下载依赖库,build过程dependency resolution阶段会执行此操作,它需要访问网络,因此合理配置repositories可减少依赖库查找时间
合理的apply插件
应用的插件到底是全局的还是局部的。 应该配置到合理的位置,allprojects {} or subprojects {},不必要的插件不要apply。
尽量不要使用动态的版本号
(Minimize dynamic and snapshot versions),例如“2.+”。它会迫使gradle访问远程仓库判断是否有新版本可用。
第三方库尽量引用相同版本
gradle会自动为我们解决各种第三方库的版本依赖问题,如果存在过度的版本不一致的问题也会变相增加gradle的工作量
开启R8
R8是新一代的代码压缩工具,它的职能与Proguard相对应。在R8之前,gradle采用D8+Proguard的形式构建,R8则将混淆和D8工具整合(D8编译器在gradle 3.1版本默认开启),旨在加快构建时间和output apk大小
开启方式:android.enableR8 = false
开启按需配置
配置有一种方式是按需配置,目前还在试验孵化阶段,所以默认是关闭的,可以通过在gradle.properties加入这样一句来开启org.gradle.configureondemand=true
减少编译脚本中的I/O操作
有时候,编译脚本中会有一些代码做动态配置信息的获取,很多时候其实不需要每次搜需要去获取,可以使用缓存或者使用脚本控制与打包机进行区分,日常开发调试是不需要实时获取配置信息
开启kotlin的增量和并行编译
如果项目开发过程中有部分模块使用到了kotlin我们需要对其编译进行优化
kotlin.incremental=true
kotlin.incremental.java=true
kotlin.incremental.js=true
kotlin.caching.enabled=true
kotlin.parallel.tasks.in.project=true *
优化kapt
kapt.use.worker.api=true
kapt.incremental.apt=true
kapt.include.compile.classpath=false
开启KAPT 编译缓存
在项目的app目录中的build.gradle文件中修改
kapt {
useBuildCache = true
javacOptions {
option("-Xmaxerrs", 500)
}
}
手动配置maxProcessCount
在项目的app目录中的build.gradle文件中修改
android {
dexOptions {
preDexLibraries true
maxProcessCount 8
}
}
合理的apply插件
应用的插件到底是全局的还是局部的。 应该配置到合理的位置,allprojects {} or subprojects {},不必要的插件不要apply。
Build Scans工具介绍
我们在进行优化的时候,主要监测工具可以使用Build Scans,Build Scans是用于开发和维护Gradle构建的重要工具。它为你提供了构建的详细信息,并为你识别构建环境、依赖或性能上存在的问题,同时可以帮你更全面地理解并提升构建过程,也便于与他人的合作。
在Gradle构建运行时,Build Scans插件会抓取数据,并将数据传送到Build Scans服务端。同时返回一个可被共享的链接,内部包含有用的构建信息。这些信息包含两大类:*(1)环境信息,包括操作系统、Java版本和时区;(2)构建相关信息,包含使用的插件、任务、测试以及依赖信息。
build scans 主界面:
|