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

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

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

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

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

?创建一个示例项目“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 企业版的文件实时复制功能实现。

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

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

原文地址:https://blog.51cto.com/jfrogchina/2433955

时间: 2024-10-13 20:05:51

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

在Hudson中,使用ant自动对安卓项目编译打包apk

本文对如何在hudson中配置ant编译打包apk进行说明,主要包括build.xml文件的编写.环境的配置.在Hudson中创建任务. 一.为安卓项目创建build.xml文件 1.打开cmd进入sdk目录下的tools目录,输入: android.bat list target  来查询我们现有的版本list有哪些.如下图: 途中用红框圈出的 id 与蓝框圈出的版本号对应关系,下面需要用到. 2.打开安卓项目工程下的 project.properties 文件,查看target 版本号,如下

Unity3D项目实战笔记(10):Unity3D编译IPA的PostEvents–节约时间利器

最近,SDK支付等接入差不多了,就从Unity3D生成IPA (企业版License), 然,需要手动执行的PostEvents竟然多大10项+, 这些我默默的承受了1周时间,每次约浪费20分钟-额外的. 周末用了2天时间,研究一下官方的例子和雨松的相关博客2篇,总算是搞定了这件事情,开心! 痛苦的前传: Unity3D导出为XCode工程后,有如下任务需要做 Plist 文件中 <key>CFBundleDevelopmentRegion</key> 中文 <string&

[COCOS2DX]交叉编译实践+速度优化(vs2012修改win32代码+修改makefile+编译安卓项目包+部署安卓项目包到Eclipse+运行apk)

通过前面的部署过程可以知道cocos2dx的开发过程如下: 1.VS2012完成修改 2.因为指定了CPP文件位置,ndk可以通过jni方式完成C++文件的编译,运行以下命令完成proj.android的编译: cd C:\ComputerScience\workspace-cocos\HelloWorld\proj.android python build_native.py 3.将编译好的安卓项目导入到Eclipse进行编译和运行 但是上面这些步骤都是在官网工具包下面运行的,交叉编译一次耗时

第一次做安卓项目使用的开源框架列表

由于以前没有安卓开发经验,虽然Java挺熟悉的,不过到了安卓还是有些不适应,毕竟是另外一套了,想着安卓应该也有许多框架可以帮助我做很多事情了,所以前前后后试了很几个,最终都不怎么理想.比如最一开始用的是 ThinkAndroid ThinkAndroid(一个ThinkAndroid教程地址:http://my.oschina.net/u/1046077/blog/127603)虽然有很多使用的功能,如下,很齐全,而且下面这些功能做一个安卓项目都是需要的 MVC模块 ioc模块使用方法: 数据库

Eclipse + ADT 新建安卓项目 Errors running builder &#39;Android Resource Manager&#39; 解决方法

也是很恶心,Android Studio用不习惯,顺手装了个最新版的 Eclipse,然后装上ADT插件 正常的打开 Eclipse,新建安卓项目,最后一步来一个 Error java.lang.NullPointerException Errors running builder 'Android Resource Manager' on Project 'XXX' 咋一看,空指针异常,不懂,于是爬百度和谷歌. 原因好像是 JDK 7 的问题,于是--解决方法有三 1:手动创建一个项目 app

使用Cmake生成OA信用盘平台出租跨平台项目编译解决方案

项目最近OA信用盘平台出租haozbbs.comQ1446595067 有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码结构和组织是分开的,因此为了两边能够同步维护,需要一个能够跨平台的项目编译解决方案,经过调研之后,选择了使用cmake这个工具,本文主要讲述,使用cmake的生产项目的一些基础知识.一.cmake简介 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmak

Android下apk安装的过程,安卓项目的目录结构

安卓下软件安装的过程: 1:拷贝XXX.apk到/data/app/XXX-1.apk 2.在/data/data目录下创建一个文件夹     文件夹名称  当前应用程序的包名. 安卓项目的目录结构: bin:编译后的文件目录 gen:自动生成的文件目录 project.properties:代表编译的版本 对应Android.jar的版本 res:资源目录 drawable:存放应用程序的图标 h :高分辨率(以此类推) x:特大分辨率

[每周翻译]作为一个计算鸡领域相关的学生狗,有毛东西可以让我花10分钟学习然后享受一生的?

原文地址:https://www.quora.com/As-a-computer-science-student-what-can-I-learn-right-now-in-just-10-minutes-that-could-be-useful-for-the-rest-of-my-life 问:作为一个计算鸡领域相关的学生狗,有毛东西可以让我花10分钟学习然后站撸不哭的?我知道这个问题和 What can I learn/know right now in 10 minutes that w

安卓项目开发实战(2)--星座展示12宫格

好多日子没有写安卓了,今天继续我未完成的安卓项目.今天主要实现星座展示的12宫格效果. 1.星座图片 找好12星座的图片,参见工程代码下面的res/drawable目录 2.星座枚举类 建立这个枚举类是很有必要的,可以使我们 的代码更加清晰,同时避免了魔法数字的情况. 枚举类的代码如下: package com.liuc.constatntEnum; import com.liuc.R; /** * 星座枚举 * * @author Administrator * */ public enum