Cocos热更新的非官方解决方案

背景

Cocos 官方提供了一套热更新的解决方案,但我们认为这套方案在以下方面不能完全适合我们的需求:

  1. 必须要在 Cocos 引擎启动之后才能够开始热更新流程,而我们有些业务场景需要支持在 Cocos 引擎未启动的时候就能够开始热更新流程;
  2. 文件下载效率低,官方提供的方案是在客户端本地对比本地的文件 manifest 和服务端的文件 manifest,找出其中的差异,然后再将差异的文件下载下来,并逐个校验,效率较低;
  3. 没有回退兜底策略,若本地进行热更新之后出现异常导致用户无法使用,无法回退到上一个版本;

基于这些问题,我们给出了自己的 Cocos 热更新解决方案 TinyCocosFix。
TinyCocosFix 是基于 native 端实现,因此能够在 Cocos 引擎未启动时就开始热更新流程;我们将文件 diff 的逻辑放在服务端,服务端直接将两个版本的 diff 文件压缩成 zip 包返回给客户端,然后客户端再针对 zip 包做校验,整个 diff 的过程比官方的方案更加高效;另外,我们还在本地做了历史版本管理,当新的热更新版本出现异常,导致用户无法使用时,可以启动兜底策略,本地回滚到上一个版本,尽最大可能保证用户体验。

可行性分析

根据 Cocos 的官方文档,https://docs.cocos.com/creator/manual/zh/advanced-topics/assets-manager.html
Cocos 所有的文件均通过 FileUtils 查找,而 FileUtils 会按照搜索路径的优先顺序查找文件,所以理论上,我们只需要将热更新的文件下载下来,放到指定的目录,并将该目录添加到 FileUtils 的搜索路径的前面,这样我们就可以实现热更新了。
在这里插入图片描述

经过 demo 测试,验证了我们的猜想。因此整个热更新的原理其实比较简单,客户端携带版本号等相关参数请求后台,后台收到App的请求之后判断是否有热更新,若没有,则返回无;若有,则返回热更新资源包。客户端下载完热更新资源之后,将对应的路径插入到 FileUtils 搜索路径当中,即完成了热更新的过程。

TinyCocosFix的总体设计

整个热更新的流程如下图所示,根据角色分为前端,后台和客户端;
当我们发布新的 App 版本时,需要告诉热更新管理平台,并上传当前 App 的资源包,这时候的资源包为 base 包;
当我们需要发布热更新的时候,此时需要上传热更新资源包,管理平台可以指定该热更新资源包能够更新到哪个App版本,并和之前的资源包生成 diff 包;
当对应版本的客户端请求后台时,便会返回相应的 diff 包给客户端。
在这里插入图片描述

1.后台

链式管理

管理后台使用链式的方式对 App 版本和热更新版本进行管理,具体如下图所示:
我们发布热更包的时候可以自由的指定这个热更包能够在哪个 App 版本上生效。
例如当我发布热更新1.0版本,指定在4.3.5和4.4.0上生效,则在其后追加1.0;
当发布2.0时,1.0自动过期;
当发布3.0,指定在4.4.0和4.4.5生效时,4.4.0的2.0热更包过期,4.3.5的2.0继续生效。
在这里插入图片描述

生成最近5个diff包

当我们在管理后台创建热更新包时,会找最近的5个热更包生成 diff 包,如下图所示:
App 版本4.4.0已经发布了6个热更新版本,当我们创建7.0热更新版本时,会自动找最近的5个版本生成 diff 包,
此时,如果客户端的App版本是4.4.0,热更新版本为2.0 - 6.0,则会直接返回对应的diff包;
如果客户端的App版本是4.4.0,热更新版本为1.0,则第一次请求,后台会返回没有热更包,并触发对应1.0和7.0的 diff 包生成逻辑,下一次请求就会返回对应的热更包。
在这里插入图片描述

2.客户端

客户端的热更新流程如下:
在这里插入图片描述

热更新策略

我们定义了三种热更新策略

