加速 gradle 编译之屏蔽部分 Task | 掘金技术征文

4,061 阅读3分钟

灵感来源

首先祝大家圣诞快乐! :smile: :+1:

该篇博客灵感来自之前的一片博客:

Android Studio clean 时产生 Error:Execution failed for task ':app:mockableAndroidJar' > java.lang.NullPointerException (no error message)

和一个神库的issue:

android-hidden-api#21

首先简单介绍下这个神库——android-hidden-api: 可以让你使用安卓系统中 internal/hidden 的方法。

比如, Activity 里有一个@hide的方法:

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}

没用该库之前引用这个方法会报找不到该方法:

isResumed

但是使用该库后, 编译正常:

isResumed internal

编译通过了, 实际运行怎么样呢, 该方法可运行正常, 但是不保证所有系统, 同时也不能保证所有内部方法可运行。裤子不错, 不要贪用哦, 要多测试, 并加入异常处理。

详细使用可参考鸿神之前的文章:

Android 轻松的查看与使用hide与internal API

加速gradle编译

1 常用的加速方法, 大家可能都配置好了, 主要下面几个:

  • 开启gradle单独的守护进程
    在gradle.properties文件中输入如下代码:
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true

当然,上面的这些参数也可以配置到前面的用户目录下的gradle.properties文件里,那样就不是针对一个项目生效,而是针对所有项目生效。
gradle.properties配置文件主要就是增大gradle运行的java虚拟机的大小,让gradle在编译的时候使用独立进程,让gradle可以平行的运行。

  • 申请大内存

as安装目录/bin/studio64.vmoptions or studio.vmoptions(linux下,其他系统找类似文件)
使用文本编辑器打开,找到起始两行,如下
-Xms128m
-Xmx750m

修改最小值和最大值,建议为
-Xms256m
-Xmx2048m

  • incremental dex
    改变incremental dexing的值,这是一个实验的功能并且默认是关闭的。打开这个开关有可能会导致构建失败,错误信息类似jdk finished with non-zero exit value 2
    (尤其是在连续运行的时候),但我还是推荐你尝试一下,看看它是否对你有用。

在主APP模块的build.gradle文件中,添加下面的代码:

dexOptions {
    incremental true
}

2 屏蔽部分Task

我们知道, 编译的时候, 是有很多Task运行的, 可在右侧 gradle 标签下看到:

gradle tasks

当我们正常编译的时候, 这些Task都是会运行的, 我们看下编译log:

gradle uptodate

很多Task后面都有 UP-TO-DATE也就是Task已是最新, 这些基本不耗时, 其他都耗时, 项目大, 同时依赖多个库, 那么慢是正常的了...

下面, 哦,,, 没错, 就是下面,

屏蔽不需要的Task, 比如一些测试Task, 中间含有Test的一些Task, 把这些屏蔽掉:

在项目的根build.gradle脚本里添加屏蔽Task的代码:

allprojects {
    repositories {
        jcenter()
    }

    //skip Test tasks
    gradle.taskGraph.whenReady {
        tasks.each { task ->
            if (task.name.contains("Test"))
            {
                task.enabled = false
            }
        }
    }

}

这样sync, 编译, 见证奇迹的时刻:

task skipped

Oh, 圣诞快乐 :smile: 没错, 好多Task后面被标记了SKIPPED, 那这些Task都被无情的忽视了, 酸爽。

当然还可以屏蔽掉其他Task, 欢迎讨论。编译时间的提升效果还是很明显的, 项目越大越明显。

到这里就差不多了, 当然, 网上还有很多加速编译的方法, 最好用的还是阿里的

秒级编译工具freeline

这个还没使用的, 赶紧用起来, 赶紧用起来, 赶紧用起来, 不解释。

到这里该说再见了, 有任何问题欢迎评论, 感谢您的阅读, 圣诞快乐!

掘金技术征文:
juejin.cn/post/684490…