Gradle 构建速度优化

来源:互联网 发布:国家护理质量数据 编辑:程序博客网 时间:2024/06/05 10:07
     构建速度优化

        AS编译太慢是我们经常吐槽的,我们该做些什么来加快编译的速度呢?前面我们简单的了解了gradle构建项目的流程。我们可以从以下几个方面来做:

注意AS配置:

        如及时更新Gradle和JDK版本、扩大AS内存等(修改-Xms256m)、取消AS的自更新设置,去除不经常使用的插件等。

慎重sub-module:

        减少sub-module或者将sub-module导成aar,并上传到私有的maven仓库就更加方便啦,每增加一个sub-module的构建的时间会增加很多。从根上解决这个问题,我们应该增加sub-module时要慎重,同时要考虑他的独立性,与主module要完全解耦。这样我们不会再开发的时候产品要换个ui图也跑到sub-module里边修改。当我们修改了sub-module的时候,编译器会检测到修改重新编译,然后copy到主工程的buid/intermediates/exploded-aar目录下。

守护进程daemon:

        当我们在gradle.properties中配置org.gradle.daemon=true的时候,相当于开了个进程,这样我们构建项目的许多工作比如加载虚拟机之类的就在该进程中完成。

并行编译parallel:

        这个适用于有多个依赖sub-module的情况下,如果单单只有一个module实测会耗时更多。看看官方的说法:When configured, Gradle will run in incubating parallel mode.This option should only be used with decoupled projects. org.gradle.parallel=true。这里通过增大gradle运行的java虚拟机大小,达到多个module并行构建的目的。

依赖库使用固定版本:

        我们配置依赖的时候 如依赖V4包,com.android.support:support-v4:23.0.0+,再后边有个+后表示依赖最新的,这样可以保证依赖的库有更新时能够得到更新。但是,小编并不建议这么做。因为每次构建都需要访问网络去判断是否有最新版本,这样也是需要耗时的。我们可能需要频繁的构建调试,但是我们一般很少更新库。当然,这些可以配置在你的release分支上,总之,调试的请配置固定版本吧。

去除无用的构建任务task:

        Gradle每次构建都执行了默认的许多task,其中部分task是我们不需要执行的,至少在调试的时候不需要,我们可以把这些屏蔽掉,方法如下:

    tasks.whenTaskAdded { task ->        if (task.name.contains('AndroidTest') || task.name.contains('Test')) {             task.enabled = false        }    }

巧用include:

        对于我们没有依赖的module,我们可以在settings.gradle里边去掉改module的include,建议写成一行只include一个module,如下:

    include:'lib1'    //include:'lib2'

        这样我们实际就只include了lib1,当我们sync或者build\clean的时候就没有lib2的事啦,这样解决时间。

减少构建过程中的I/O操作:I/O操作,如copy文件,访问git等,Debug版本配置的minSdkVersion 21+(builder faster)

Instant Run:

        注入依赖技术,不需要安装就可以达到更新apk的目的。 详细参考Instant Run: How Does it Work?!

最后还想说几点:

1、不仅仅只是快1mms:

        这里的每一项我都尝试配置使用过,实际测试基本可以解决个10多mms,当然也得看你的项目当然的状态,以及你编辑修改的东西。虽然解决下的时间不是很显眼,但是如果用百分数来看可以提高到20%的速度你就能感受到其中的价值啦,然后再乘以你编译的次数,绝对的节约时间。

2、组件化的优势:

        另外一点我曾在知乎上也回答过,尽量的模块化项目内容,对于一些功能特点我们都可以抽象成小组件在demo中调试完成,然后挪到工程里边。这样不仅丰富了自己的公共库,也提高了工作效率。

3、java调试或者说单元测试:

        对于纯java的业务(相信在model层里有很多都是)我们可以通过只运行java来调试,比如我最近在做单词的短语匹配算法,那么我在调试的时候再class里边写个main方法(很low的方案),仅调试算法部分就好,然后实际还是要使用单元测试更优。


0 0
原创粉丝点击