Create Gradle 构建速度优化.md

master
Omooo 4 years ago
parent 6cbefaae7f
commit 6e6883bff3
  1. 100
      blogs/Android/Gradle/Gradle 构建速度优化.md

@ -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…
Cancel
Save