parent
6cbefaae7f
commit
6e6883bff3
@ -0,0 +1,100 @@ |
|||||||
|
--- |
||||||
|
Gradle 构建速度优化 |
||||||
|
--- |
||||||
|
|
||||||
|
#### 前言 |
||||||
|
|
||||||
|
Gradle 构建分为三个过程,Initialization 、Configuration 和 Execution 阶段。通常来说,Initialization 都很少,下面主要是针对 Configuration 和 Execution 这两个阶段的优化。 |
||||||
|
|
||||||
|
#### Configuration |
||||||
|
|
||||||
|
##### 避免使用动态(Dynamic)或者快照(SNAPSHOT)版本 |
||||||
|
|
||||||
|
当我们使用某个版本的依赖时,推荐写死一个固定的版本,例如 1.0.0。这种方式下 Gradle 会从相关的 repo 下载依赖并缓存,后续再有引用该依赖的地方都可以从缓存里面读取,避免缓慢的网络下载。 |
||||||
|
|
||||||
|
除了上述固定版本以外,Gradle 还支持两种版本格式:动态版本和快照版本。 |
||||||
|
|
||||||
|
动态版本是类似于 1.0.+ 这种,用 + 替代具体版本的声明方式,快照版本是类似 1.0.0-SNAPSHOT 这种。这两种版本引用都会迫使 Gradle 链接远程仓库检查是否有更新的依赖可用,如果有则下载后缓存到本地,默认情况下,这种缓存有效期是 24 小时,当然也可以调整有效期。 |
||||||
|
|
||||||
|
##### 调整 repo 顺序并过滤 aar 请求 |
||||||
|
|
||||||
|
Gradle 在查找远程依赖的时候,会串行查询所有 repo 中的 maven 地址,直到找到可用的 aar 后下载,因此把最快和最高命中率的仓库放在前面,会有效减少 configuration 阶段所需的时间。 |
||||||
|
|
||||||
|
除了顺序以外,并不是所有的仓库都提供所有的依赖,尤其是有些公司会将业务 aar 放在内部搭建的仓库上,这种情况下如果盲目增加 repository 会让 Configuration 时间变得难以接受。通常我们需要将内部仓库放在前面,同时明确指定哪些依赖可以去这里下载。 |
||||||
|
|
||||||
|
```java |
||||||
|
repositories { |
||||||
|
maven { |
||||||
|
url = uri("http://repo.mycompany.com/maven2") |
||||||
|
content { |
||||||
|
includeGroup("com.google") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
jcenter() |
||||||
|
... |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
##### 减少不必要的 Plugin |
||||||
|
|
||||||
|
应用到项目中的每个插件和脚本都会增加 Configuration 阶段的执行时间。 |
||||||
|
|
||||||
|
##### 使用 implementation 方法依赖 |
||||||
|
|
||||||
|
implementation 阻止依赖传递,避免每次改动一处就要全量编译。 |
||||||
|
|
||||||
|
#### Execution 优化 |
||||||
|
|
||||||
|
##### 使用 build cache |
||||||
|
|
||||||
|
类似增量编译,Gradle Cache 可以把之前构建过得 task 结果缓存起来,一旦后面需要执行该 task 的时候直接使用缓存结果,与增量编译不同的是,cache 是全局的,对所有构建都生效。此外,cache 既可以保存在本地,又可以使用网络路径。 |
||||||
|
|
||||||
|
##### 配置缓存服务器 |
||||||
|
|
||||||
|
##### 跳过不需要执行的 Task |
||||||
|
|
||||||
|
命令行中使用 -x 跳过不需要的 task,例如: |
||||||
|
|
||||||
|
```terminal |
||||||
|
// --console=verbose 可以输出所有执行的 task |
||||||
|
./gradlew build --console=verbose -x lint -x test |
||||||
|
``` |
||||||
|
|
||||||
|
#### Android 构建优化 |
||||||
|
|
||||||
|
除了上述的 Gradle 的通用优化之外,下面开始介绍针对 Android 的优化。 |
||||||
|
|
||||||
|
##### 关闭 APK split |
||||||
|
|
||||||
|
对于日常开发调试而言,我们通常不需要构建多架构或者多尺寸的 apk,因此可以使用某个标记来区别调试构建和正式构建。 |
||||||
|
|
||||||
|
首先在 AS 增加一个标记 -PdevBuild,然后: |
||||||
|
|
||||||
|
```kotlin |
||||||
|
android { |
||||||
|
.... |
||||||
|
if (project.hasProperty("devBuild")) { |
||||||
|
splits.abi.isEnable = false; |
||||||
|
splits.density.isEnable = false; |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
##### 关闭 aapt 自带的 png 压缩 |
||||||
|
|
||||||
|
在 Android 编译过程中,aapt 默认会对 png 图片进行压缩。可以去掉该功能来提高编译速度: |
||||||
|
|
||||||
|
```kotlin |
||||||
|
android { |
||||||
|
.... |
||||||
|
if (project.hasProperty("devBuild")) { |
||||||
|
.... |
||||||
|
aaptOptions.cruncherEnabled = false |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
##### 避免 Android Manifest 改动 |
||||||
|
|
||||||
|
避免 AndroidManifest 里面的字段进行动态化设置。 |
Loading…
Reference in new issue