热更新策略特点
强制更新不允许取消,热更新包下载完成之后立即重启生效
推荐更新允许取消和跳过
静默更新后台下载,第二次启动生效,用户无感知
历史版本管理

TinyCocosFix 会在本地最多保留三个历史版本,并对外提供了回退到上一个版本的接口,业务方可根据自己的需求来定义触发回滚的逻辑。
如下图所示,为我们业务的回滚策略:
我们会在主要场景检测发生的异常,若在一分钟内发生超过50次异常,且本地发生过热更新,则触发回滚机制。
回滚完成之后 TinyCocosFix 内部会上报触发回滚的异常,并记录发生回滚的版本,若下次检测到相同的版本,则不会提示有热更新。
在这里插入图片描述

异常管理

TinyCocosFix 内部会对异常进行管理,主要分为热更新过程异常和业务方的热更包自身逻辑异常,具体的处理方式如下表所示:

异常处理备注
热更新过程异常记录热更新失败版本,下次遇到相同版本直接跳过如多次 MD5 校验失败
热更包自身逻辑异常TinyCocosFix 提供回滚接口,业务方自定义错误阈值,触发回滚,回滚之后记录回滚的版本号,下次遇到相同版本跳过兜底策略
断点续传

若热更新下载过程中进程突然被杀掉,下一次启动会从上次下载的地方继续下载。

3.热更管理平台

主界面

热更新管理平台界面如下:
在这里插入图片描述

目前管理平台包括四个部分:App 版本管理,热更包版本管理,灰度用户管理,开发者管理。
App 版本管理
创建App版本界面如下:
我们 App 每次发版时,需要在管理平台创建对应的App版本,这样发布热更新时,我们才能够指定热更新支持的版本,后台也能够根据每个版本生成 diff 包,我们需要提供 App 的版本号以及对应的资源包。
这一步可以在蓝盾上使用流水线自动实现。
在这里插入图片描述

热更包版本管理
创建热更包需要提供热更新的资源包,并选择热更新策略,在下一步可以选择热更新生效的App版本。

在这里插入图片描述

灰度用户管理
在这里配置的灰度用户适用于精确灰度,当我们的热更包还处于自测阶段时,只有灰度id才能够收到热更包。
在这里插入图片描述

开发者管理
只有拥有权限的用户才能够进入到管理平台。
在这里插入图片描述

热更新发布流程

我们规范了热更新的发布流程,如下图所示:
在这里插入图片描述

我们认为发布是一个很危险的操作,任何发布的热更包都必须要经过测试,因此新创建的热更包只能是灰度包;
精确灰度
管理后台有一个灰度账号管理,创建的精确灰度包能够匹配到这些账号,这一步主要用于我们内部测试;
批量灰度
当我们精确灰度没问题之后,便可以进行下一个步骤,批量灰度。目前支持尾号匹配和上传 excel 两种批量灰度规则。
尾号匹配,例如用户的id为12345678,尾号匹配为8或者78,均能匹配到该用户。有时我们发布热更包希望只有某些确定的用户能够收到,则可以使用上传 excel 的功能,excel 表格中包含所有批量灰度的用户。
发布
批量灰度一段时间之后,观察下热更新的成功率和失败率以及回滚率,如果没有问题,便可以发布了。
在批量灰度和发布期间均可以将热更包过期,一旦过期热更包立即失效,过期的热更包可以恢复到之前的状态。

4.上报统计

TinyCocosFix 会上报三类信息,具体如下

类别备注
初始化上报统计热更新版本存量用户
热更新结果上报统计热更新成功率和失败率
回滚上报统计回滚率

上报结果统计界面如下:
在这里插入图片描述

5.和官方热更新方案对比

官方TinyCocosFix
本地计算 diff后台计算 diff
每次下载一个文件,单个校验下载整个 diff 包,整体校验 md5
必须启动 Cocos 引擎无需启动,native 端可完成热更新流程
无回滚策略增加回滚策略,出现问题回滚到上个版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值