本文作者
作者:yechaoa
链接:
https://juejin.cn/post/7344625554529730600
本文由作者授权发布。
提升编译速度最快的是升级电脑配置,其次是接入Gradle Enterprice企业版,这两者简单粗暴,带来的效果也非常明显,但是这两者的成本却不一定是所有人都能接受的,特别是目前大家都在搞降本增效,所以想要靠外在力量来提升编译速度更是难上加难,遂,有了本文,通过Gradle配置最佳实践的方式来帮助大家低成本的提升编译速度。
提升开发效率:开发者可以更快地编译和运行代码,这意味着对代码的变更可以更快的得到反馈,从而加速开发周期,提升个人和整个团队的生产力。 提升开发体验:减少了等待时间,提升个人和整个团队的幸福感和满意度。
硬件性能:CPU、RAM等; 构建配置:缓存、增量编译等; 项目:项目的大小和复杂度,代码量、模块化、依赖管理等; 其他:网络速度,下载慢或者找不到等。
复用:提升复用率,不仅是代码的复用,也是编译产物的复用,不仅关注首次编译速度,也要关注二次编译速度。 更少:减少参与编译的文件,越少则处理越快,不仅是代码文件,还有资源文件。
5.1、升级版本
5.1.1、升级Gradle
Keeping up with Gradle version upgrades is low risk because the Gradle team ensures backwards compatibility between minor versions of Gradle. 官方还说是低风险
5.1.2、升级Java
5.1.3、升级Plugin
5.2、开启并行编译
org.gradle.parallel=true
5.3、开启守护进程
org.gradle.daemon=true
以上两个配置,在GradleX项目中测验,增量编译速度提升60%以上,实际以自己项目为准。 https://github.com/yechaoa/GradleX
5.4、启用配置缓存
org.gradle.unsafe.configuration-cache=true
5.5、启用构建缓存
org.gradle.caching=true
tasks.withType(JavaCompile).configureEach {
options.incremental = true
}
关于Task的增量编译,请看这篇:【Gradle-7】Gradle构建核心之Task指南 - 掘金
https://juejin.cn/post/7248207744087277605#heading-32
5.7、增加JVM堆大小
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
2048m=2g,也可以写成:
org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8
这个大小可以根据自己电脑配置来调整。
5.8、使用 JVM 并行垃圾回收器
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -XX:+UseParallelGC
5.9、增加Android Studio运行内存
-Xms256m
-Xmx1280m
-XX:ReservedCodeCacheSize=512m
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-XX:CICompilerCount=2
-XX:+HeapDumpOnOutOfMemoryError
.....
-Xms256m:初始堆内存大小。 -Xmx1280m:最大堆内存大小。
-Xms256m
-Xmx2048m
然后保存并重启AS生效即可。
5.10、优化依赖解析
5.10.1、删除无用的依赖
可以通过Gradle Lint Plugin来识别未使用的依赖项,然后删除,从而减少构建时间。
https://github.com/nebula-plugins/gradle-lint-plugin
5.10.2、优化存储库顺序
repositories {
google()
mavenCentral()
// others
}
5.10.3、优化依赖的下载速度
repositories {
// 阿里云仓库
maven { url 'https://maven.aliyun.com/repository/public/' }
google()
mavenCentral()
}
5.10.4、优化依赖版本
api 'com.tencent.mm.opensdk:wechat-sdk-android:+'
看下SDK的介绍,直接使用具体的版本:
api 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.23'
关于动态版本和快照版本的检索时效也可以通过以下配置来设置:
configurations.all {
// 动态版本缓存时效
resolutionStrategy.cacheDynamicVersionsFor(10, "minutes")
// 快照版本缓存时效
resolutionStrategy.cacheChangingModulesFor(4, "hours")
}
5.11、避免编译不必要的资源
android {
productFlavors {
dev {
...
resourceConfigurations "en", "xxhdpi"
}
}
}
5.12、按需编译
if(debug){
apply xxx
}
5.13、禁用不需要的Task
//跳过Lint和Test相关的task, 以加速编译
if (isDebug()) {
gradle.taskGraph.whenReady {
tasks.each { task ->
if (task.name.contains("Test") || task.name.contains("Lint")) {
task.enabled = false
}
}
}
}
选中图片 > 右键 > Convert to WebP
android {
buildTypes {
release {
crunchPngs false
}
}
}
android.nonTransitiveRClass=true
从 Android Studio Bumblebee 开始,新项目的非传递 R 类默认处于开启状态。对于使用早期版本的 Android Studio 创建的项目,可以在 Refactor > Migrate to Non-transitive R Classes,将项目更新为使用非传递 R 类。
5.17、停用Jetifier标志
android.enableJetifier=false
5.18、使用KSP代替kapt
kapt是Kotlin注解处理工具,kapt的运行速度明显慢于Kotlin Symbol Processor (KSP)。官方:速度提升多达2倍。
https://android-developers.googleblog.com/2021/09/accelerated-kotlin-build-times-with.html
5.18.1、启用KSP
plugins {
id("com.google.devtools.ksp") version "1.8.10-1.0.9" apply false
}
plugins {
id("com.google.devtools.ksp")
}
dependencies {
// kapt
kapt("androidx.room:room-compiler:2.5.0")
// ksp
ksp("androidx.room:room-compiler:2.5.0")
}
5.18.3、K2
kotlin.experimental.tryK2=true
kapt.use.k2=true
更多可查看:kotlin-k2-compiler。
https://kotlinlang.org/docs/whatsnew1920.html#how-to-enable-the-kotlin-k2-compiler
5.19、去掉动态配置
5.19.1、动态的FileName
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = "${variant.name}-${buildTime()}.apk"
}
}
static def buildTime() {
return new Date().format("MMdd_HHmm", TimeZone.default)
}
defaultConfig {
versionCode $buildTime().toInteger()
versionName '1.0.$buildTime()'
}
static def buildTime() {
return new Date().format("MMdd_HHmm", TimeZone.default).toInteger()
}
5.20、其他
5.20.1、开启离线模式
5.20.2、优化DexOptions
android {
dexOptions {
// 使用增量模式构建
incremental true
// 最大堆内存
javaMaxHeapSize "4g"
// 是否支持大工程模式
jumboMode = true
// 预编译
preDexLibraries = true
// 线程数
threadCount = 8
// 进程数
maxProcessCount 4
}
}
5.20.4、构建分析
使用构建分析来解决项目中的构建耗时点,以及不合理配置,参考:【Gradle-10】不可忽视的构建分析。
https://juejin.cn/post/7282150745164005432
GitHub
相关文档
Improve the Performance of Gradle Builds
https://docs.gradle.org/current/userguide/performance.html
What's new in Gradle 7.0
https://gradle.org/whats-new/gradle-7/
What's new in Gradle 8.0
https://gradle.org/whats-new/gradle-8/
Configuration cache
https://docs.gradle.org/8.0.2/userguide/configuration_cache.html
优化您的构建速度
https://developer.android.com/studio/build/optimize-your-build
从 kapt 迁移到 KSP
https://developer.android.com/build/migrate-to-ksp?hl=zh-cn#kts
An In-depth Look at Gradle's Approach to Faster Compilation