Android构建速度优化总结分享

Posted Beason_H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android构建速度优化总结分享相关的知识,希望对你有一定的参考价值。

​ 随着没我们的项目不断地增大,模块化、组件化,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 *//开启kotlin并行编译*

优化kapt

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

开启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 主界面:

以上是关于Android构建速度优化总结分享的主要内容,如果未能解决你的问题,请参考以下文章

爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结

2020-2021最新Android性能优化总结附:1586页PDF分享

2021Android性能优化总结最新最全面最完整的资料+实战经验分享

Vue项目Webpack优化实践,构建效率提高50%

组件库webpack构建速度优化经验总结

Android 优化APP 构建速度的17条建议