Android Gradle 提速实战

2,362 阅读4分钟

一、官方建议

官方建议在这里,大部分都是常规操作,下面简单列举下:

  1. 使用最新的 Android Gradle 插件

    常规操作。

  2. 避免激活旧的 Multidex

    常规操作,2.3 之后的 Android Studio 会自动规避。

  3. 禁用 Multiple APK 构建

    国内一般都没有开启。

  4. 最小化打包资源文件

    收效甚微,也许有个 1、2s 吧。

  5. 禁用 PNG 压缩 常规操作。

  6. 使用 Apply Change

    3.5 中新增,下面细说。

  7. 避免被动的改动

    不轻易改变清单文件的内容,常规操作。

  8. 不使用动态版本标识

    容易忽略的点,下面细说。

  9. Gradle 内存分配调优

    常规操作。

  10. 开启 Gradle 构建缓存

    下面细说。

二、build cache

build cache 就是构建缓存。

可以通过在命令行里加入 --build-cache 参数或者在工程根目录的 gradle.properties 里加入 org.gradle.caching=true 来启用该功能。

但启用后,我并没有看到什么效果。

通过 build scan(下面会说)查看,发现 cache 都 miss 了,没有命中,所以速度没有改变。

在这里插入图片描述
这才想到 cache 的含义,先存再用。我都没存下来,当然不会有复用,也就没有加速了。

假设代码的状态变化是 A-B-AA-B 阶段的 build-cache 没有作用,但 B-A 时,就有用了,亲测能省 20s 左右的时间。

在这里插入图片描述

三、parallel

parallel 也是 Gradle 的一个属性,可以进行并行构建。

Android Studio 中默认是打开的:

在这里插入图片描述
命令行中,可以添加 --parallel 来打开:

gradlew assembleDebug --parallel

不带 --parallel 时,项目的构建时间在 23s-1m40s 之间徘徊。

带了 --parallel 时,项目的构建时间一直稳定在 23s 左右。

(这里的构建指的是完全不改代码,重复构建)

四、动态版本

一般项目中都不会有明显的动态版本引入,但有两种情况比较容易忽略:

  • 引用的 A 库是固定版本,但 A 库又引用了动态版本的 B 库。
  • 引用的 C 库的 Gradle 插件,在执行时自己添加了动态版本的 D 库。

我就曾经遇到过这样的问题

五、build scan

build scan 是 Gradle 提供的一个分析构建的工具。

它的使用很简单,命令行中添加 --scan 即可,如

gradlew assembleDebug --scan --parallel

当我查看项目生成的报告,发现每次构建有一个 task 都会执行:tinkerProcessDebugResourceId

在这里插入图片描述
这个 task 执行一次约 20s,看名字,是项目内集成的 tinker 插件所需要的 task。这在热修复中有用,但在日常的其他功能开发、测试工作中,并不需要这些功能。

于是我通过以下设置,跳过这个 task。

afterEvaluate {
    tinkerProcessDebugResourceId.onlyIf { project.hasProperty('withTinker')}
}

跳过之后,神奇的事情发生了,打包速度得到了明显提升:

跳过前 跳过后
跳过后完全不修改,再次打包 23s 2s
修改代码(新增一个空行),再次打包 1m35s 1m10s
修改 xml(新增一个空行),再次打包 26s 4s

六、Apply Change

Android Studio 3.5 中取消了 Instant Run,新增了 Apply Change,可以在 Android 8.0 及以上的机型执行。

Android Studio 原本的 Run 按钮旁边就是 Apply Change 的两个按钮,依次是:Apply Code Changes 和 Apply Changes and Restart Activity。

在这里插入图片描述
它们都不会影响编译时间,但减少了安装、进入目标页面的时间。

6.1 Apply Code Changes

功能

修改之后后直接应用到现有界面上,完全无痕替换,体验感非常好。

限制

它只能在修改代码时使用,修改资源不能使用。

下面是修改代码的一些测试:

  • 删除几行代码,可以
  • 添加 log,可以
  • 改变 setText() 的内容,可以
  • 添加 Toast,不行
    在这里插入图片描述
  • setOnClickListener,不行
    在这里插入图片描述
  • 删除一个方法,不行
    在这里插入图片描述

6.2 Apply Changes and Restart Activity

功能

修改之后,不用重启应用,而是重启 Activity。 即 Activity 被杀死后重新启动,经过 onSaveInstanceState、onDestroy、onCreate、onRestoreInstanceState......这样可以免去冗余的页面路径,比如需要改一个内页,就可以直接跳过开屏广告等烦人的步骤。

限制

它只比 Apply Code Changes 多了支持资源修改的功能,Apply Code Changes 不支持的代码修改它也不支持。