使用本地和远程的Gradle构建缓存加快构建速度
汇总:Android小白成长之路_知识体系汇总【持续更新中…】目录Gradle构建缓存启用构建缓存配置本地构建缓存配置远程构建缓存配置远程缓存后端使用jar直接启动结点使用docker启动gradle最佳配置其他问题附录Gradle构建缓存在使用gradle构建的时候,gradle会对输出进行缓存,便于下一次构建时重用相同的输出,避免重复构建,可以节省大量的时间,对编译速度优化方面具有非常大的帮助
汇总:Android小白成长之路_知识体系汇总【持续更新中…】
Gradle构建缓存
在使用gradle构建的时候,gradle会对输出进行缓存,便于下一次构建时重用相同的输出,避免重复构建,可以节省大量的时间,对编译速度优化方面具有非常大的帮助,而且gradle新版本中也在逐步地完善缓存,提高命中率,因此使用缓存是非常有必要的优化手段,目前在Android Studio中可以使用本地缓存和远程缓存两种方式,接下来简单介绍一下最基本的配置,了解更多请点击附录中的链接查阅
启用构建缓存
默认情况下,未启用构建缓存,我们需要在gradle.properties中开启缓存,添加字段
org.gradle.caching = true
也可以在命令行进行构建的时候添加--build-cache
,例如
./gradlew build --build-cache
配置本地构建缓存
开启构建缓存后,默认开启了本地缓存,而本地缓存默认存储于gradle用户主目录中,但是可以根据需要进行手动配置。打开setting.gradle
文件,添加
buildCache{
local{
directory = new File(rootDir, 'build-cache')
removeUnusedEntriesAfterDays = 30
}
}
其中directory
设置的是目录,removeUnusedEntriesAfterDays
是多长时间后清除未使用的缓存
配置远程构建缓存
远程构建缓存应用于多人开发的场景,特别是使用了CI构建的场景,因为CI构建足够稳定,可以用作共享缓存,而本地机器则使用CI构建生成的缓存,就能避免一些问题,这些问题后续讲述。先了解如何配置远程构建缓存,同样的,打开setting.gradle
文件,添加
buildCache{
remote(HttpBuildCache){
url = 'http://example.com/cache'
}
}
url
是缓存的远程后端地址,会在下文中介绍如何简单地配置一个可用的cache后端
配置远程缓存后端
配置缓存后端最简单的方法是使用gradle
为我们提供的构建缓存结点gradle/build-cache-node
,此结点可以和Gradle Enterprise
配合使用,达到最佳效果,但Gradle Enterprise
是收费的,这里只单独使用gradle/build-cache-node
使用jar直接启动结点
-
首先下载build-cache-node的jar包,下载地址:build-cache-node下载
-
配置java运行环境,不会配置的直接百度搜索即可,这里不做描述。需要注意,9.0以上的版本需要使用
java 11
及以上的java环境 -
下载文件后,运行终端,直接进入它所在的文件夹,执行命令:
java -jar build-cache-node-9.11.jar start
其中版本号需要替换成你下载的版本
-
上面的启动方式的配置都是默认的,端口号是5071,访问节点主页就是localhost:5071,而在gradle中配置远程缓存的url就是http://localhost:5071/cache
-
推荐使用的启动方式:
java -jar build-cache-node-9.11.jar start --data-dir build-cache-node --port 80 --path my-path
- –data-dir:配置缓存的存储文件夹路径
- –port:配置端口号
- –path:配置访问的名称,例如上面的配置,在gradle中的url配置应为http://localhost/my-path/cache
-
节点未提供开机启动的功能,因此我们需要手动去配置开机自动运行上述的命令行,具体方法根据不同的系统而不同,感兴趣的可以去搜素如何开机自动执行
使用docker启动
使用docker
启动节点可以更方便管理,同时不需要手动去下载jar包,也能配置开机自动执行
-
首先安装
docker
,Windows
和macOS
推荐下载Docker Desktop
,Windows
系统需要开启虚拟化技术,因为Windows
安装docker
需要用到virtual box
-
在终端运行命令行启动镜像:
docker run --detach \ --user $UID \ --volume build-cache-node:/data \ --publish 80:5071 \ --restart always \ gradle/build-cache-node:9.11 \ start --path my-path
- –user:指定使用的用户,未指定时默认使用root身份,此用户可以读取和写入文件系统,例如data缓存目录,一把直接使用
$UID
指定为当前登录的用户 - –volume:指定存储路径,上述的配置指定为当前目录下的
build-cache-node
文件夹 - –publish:指定端口,当前指定为80
- –restart always :配置自动重启策略,
always
则为始终保持自动重启 - gradle/build-cache-node:9.11:配置下载的缓存节点的版本,可以使用固定的版本号,也可以使用latest代替,表明使用最新版本,配置这个版本会直接去下载对应的版本,然后才去启动
- –path:指定访问路径名称,官方说新版本可以配置,不过我这里配置显示–path命令不存在,暂时不知道原因
- –user:指定使用的用户,未指定时默认使用root身份,此用户可以读取和写入文件系统,例如data缓存目录,一把直接使用
gradle最佳配置
-
不使用CI时,gradle可以配置如下:
buildCache{ local{ enable = true removeUnusedEntriesAfterDays = 30 } remote(HttpBuildCache){ url = 'http://example.com/cache' enable = true push = true } }
该配置下同时使用本地缓存和远程缓存,构建时会首先检测本地缓存,没有时才会使用远程缓存,
push = true
当前缓存会上传到远程缓存中,在没有使用CI构建的情况下只能每个人本地上传,但这会导致缓存经常改变,导致其他人命中率没那么高。可以定个规范,主导者创建分支后执行首次编译并且打开开关上传纯净的缓存,其他人关闭这个字段,不上传自己的缓存,只使用远程缓存。 -
使用CI时,就更加规范了,由于CI构建会保持最新并稳定的已合入代码的缓存,因此可以使用CI的缓存作为远程缓存,本地机器都不进行缓存的上传,gradle配置如下:
boolean isCiServer = System.getenv().containsKey("CI") buildCache { local{ enable = !isCiServer } remote(HttpBuildCache) { url = 'https://example.com/cache/' push = isCiServer } }
也就是判断当前环境是否是CI构建环境,如果是的话则关闭本地缓存,开启远程缓存推送,关闭本地缓存是为了保持缓存的纯净度。其他人的本地机器则由于不是CI环境,就不会上传缓存,只会使用远程缓存
其他问题
- 上面都是用
localhost
本地地址访问,可以根据实际情况改为正确的地址。例如需要局域网内访问,就应该改为ip地址或者映射后的域名,外网访问则需要配置相关的外网地址 - 直接在浏览器可以打开
localhost:5071
,可以在里面配置缓存大小或者访问用户控制,也可以看到缓存占用情况,还可以配置Gralde Enterprise
相关信息 - 直接浏览器打开
localhost:5071/cache
会遭到访问拒绝,返回一个错误页面,但可以在gradle配置中正常访问 - 如果不使用CI构建,本地第一位同学首次构建需要上传缓存,所以可能构建时间比不使用远程构建时稍微长一点,但其他人首次构建将大幅度缩减构建时间
- 如果构建的时候显示类似
remote read time out
的信息,则需要排查网络,例如局域网的话需要查看是否在同一个局域网下,还需要排查是否挂了VPN导致访问不上。还有一个由于Android Studio导致的非常坑的问题,如果曾经在AS中配置了代理,记得在设置里去掉代理,同时一定要去全局的gradle.properties里查看是否有代理的配置写在里面,因为即使你在设置里不使用代理,这个文件里的代理配置字段也不一定会被清空,很多AS的网络问题都是因为这个引起的!!! - 更多配置相关问题请前往附录中的链接地址中查阅
附录
更多推荐
所有评论(0)