汇总:Android小白成长之路_知识体系汇总【持续更新中…】
目录
问题背景
公司项目使用Android Studio以及Gradle进行编译,在每次修改代码(哪怕是一行修改),再次编译运行都要耗时三四分钟,甚至更长时间。在初次编译时更是长达十几分钟、极大的影响了开发效率。俗话说工欲善其事,必先利其器。这就对编译速度进行一波优化,让我们一步一步开始吧!
Gradle构建流程
首先了解一下Gradle的构建流程,整体分为三个阶段:
- 初始化阶段:Gradle支持单项目和多项目构建,在初始化阶段,Gradle从
setting.gradle
中读取需要参与构建的模块,并为每个模块创建一个Project实例。 - 配置阶段:配置项目模块和其所需要执行的脚本,也就是
build.gradle
等文件 - 执行阶段:开始执行配置后的脚本任务
大体上了解了这些流程,我们就可以从这些流程上入手进行优化
优化前相关说明
当前作为验证的电脑相关信息:
- 电脑名称:MacBook Pro
- 系统:Mac
- 内存:8GB 1867MHz DDR3
- 处理器:双核Intel Core i5 2.7GHz
- AS版本:4.1.1
验证编译速度的三个角度:
- rebuild全工程,全部编译
- 新增一个方法,触发java重新编译
- 修改一个xml,触发资源重新编译
比较数据获取方式:rebuild尝试三次取最低值,修改方法或xml尝试五次取最低值
相关说明:
- 由于电脑有时候卡顿或者别的原因影响编译,会使得某次编译耗时很长,因此不能取平均值作为参考
- 编译一般会一次比一次快,因为Android studio自带缓存
- 开发阶段本身就不会一直改配置,因此取最小值基本可以模拟日常使用情况
- 因为主工程模块比较庞大,因此验证时使用的是主工程模块的代码,如果修改的是组件代码,用时一般会更少
- 每一次数据统计使用的方案继承了它前面所有的优化方案
- 修改方法和xml用apply changes
优化方案
从整体构建流程可以得知,我们整体上需要从三个方面进行优化:
- 初始化速度优化
- 配置速度优化
- 执行速度优化
其中执行的过程占比是最大的,所以重心放在执行速度优化上
初始化速度优化
一般初始化过程任务较少本身就已经很快了,但仍然可以做一些处理,以达到最佳状态:
- 当组件化程度较高时,在开发某个特定功能过程中有些组件是不需要引入的,此时可以在
setting.gradle
中移除不需要引入的组件模块,可以减少初始化时间 setting.gradle
中include之前尽量不写过多代码
配置速度优化
配置阶段主要是对各个build.gradle
进行解析,因此可以注意以下几点:
- 按需引入模块,减少
build.gradle
的解析 build.gradle
中尽量少做耗时操作,例如读取系统时间动态配置apk的名称组成- 在开发阶段不是必要执行的任务,可以写判断避免这些任务的配置,例如一些字节码插桩,性能监控之类的
执行速度优化
此阶段存在的大量的任务需要执行,因此优化的点也非常的多
对Gradle进行配置
开启并行编译
开启后会并行执行多个任务,大幅度减少编译时间,只需要在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"
}
值得注意的是,javaMaxHeapSize
的值需要比org.gradle.jvmargs
设置的值少512m
以上,而且org.gradle.jvmargs
的值并不是设置越高越好,根据验证,最好配置为系统内存的1/3,最多不要超过1/2。在部分文档中显示,高版本中javaMaxHeapSize
中不再需要配置javaMaxHeapSize
,只需要配置org.gradle.jvmargs
即可,查阅了许多资料都没说清楚,所以暂时都配置好了
开启按需构建
对没有更改的模块不再进行编译,非常适合已经组件化的项目,在gradle.properties
中添加:
org.gradle.configureondemand=true
开启构建缓存
直接使用之前生成的缓存,不再进行构建,在构建时任务后面会显示FROM CACHE
,在gradle.properties
中添加:
org.gradle.caching=true
开启增量注解编译
支持注解增量编译,不会重新触发编译(gradle高版本中需要移除),在gradle.properties
中添加:
android.enableSeparateAnnotationProcessing=true
数据对比(并行编译是优化前已经开启,因此以下时间不包括并行编译的优化):
rebuild | 修改方法 | 修改xml | |
---|---|---|---|
配置优化前 | 4m46s | 46s | 22s |
配置优化后 | 2m39s | 42s | 20s |
收益 | 减少44% | 减少8% | 减少9% |
对AS进行配置
开启离线模式
开启离线模式后不会再开始的时候去检测依赖是否有更新,也不会去下载相关更新的依赖,首次构建不能开启,否则无法完成构建,后续构建可以开启,在某些情况下将大幅度改善编译速度,强烈推荐开发阶段使用。点击下图中的图标的按钮即可开启离线模式,有些版本显示为类似wifi的图标,再次点击取消离线模式:
更改AS内存大小
点击AS的Help
菜单项,选中Change Memory Settings
选项。如图:
弹出如下图弹框,把Maxinum Heap Size
修改为合适值,具体修改值根据自身电脑内存配置选择
数据对比:
rebuild | 修改方法 | 修改xml | |
---|---|---|---|
AS配置修改前 | 2m39s | 42s | 20s |
AS配置修改后 | 2m16s | 37s | 16s |
收益 | 减少14% | 减少11% | 减少20% |
更新最新Gradle版本
由于gradle在新版本中一般都会对构建速度进行进一步的优化,因此保持最新的gradle版本可以获得最佳的构建体验,更新方式如下:
-
首先在
gradle-wrapper.properties
中进行gradle版本的配置:distributionUrl=https\:``//services.gradle.org/distributions/gradle-6.7.1-all.zip
-
然后在根目录下的
build.gradle
中更新gradle插件版本:classpath 'com.android.tools.build:gradle:4.1.1'
更新到6.x以上可能出现的问题和解决方案:
-
报异常:
FAILURE: Build failed with an exception. * What went wrong: A problem occurred configuring project ':live'. > Failed to notify project evaluation listener. > org.gradle.api.tasks.TaskInputs.property(Ljava/lang/String;Ljava/lang/Object;)