gradle|Android构建速度优化总结分享
? 随着没我们的项目不断地增大,模块化、组件化,APT技术的盛行,导致module拆分过多,多module情况下很容易出现依赖关系混乱、过度依赖等问题,致使构建速度越来越慢。
? 本文针对自己的实际项目经验总结了一些提升一些Android构建速度的方法:
开启Gradle Daemon
Gradle 守护进程是一个后台进程, 它运行着繁重的构建, 然后在构建等待下一次构建的之间保持自身存在. 这使得数据和代码在下一次构建前已经准备好,并存入内存中。这显著的提高了后续构建的性能. 启用Gradle守护进程是一种节约构建时间的廉价方式。开启并行编译
强烈建议在所有开发机器上启用Gradle的守护进程。但是不推荐在持续集成和构建服务器环境下启用守护进程
Gradle自动管理守护进程.如果构建环境配置为利用后台程序,如果在没有可用守护进程,就会自动启动一个守护进程,或者使用现有的空闲的兼容守护进程.如果一个守护进程在3个小时内没有使用,它将会自我终结.一旦配置开发环境为使用的守护进程,守护进程通常是隐形的,容易被遗忘的.
task默认是串行执行,开启并行执行提高构建速度调整java堆大小org.gradle.parallel=true
(在项目根目录gradle.properties文件中声明)
gradle默认为构建预留1G的堆空间,但对于一个相对较大的app来说还远远不够,可通过开启build缓存org.gradle.jvmargs=-Xmx4096M
(在项目根目录gradle.properties文件中声明)配置动态调整,可根据自身设备配置来进行调整。
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加入这样一句来开启减少编译脚本中的I/O操作org.gradle.configureondemand=true
有时候,编译脚本中会有一些代码做动态配置信息的获取,很多时候其实不需要每次搜需要去获取,可以使用缓存或者使用脚本控制与打包机进行区分,日常开发调试是不需要实时获取配置信息开启kotlin的增量和并行编译 如果项目开发过程中有部分模块使用到了kotlin我们需要对其编译进行优化
优化kaptkotlin.incremental=true kotlin.incremental.java=true kotlin.incremental.js=true kotlin.caching.enabled=true kotlin.parallel.tasks.in.project=true *//开启kotlin并行编译*
开启KAPT 编译缓存 在项目的app目录中的build.gradle文件中修改kapt.use.worker.api=true//并行运行kapt1.2.60版本以上支持 kapt.incremental.apt=true//增量编译 kapt1.3.30版本以上支持 //kapt avoiding 如果用kapt依赖的内容没有变化,会完全重用编译内容,省掉最上图中的:app:kaptGenerateStubsDebugKotlin的时间 kapt.include.compile.classpath=false
手动配置maxProcessCount 在项目的app目录中的build.gradle文件中修改kapt {useBuildCache = true javacOptions {option("-Xmaxerrs", 500) } }
合理的apply插件android {dexOptions {preDexLibraries true maxProcessCount 8 } }
应用的插件到底是全局的还是局部的。Build Scans工具介绍
应该配置到合理的位置,allprojects {} or subprojects {},不必要的插件不要apply。
我们在进行优化的时候,主要监测工具可以使用Build Scans,Build Scans是用于开发和维护Gradle构建的重要工具。它为你提供了构建的详细信息,并为你识别构建环境、依赖或性能上存在的问题,同时可以帮你更全面地理解并提升构建过程,也便于与他人的合作。【gradle|Android构建速度优化总结分享】build scans 主界面:
在Gradle构建运行时,Build Scans插件会抓取数据,并将数据传送到Build Scans服务端。同时返回一个可被共享的链接,内部包含有用的构建信息。这些信息包含两大类:*(1)环境信息,包括操作系统、Java版本和时区;(2)构建相关信息,包含使用的插件、任务、测试以及依赖信息。
文章图片
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备