兼容线上散文件热更的一种版本差异对比zip更新方式实现

由于线上热更随着项目越来越大,散文件热更更新的资源也就越来越多。甚至跨版本更新下载的资源远大于整个安装包大小。所以考虑之下还是选择做了zip热更新。

要解决的痛点:

1.把之前的散文件更新改为下载单个zip包。

2.兼容线上版本,不需要重新下载安装包。

3.跨版本更新不需要重复下载多次某个改动频繁的资源。

所以考虑之下还是选择了版本差异对比的zip包热更新,没有选择版本增量zip更新。

实现思路:

前提操作,每次更新线上后保存对应资源文件,对比这些资源文件的差异,生成每个版本对应的zip包。

热更流程需要由服务器来控制下发的版本和方式。

image

客户端收到需要走新的热更包更新流程之后,下载zip包,解压到临时文件,拷贝到热更搜索路径。

中间遇到的问题:

win版本单文件超过100M调用jsb.fileUtils.getDataFromFile(localZip);直接闪退。安卓测试没问题的。不确定是否所有平台都支持大文件操作。我们测试是在win下的。

所以索性就拆分zip包为多个。这个步骤是在生成zip文件的脚本实现的。

下载过程中,或者解压,拷贝过程中用户强制删掉app。要做对应的差错处理。这一步只要思路清晰,实现过程还是不复杂的。

更新流程分为四个状态:

Free: 空闲或者更新完成

Download: 下载中

UnPackZip: 解压中

CopyAssets: 拷贝资源

状态切换时,记录下当前状态,以及对应的数据,写到本地。下次启动app时检测下状态,然后做对应的处理。

Free状态不处理。

download就继续下载,然后走之后流程。

UnPackZip就删除之前的解压临时文件,重新解压。然后走之后流程。

CopyAssets: 就重新拷贝。

拷贝完成之后,最后修改本地manifest。

新模式的痛点:

要保留老版本资源文件。

线上版本不能同时存在2个相同版本号的版本。

一旦线上版本多起来之后,每次打包都要对比n个版本,这个是毁灭级别的。

所以我们选择只支持最近10-20个版本做zip更新。其他的版本做散文件更新(极少量用户),或者整包更新,或者直接下载完成的zip资源包拷贝覆盖到搜索路径更新。这个根据用户需要下载的资源大小来通过服务器管控分发。

1赞

你把官方的方案改成ZIP方式 不就都有了吗 还有你后面这一大坨东西存在的理由吗

所以1.2跨版本升级到1.5怎么处理?

跨100个版本的情况下,又是怎么处理?直接一句改为zip?怎么改?

我认为 你发明一个新的东西前 最好先看看现有的东西是否支持你需要的 然后再动手才是最省事的方式,就你这个问题来说 你看了官方热更的文档了吗 你认为能支持吗先说? 如果你认为不能支持 好 你可以继续你的方案,如果能支持 那不就是你需要的了吗

官方文档我也翻了好几遍了,没找你说的那个。大佬请指示。

请问您说的官方的zip更新是每个文件资源压缩成zip,还是整个包是一个zip?

3.跨版本更新不需要重复下载多次某个改动频繁的资源

散文件才不会重复下载相同文件多次改动的资源吧?

是的,我目前使用这种zip也不会。

所以,不存在这个痛点啊
zip唯一的优点是合并请求数

请求数不是唯一的有点,还有更方便控制下发版本。服务器想分发版本更方便一些。可以指定某些用户更新。

增量zip热更新也是会减少下载连接数,但是跨版本相同的文件会下载多次

更新粒度控制,我觉得这不是优点
前端存在多个版本时,后端、配置表怎么做兼容?

我们是先下发给自己内部测试人员,不是存在多版本。我们测试没问题,再全部下发。

。。是这种

内测版本区分和更新模式没关系。。。。
内外测版本通过manifest控制即可,
不同版本下载不同的manifest,
需要测试时先发内测的manifest,测试完了直接推manifest到外部版本

所以我才自己实现,我需要的是单文件zip模式,单文件cdn和分发都更方便。

所以你总结出的这些优点 都是其他人认为的缺点

之前没有区分内测版本,就是全部下发。热更服务器就一份,更新了就是全部用户更新了。测试服环境和正式服不一致,出现过几次测试服没问题,正式服有问题。

其实,和服务器没啥关系
都是静态文件,直接买个存储桶丢上去直接cdn分流就行。
涉及到服务器事情又开始复杂化了