Android加快你的编译速率

开发者 2024-9-21 15:01:35 82 0 来自 中国
工欲善其事,必先利其器。假如每次运行项目都要泯灭5-10分钟,那人的心态都要崩了。
Gradle构建流程

Gradle 的生命周期可以分为大的三个部门:初始化阶段(Initialization Phase),设置阶段(Configuration Phase),实验阶段(Execution Phase)。
优化方案

从整体构建流程可以得知,我们整体上需要从三个方面举行优化:

  • 初始化速率优化
  • 设置速率优化
  • 实验速率优化
    此中实验的过程占比是最大的,以是重心放在实验速率优化上。
1.初始化速率优化

当组件化程度较高时,在开辟某个特定功能过程中有些组件是不需要引入的,此时可以在setting.gradle中移除不需要引入的组件模块,可以淘汰初始化时间
2.设置速率优化

设置阶段重要是对各个build.gradle举行剖析,因此可以留意以下几点:
按需引入模块,淘汰build.gradle的剖析
build.gradle中只管少做耗时操作,比方读取体系时间动态设置apk的名称构成
在开辟阶段不是必要实验的使命,可以写判定克制这些使命的设置,比方一些字节码插桩,性能监控之类的。

  • 开启Configuration Cache
在使命实验阶段,Gradle提供了多种方式实现Task的缓存与重用(如up-to-date检测,增量编译,build-cache等)。
除了使命实验阶段,使命设置阶段偶尔也比力耗时,目前AGP也支持了设置阶段缓存Configuration Cache,它可以缓存设置阶段的效果,当脚本没有发生改变时可以重用之前的效果。
在越大的项目中设置阶段缓存的收益越大,module比力多的项目大概每次实验都要先设置20到30秒,尤其是增量编译时,设置的耗时大概都跟实验的耗时差不多了,而这正是configuration-cache的用武之地。
目前Configuration-cache照旧实验特性,假如你想要开启的话可以在gradle.properties中添加以下代码:
# configuration cacheorg.gradle.unsafe.configuration-cache=trueorg.gradle.unsafe.configuration-cache-problems=warn3.实验速率优化


  • 开启并行编译
开启后会并行实验多个使命,大幅度淘汰编译时间,只需要在gradle.properties中添加:
org.gradle.parallel=true

  • 增大编译内存
由于各人的电脑设置都不一样,因此详细设置多大内存需要根据个情面况举行公道设置,一样平常在gradle.properties里已经有相干设置,可以对该设置举行修改,比方
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8同时在主工程模块的build.gradle中举行修改:
    dexOptions {        javaMaxHeapSize "4g"    }

  • 开启按需构建
对没有更改的模块不再举行编译,非常适合已经组件化的项目,在gradle.properties中添加:
org.gradle.configureondemand=true

  • 开启构建缓存
直接利用之前天生的缓存,不再举行构建,在构建时使命背面会表现FROM CACHE,在gradle.properties中添加:
org.gradle.caching=true

  • 开启增量注解编译
支持注解增量编译,不会重新触发编译(gradle高版本中需要移除),在gradle.properties中添加:
android.enableSeparateAnnotationProcessing=true4.其他速率优化


  • 对AS举行设置
开启离线模式
开启离线模式后不会再开始的时间去检测依赖是否有更新,也不会去下载相干更新的依赖,初次构建不能开启,否则无法完成构建,后续构建可以开启,在某些环境下将大幅度改善编译速率,猛烈保举开辟阶段利用。点击下图中的图标的按钮即可开启离线模式,有些版本表现为雷同wifi的图标,再次点击取消离线模式:

1.png

  • 更改AS内存巨细
点击AS的Help菜单项,选中Change Memory Settings选项。



  • KAPT 迁徙到 KSP
注解处置惩罚器是Android开辟中一种常用的技能,许多常用的框架比如ButterKnife,ARouter,Glide中都利用到了注解处置惩罚器相干技能。
但是假如项目比力大的话,会很轻易发现KAPT是拖慢编译速率的常见缘故原由,这也是谷歌推出KSP取代KAPT的缘故原由。


  • 关闭R文件转达
在 apk 打包的过程中,module 中的 R 文件接纳对依赖库的R举行累计叠加的方式天生。假如我们的 app 架构如下:
编译打包时每个模块天生的R文件如下:
1. R_lib1 = R_lib1;2. R_lib2 = R_lib2;3. R_lib3 = R_lib3;4. R_biz1 = R_lib1 + R_lib2 + R_lib3 + R_biz1(biz1自己的R)5. R_biz2 = R_lib2 + R_lib3 + R_biz2(biz2自己的R)6. R_app = R_lib1 + R_lib2 + R_lib3 + R_biz1 + R_biz2 + R_app(app自己R)1.关闭R文件转达可以通过编译克制的方式得到更快的编译速率
2.关闭R文件转达有助于确保每个模块的R类仅包罗对其自身资源的引用,克制偶尔中引用其他模块资源,明白模块界限。
3.关闭R文件转达也可以淘汰很大一部门包体积与dex数量
从 Android Studio Bumblebee 开始,新项目的非转达 R 类默认处于开启状态。即gradle.properties文件中都开启了如下标记
android.nonTransitiveRClass=true

  • 开启Kotlin跨模块增量编译
利用组件化多模块开辟的同砚都有履历,当我们修改底层模块(比如util模块)时,全部依赖于这个模块的上层模块都需要重新编译,Kotlin的增量编译在这种环境通常是不见效的,这种时间的编译通常非常耗时。
在Kotlin 1.7.0中,Kotlin编译器对于跨模块增量编译也做了支持,而且与Gradle构建缓存兼容,对编译克制的支持也得到了改进。这些改进淘汰了模块和文件重新编译的次数,让整体编译更加敏捷。
在 gradle.properties 文件中设置以下选项即可利用新方式举行增量编译:
kotlin.incremental.useClasspathSnapshot=true // 开启跨模块增量编译kotlin.build.report.output=file // 可选,启用构建报告

  • Module源码转aar
随着业务量的增大,module的引入也会增多,每个module在编译的时间都需要泯灭肯定的时间。把module转化成aar后就不再需要每次都举行编译大概取缓存,可以淘汰一部门时间。
参考:
https://mp.weixin.qq.com/s/q1zIhtTXvKubhg3HOG7T0Q
https://blog.csdn.net/Nbin_Newby/article/details/120439965
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-11-24 16:02, Processed in 0.173578 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表