实现Android远程构建缓存

0 阅读3分钟

当遇到一个大型的Android项目时,而电脑性能又无法支撑繁多的编译任务,开发者将会用大量的时间来等待编译,十分影响开发进度。特别是多人、多分支,多渠道开发时,将会是一个噩梦。我是亲身经历者,完全重编译一次我们的项目,大概需要20-30分钟,这还不算下载依赖的时间,我们的项目时多模块的架构,再加上Hilt依赖注入,编译十分耗时。

使用远程构建缓存这个方案是我突然一下子冒出的想法,虽然这个方案早已存在。于是我就去查阅了相关资料,远程构建缓存确实是可行的,于是我下定决心,准备在我们的项目上实现,这样可以节约很多时间。

确定实现方案

关于构建缓存,我们一直都在使用Gradle 提供的本地缓存方案,实现远程缓存,其实就是把build 生成的文件放到云端,可以个供所有开发者使用。

对于企业级项目,可以使用Develocity来实现,但是它是付费的,它不仅提供缓存共享,还可以加速CI/CD过程,提供构建性能监控和分析。Gradle 还是比较友好的,还提供了另外一种免费的方法,官方提供了一个免费、轻量级的缓存后端:Gradle Build Cache Node,使用Docker 容器可以开箱即用。我就是选择的这一种方案。

实现步骤

1、安装Docker和启动gradle/build-cache-node。

# 1. 在宿主机上创建数据持久化目录
mkdir -p /opt/build-cache-node

# 2. 赋予该目录适当的读写权限(防止容器内用户无权写入)
chmod 777 /opt/build-cache-node

# 3. 运行 Docker 容器
docker run --detach \
  --name gradle-cache-node \
  --restart unless-stopped \
  --volume /opt/build-cache-node:/data \
  --publish 5071:5071 \
  gradle/build-cache-node:latest \
  start

2、访问后台管理,设置缓存策略,添加用户和设置权限。注意,首次启动后台管理,登录时用户名和密码需要从服务的启动日志中去找。 3、在Android项目中settings.gradle 配置远程构建缓存的地址 注意:对于普通开发者,push = false,这里是避免都去上传缓存,造成缓存库污染,credentials 在后台管理平台可以进行设置的。

我们只在做CI/CD的机器上开启push

buildCache {
    remote(HttpBuildCache) {
        // 指向gradle build cache 服务远程构建缓存地址
        url = 'http://<ip>:5071/cache/"
        allowInsecureProtocol = true
        push = true
        credentials {
            username = 'cache_user'
            password = 'cache_password'
        }
    }
}

4、CI 自动构建项目,上传缓存。当然这一步,如果已经是实现了的,就直接可以忽略了。

我在实现这个远程构建缓存时,还是处于探索阶段,因此我是自己实现了一个简单的CI过程,使用的github提供的self-hosted ruuner,写了一个自动编译的脚本,利用github 的Action 定时执行。过程还是比较坎坷,由于对脚本的编写不熟悉,AI生成的又出现了很多错误,加之脚本的运行调试比较麻烦,还是花了很长时间去实现这个简易的CI。