你的安卓项目编译要花10分钟,如何缩短到1分钟吗?

  

痛点
如果项目的代码库较大,例如大型的安卓开发项目,在构建的时候耗时较长,达到数十分钟甚至更长,分析其原因,其中一部分时间是花在构建上。在大规模开发团队中,例如上百人的开发团队,如果每个人构建一次需要花费数十分钟,那么团队每天浪费的时间是非常惊人的。
除了构建时间,执行Gradle构建的时候很大一部分时间是花在单元测试用例的执行上,这样的问题也困扰着大规模Gradle的用户。

  

方案
为了让构建提升速度,Gradle 4.0以上版本提供了构建缓存的功能,也就是构建缓存。注意,这里的构建指的不是构建产出物,例如战争,jar文件,而是Java构建的字节码. class文件。通过缓存每次构建产生的。Java类文件,实现项目的增量编译.Gradle项目能够在第一次构建之后,创建一个键-值的键值对数据,将每个。类文件通过一个关键索引起来。而这些键值对以及。类文件会上传到一个中央服务器(例如Nginx或者JFrog Artifactory),当用户再次构建,或者其他成员构建时,会先将中央服务器的缓存文件下载到本地,再进行打包,这样就能大大减少编译构建时间,实现增量编译。

  

注意,这里不仅仅能够缓存软件程序的。类文件,对应单元测试用例编译产生的。类文件同样能够缓存。

  

这里以开源版Artifactory为例,结合Gradle实现增量编译:
蹦愕陌沧肯钅勘嘁胍?0分钟,如何缩短到1分钟?

  

?创建一个示例项目“gradle-cache-example”
在这个Java工程里只需要创建一些普通的Java类即可,后面我们将验证如何将这段代码对应的类缓存起来,节约构建时间。
为设置构建缓存前执行构建:。/gradlew清洁构建
构建成功11 s
13可操作的任务:12执行,1最新的

  

可以看到构建耗时12秒。

  

?在本地搭建开源版Artifactory作为构建缓存中央服务器。搭建开源版Artifactory最方便的方式是用容器启动:

  

码头工人运行——名称artifactory - d - p 8081:8081 docker.bintray.io/jfrog/artifactory-oss:最新

  

?设置构建缓存
在开发本地的工程文件中的它。属性中设置如下配置,将构建缓存指向Artifactory。

  

gradle.properties
artifactory_user密码=admin
artifactory_password=
artifactory_url=http://localhost: 8081/artifactory
org.gradle.caching=true
gradle.cache.push=false

  

设置CI服务器上的设置。gradle,下面是詹金斯的脚本:
包括“shared",“api",“服务:webservice"
ext。isPush=getProperty (gradle.cache.push)
buildCache {
本地{
=false启用
}
远程(HttpBuildCache) {
url=? {artifactory_url}/gradle-cache-example/?br/>凭证{
用户名=? {artifactory_user}“
密码=? {artifactory_password}“
}
推=isPush
}
}

  

在CI服务器上执行。/gradlew清洁构建-Pgradle.cache.push=true。通过设置gradle.cache。推动=true,实现本地构建缓存向中央服务器的推送。
构建成功的在1 s
13可操作的任务:执行7,从缓存中,5 1最新
可以看到构建时间从12秒缩短到1秒,其中5个任务是来自缓存。

  

来确认下我们的构建加速并不是来自本地缓存,可以查看Artifactory的访问日志:

  

| 20170526153341 | 3 |请求127.0.0.1管理| | |/gradle-cache-example/6 dc9bb4c16381e32ca1f600b3060616f HTTP/1.1 | 200 | 1146 |
| 20170526153341 | 4 |请求127.0.0.1管理| | |/gradle-cache-example/e5a67dca52dfaea60efd28654eb8ec97 HTTP/1.1 | 200 | 1296 |

  

可以看到本地缓存,均来自Artifactory的统一仓库。

  

?跨部门,地域共享构建缓存

  

在大型分布式研发团队里,构建环境往往分布在各个地域,例如北京,上海。在这种情况下,构建缓存上传到本地的Artifactory之后,并不能够被远程的构建服务器使用。这是需要用到Artifactory企业版的文件实时复制功能实现。
蹦愕陌沧肯钅勘嘁胍?0分钟,如何缩短到1分钟?

  

如上图所示:当本地开发者或者CI服务器执行第一次构建时,Artifactory会通过将复制(推送复制)的方式将本地的缓存推送到远程的Artifactory,当远程的用户在执行Gradle构建时,能够受益于已有的构建缓存,从而大大加速构建的速度。

  

总结
本文展示并说明了如何使用Gradle和Artifactory开源版进行构建缓存的实现,提升构建速度。使用Artifactory企业版,能够实现跨地域的构建缓存共享,优化公司级别的构建速度。

你的安卓项目编译要花10分钟,如何缩短到1分钟吗?