Egret社区
本帖最后由 jj229937432 于 2021-5-13 10:56 编辑

Egret-Hotupdate 白鹭热更新-增量更新方案



介绍
        白鹭官方提供的热更新方案中只提供了一种整包更新的方案,但是对于资源量较大的游戏,这种方案就非常不可取了。此方案是根据增量更新的思路设计编写。暂时只有Android 案例,但是IOS也可以类似开发。        热更新的版本管理一般分两种:一种是完全前端管理,后端不参与,需要前端独立完成与远程版本库的版本比对和下载最新,优点是简单,缺点是版本控制不灵活;第二种是后端管理,前端从后端获取版本信息,再比对更新,优点是版本控制灵活,后端随意控制,缺点是多一点点运维工作。本案例采用的是后端管理版本的方式编写,想改成前端管理的方式也很容易,只需要把获取最新版本信息的途径从后端转移到前端即可。

       本案例中整个热更新过程从检查更新 -> 开始更新 -> 显示进度 -> 重启EgretNative,全部在Egret工程内触发,android端通过接收事件,做对应事件处理,优点是尽量把逻辑代码集中到Egret中,可以实现下载过程的画面友好度开发,并且减少未来原生代码的逻辑修改。


设计思路

1.启动APP

2.读取 APP 数据存储 SharedPreferences
current_version=[current version]
new_version=[new version]
new_version_state=0:incomplete/1:update complete
remote_url=http://zzzzzz/[new version]

3.如果 SharedPreferences不存在, 首次读取会自动创建,并根据assets路径下的最初始的版本文件(version.manifest或者project.manifest)记录的当前版本号和资源下载地址,编辑SharedPreferences,保存如下键值对.
current_version=[original version]
new_version=[original version]
new_version_state=1:update complete
new_version_remote_url=http://zzzzzz/[original version]

4.根据SharedPreferences存储的[current_version], 设置EgrestNative预加载目录并启动EgretNative。向后端发送http请求,获取最新发布的版本信息hdConfig(版本号和资源地址)。
hdConfig ={
        remote_url:url,
        current_version:xxx
}

5.比对本地当前版本号与最新版本号.

  • 如果 SharedPreferences[current_version] >= hdConfig[current_version], 表示没有更新,继续进入游戏。

  • 否则表示有更新,并根据新版本信息更新SharedPreference的new_version 和 new_version_state 和 new_version_remote_url,为之后的更新做准备。
new_version=[new version]  // 记录最新版本号
new_version_state=0:incomplete // 标记热更新还没有完成
new_version_remote_url=http://zzzzzz/[new version]  // 记录新版本资源的远程加载地址

6.开始更新。首先复制本地当前版本的资源文件夹,如果不存在(初次更新),就复制原始assets文件夹,复制到以最新版本号为名的文件夹内。

7.根据SharedPreference记录的new_version_remote_url,加载project.manifest。

8.比较本地资源文件夹内的project.manifest和最新的project.manifest。

  • 比对查找出本地所有不再使用的文件,等待删除。

  • 比对查找出所有有修改的文件和新增文件,等待下载。

9.从之前复制的最新版本文件夹内删除所有不再使用的文件。

10.下载所有有更新或者新增文件到之前复制的最新版本文件夹内,并派发下载进度。

11.当所有删除和下载任务完成之后,更新SharedPreference如下,并删除上一版本资源文件夹(初次更新除外)。
current_version=[new version] // 将当前版本更新成最新版本,再次启动就跟根据最新版本路径加载资源
new_version_state=1:update complete // 将最新版本的更新状态设置为完成,此状态可以用来判断更新状态

12.重新初始化 Egret Native(参照第4步).

案例操作


1.进入游戏界面,查看当前版本号,输入最新版本号 和 远端资源服务器地址(这里手动输入版本信息实际上是模拟从服务器端获取来的版本信息),点击检查更新。
step-1.jpg

2.当前端判断有版本更新之后,就可以点击开始更新按钮。

step-2.jpg

3.更新开始后,会有进度变化,知道完成度达到100%,就可以点击重启Egret。
step-3.jpg
4.重启Egret,会在不关闭App的状态下完成Egret重启,重启后游戏版本号已经更新成最新版本。
step-4.jpg


DEMO源码:
游客,如果您要查看本帖隐藏内容请回复









分享到 :
3 人收藏

59 个回复

倒序浏览
jj229937432  圆转纯熟 | 2021-5-13 15:20:07
有问题随时沟通哈。。。
18234133045  圆转纯熟 | 2021-5-11 14:54:48
本帖最后由 18234133045 于 2021-5-12 10:27 编辑

学习学习
panming0230  登堂入室 | 2021-5-11 17:45:03
感谢
一只小菜鸡  登堂入室 | 2021-5-12 09:54:12
感谢提供,学习一下这种方法
youxingxianshen  登堂入室 | 2021-5-12 10:04:20
大佬6666
david_850067064  初学乍练 | 2021-5-12 10:06:16
666666
罗小黑by  登堂入室 | 2021-5-12 10:20:44
感谢提供,学习一下这种方法
a84322146  登堂入室 | 2021-5-12 10:21:44
666666
TabSpace  登堂入室 | 2021-5-12 10:24:45
1
cfg  初学乍练 | 2021-5-12 10:47:32
看看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部