文章目录
一、官方建议
官方建议在这里,大部分都是常规操作,下面简单列举下:
- 使用最新的 Android Gradle 插件
常规操作。 - 避免激活旧的 Multidex
常规操作,2.3 之后的 Android Studio 会自动规避。 - 禁用 Multiple APK 构建
国内一般都没有开启。 - 最小化打包资源文件
收效甚微,也许有个 1、2s 吧。 - 禁用 PNG 压缩
常规操作。 - 使用 Apply Change
3.5 中新增,下面细说。 - 避免被动的改动
不轻易改变清单文件的内容,常规操作。 - 不使用动态版本标识
容易忽略的点,下面细说。 - Gradle 内存分配调优
常规操作。 - 开启 Gradle 构建缓存
下面细说。
二、build cache
build cache 就是构建缓存。
可以通过在命令行里加入 --build-cache
参数或者在工程根目录的 gradle.properties
里加入 org.gradle.caching=true
来启用该功能。
但启用后,我并没有看到什么效果。
通过 build scan(下面会说)查看,发现 cache 都 miss 了,没有命中,所以速度没有改变。
这才想到 cache 的含义,先存再用。我都没存下来,当然不会有复用,也就没有加速了。
假设代码的状态变化是 A-B-A
,A-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 不支持的代码修改它也不支持。