编译 优化 源码-《干货分享》优化《AndroidStudio》编译速度的10个小方法

前言

Google最推荐的IDE是AndroidStudio; 用起来很聪明,但也有占用显存较多、运行速度很慢的缺点。 接下来说一下AndroidStudio的优化。

disable.android.first.run=true

或者:使用外部代理

编译 优化 源码-《干货分享》优化《AndroidStudio》编译速度的10个小方法

-Xms512m
-Xmx4096m
-XX:MaxPermSize=2048m
-XX:ReservedCodeCacheSize=1024m

# 编译时使用守护进程
org.gradle.daemon=true 
#JVM最大允许分配的堆内存,按需分配 
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m  -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
#使用并行编译
org.gradle.parallel=true  
org.gradle.configureondemand=true

Gradle 生命周期

我们先来说说gradle的生命周期。 gradle建立一个项目主要分为三个部分。

编译 优化 源码-《干货分享》优化《AndroidStudio》编译速度的10个小方法

初始化阶段:主要是解析setting.gradle文件(因此有人提到减少setting.gradle的模块数量,这是很合理的,而实际操作过程很有限,原因会在最后大致解释); 读取配置阶段:主要分析所有项目下的build.gradle文件,包括rootProject及其他子项目(子项目),检测句型,判断任务的依赖关系编译 优化 源码,完善任务的有向无环图,检测文件目录是否存在任务中引用的存在等(这一步也进一步验证了减少setting.gradle中的模块数量可以提高编译速度,因为减少一个模块会减少需要解析的build.gradle文件数量,并且该模块属于该模块的任务不会在步骤3.任务中执行,仍然是上面1中提到的问题,限制很少); 执行阶段:根据2中构建的有向无环图执行各个任务,而这一步基本上会占用整个编译过程90%以上的时间,特别是对于Android项目,将java转换为class

compileDebugJavaWithJavac/compileReleaseJavaWithJavac

并将类合并到dex中

   transformClassesWithDexForDebug/transformClassesWithDexForRelease

编译 优化 源码-《干货分享》优化《AndroidStudio》编译速度的10个小方法

这两步时间比较长,第一步还可以,但是第二步就需要很长时间了

明确了gradle的生命周期后,我们可以看出,提高编译速度的关键是从第三步开始。 其实减少setting.gradle中的模块数量也是有必要的。下面说一下我们公司的做法

对于项目插件重构,每个业务朋友只需要编译一个模块,基本解决了编译慢的问题(对于大多数不需要插件的同学,可以看下面的一些做法),首先, setting.gradle中的module只有自己开发的模块,执行阶段对应的任务也只是该模块的任务。 执行一次gradlebuild,我们都会发现,在这个过程中,虽然执行了多个打包任务编译 优化 源码,但在buildTypes中配置了多个编译打包类型。 默认有debug和release。 我们还可以自动配置其他类型,而productFlavor中有多个通道,这样就会进行多次编译打包,而正常的开发过程中,只需要打开debug包即可进行调试,所以可以使用gradleassembleDebug,并在版本发布时使用其他方式打开多渠道包。 由于主要的编译时间集中在gradle生命周期的第三步,即执行任务task,所以我们可以禁用一些不相关的任务,比如各种测试、各种类型的lint等,gradle中有这样的指令—— xlint可以暂时禁用lint任务,-xtest可以禁用测试任务,其实对于稍微大一点的项目,lint也是非常耗时的。 事实上,你可以通过gradle脚本完全禁用lint和test任务,而且不建议这样做,因为有时lint和test也很有用。 Gradle本身提供了一些命令参数可以促进编译,比如--daemon,启动守护进程,--parallel,启动并行编译等。这个也可以在gradle.propertites中配置(编译使用的jvm显存也可以这里配置)自定义gradle编译流程,借助官方API,可以定制适合自己的编译流程

里面提到的几点,现有的环境大致可以这样做(需要注意的是,如果项目中有交叉依赖,一定不要使用--parallel参数):

gradle assembleDebug --daemon --parallel -x lint -x test

,如果想直接在设备上安装,将assembleDebug替换为installDebug,assembleDebug可以简写为D,installDebug可以简写为iD。

最后说一下为什么减少setting.gradle中的模块数量确实可以促进编译,但是限制却很少? 首先我们来思考一下整个编译过程,首先分析gradle配置,构建任务依赖关系的有向图,然后执行各个模块的任务。 如果我们依赖maven,使用aar来替换模块(单指android库),如果我们要改变这个模块中的文件,那不是每次上传下载都要改一下,也许还可以吧,而且还有一个致命的问题:如果不更改版本号,SNAPSHOT在IDEA中往往无法工作。 这样改出来的东西就不会生效,而且要花很多时间才能解决这个问题。 不过有一个办法可以一定程度上解决这个问题,减少下面的脚本:

project.configurations.all(new Action() {
@Override
    void execute(Configuration files) {
        files.resolutionStrategy.cacheDynamicVersionsFor(5, TimeUnit.MINUTES)
        files.resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS)
    }
})

那么有人会问,在插件中,每个人开发一个模块,每个模块的维护都要打包上传到maven。 每次有改动,哪怕是很小的改动,都需要上传一次。 会遇到SNAPSHOT不起作用的问题

基本上AndroidStudio编译慢的问题到这里就结束了。 希望认真阅读的同学能够有所收获! 如有不妥之处还望见谅!

需要本文底层源码的朋友

可以私信发送“底层源码”或者“核心笔记”,获取完整代码以及更多Android学习笔记+源码解析+笔试视频

技术是无止境的。 你需要对你提交的每一行代码和你使用的每一个工具负责。 不断挖掘其底层原理,将你的技术升华到更高的层次

Android架构师之路还很长,勉励自己

PS:如有疑问请见谅,可以在评论区留下您的建议和经验;

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 编译 优化 源码-《干货分享》优化《AndroidStudio》编译速度的10个小方法 https://www.wkzy.net/game/152523.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务