转载

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

关注世界领先 DevOps 平台 JFrog

痛点

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

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

如果项目的代码库较大,例如大型的安卓开发项目,在构建的时候耗时较长,达到数十分钟甚至更长,分析其原因,其中一部分时间是花在构建上。在大规模开发团队中,例如上百人的开发团队,如果每个人构建一次需要花费数十分钟,那么团队每天浪费的时间是非常惊人的。

除了构建时间,执行 Gradle Build 的时候很大一部分时间是花在单元测试用例的执行上,这样的问题也困扰着大规模 Gradle 的用户。

方案

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

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

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

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

这里以开源版 Artifactory 为例,结合 Gradle 实现增量编译:

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

·  创建一个示例项目 gradle-cache-example

在这个 Java 工程里只需要创建一些普通的 Java 类即可,后面我们将验证如何将这段代码对应的 class 缓存起来,节约构建时间。

为设置构建缓存前执行构建: ./gradlew clean build

BUILD SUCCESSFUL in 11s

13 actionable tasks: 12 executed, 1 up-to-date

可以看到构建耗时 12 秒。

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

docker run --name artifactory -d -p 8081:8081 docker.bintray.io/jfrog/artifactory-oss:latest

·  设置构建缓存

在开发本地的工程文件中的 gradle.properties中设置如下配置,将构建缓存指向 Artifactory。

gradle.properties

artifactory_user=admin

artifactory_password=password

artifactory_url=http://localhost:8081/artifactory

org.gradle.caching=true

gradle.cache.push=false

设置  CI 服务器上的 settings.gradle ,下面是  Jenkins 的脚本

include "shared", "api", "services:webservice"

ext.isPush = getProperty('gradle.cache.push')

buildCache {

local {

enabled = false

}

remote(HttpBuildCache) {

url = "${artifactory_url}/gradle-cache-example/"

credentials {

username = "${artifactory_user}"

password = "${artifactory_password}"

}

push = isPush

}

}

在CI 服务器上执行 ./gradlew clean build -Pgradle.cache.push=true。通过设置gradle.cache.push=true,实现本地构建缓存向中央服务器的推送。

BUILD SUCCESSFUL in 1s

13 actionable tasks: 7 executed, 5 from cache, 1 up-to-date

可以看到构建时间从 12 秒缩短到 1 秒,其中 5 个任务是来自缓存。

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

20170526153341|3|REQUEST|127.0.0.1|admin|GET|/gradle-cache-example/6dc9bb4c16381e32ca1f600b3060616f|HTTP/1.1|200|1146

20170526153341|4|REQUEST|127.0.0.1|admin|GET|/gradle-cache-example/e5a67dca52dfaea60efd28654eb8ec97|HTTP/1.1|200|1296

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

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

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

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

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

总结

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

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

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

下载 JFrog Artifactory 企业版(免费试用):https://www.jfrogchina.com/artifactory/free-trial/

下载 JFrog Artifactory 开源版(代替 Nexus):

http://www.jfrogchina.com/open-source/

想了解更多国内外 DevOps 实战案例,扫描下方二维码关注“ JFrog杰蛙DevOps ”公众号,在后台回复“ devops ”,即可免费获取DevOPs入门到精通实战视频及PPT学习资料。

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

长按二维码关注

原文  http://mp.weixin.qq.com/s?__biz=MzIwMzc4NDY4Mw==&mid=2247487877&idx=1&sn=4f74a9c5e31300c9705be50830e33e3a
正文到此结束
Loading...