求助:原生安卓和IOS平台 bundle的热更新,如何打全量包?

现在项目使用ccc2.4.5

由于项目资源太多,使用了 bundle的热更新能力

原生平台就发现一个问题。虽然第一次下APK快了很多,但是第一次打开游戏下载远程的bundle,由于资源文件太多,下载太慢了。一个文件一个文件的下,比下载一个全量的APK还要慢。

所以,我们在想,我们需要这个热更能力。又不希望第一次下载bundle比单独下APK还要慢。
我们能否将bundle第一次的时候都打包在APK中。然后远程bundle也是一样的文件。这样在第一次下载的时候,就不会导致热更文件过多,而太慢,后面只需要在对比远程bundle热更就好

但是我们不知道如何第一次吧bundle直接打包在APK和IOS中。希望有经验的大佬帮忙!

求助

使用热更的逻辑对文件bundle包生成md5值然后将bundl包中的资源循环下载到本地可写目录下,每次对比md5值不一样的才下载(纯理论)

https://docs.cocos.com/creator/2.4/manual/zh/asset-manager/cache-manager.html
照这里的逻辑, 应该是可以直接打进去的

构建完了之后不要去删除remote文件夹, 看打出来的包行不行。最好是先解压apk看remote在不在,然后再启动游戏看是否有下载

给你一个思路,写一个 脚本,将bundle每个版本的的manifest存起来用于和后面版本的manifest对比。预设一个 对比版本数量 比如5 假设目前更新到v5

将v5的所有资源打成zip 记做0_5.zip
对比V5和V1的差异资源 将差异资源拷贝出来打成 zip 记做1_5.zip
对比V5和V2的差异资源 将差异资源拷贝出来打成 zip 记做2_5.zip
对比V5和V3的差异资源 将差异资源拷贝出来打成 zip 记做3_5.zip
对比V5和V4的差异资源 将差异资源拷贝出来打成 zip 记做4_5.zip
下载服务器将这些资源存放起来。

用户只需要根据当前版本下载对应版本号的差异zip即可
例如 首次下载没有资源 版本号为0 那就下载全量资源的 0_5.zip
版本号为1 那么下载1_5.zip
下载后解压即可加载bundle

如果用户版本过低 低于最近5个版本 资源服务器没有对应版本的差异文件 那么让他直接下载全量的0_5.zip
每次更新版本 就要上传5个zip资源文件 这个5就是对比版本数量 具体几个你可以自定义

这个方法局限在于
超过对比版本数量就要下载全量资源 比较大
如果对比版本数量过多 打包和上传都比较费时

优势在于下载差异化zip不用担心碎文件过多 小的更新基本秒下
ccc build之后的碎文件太多了 我觉得很适用

具体如何取舍看你自己了

这里尝试过了。这些remote打进去不行。

感谢。目前由于项目已经快上线了。在更改这里的热更方案有点不合适了。需要重构构建上传包的脚本和热更代码。还要重新测试。时间有点久

这种方案之前cocos 2dx用过。2dx会比较好。可以自己管理资源文件的位置

社区里面的大佬能 出手相助一下吗
查了大家热更的资源。远程bundle 都没有说怎么解压到 cachefiles目录的。
bundle的文件和cachefiles的文件都是不一样的。怎么做转换。

每个bundle生成不同的manifest文件,然后通过和远端对比最终单个bundle热更新。
1.每个子项目的manifest生成问题
2.解决ios和android的解压到本地缓存文件的问题
3.解压进程问题否则你直接解压会卡住ui线程
4.解压缩进度获取问题
5.远程下载的问题,cocos在安卓下载大文件超过10秒会导致文件下载超时(不知道ios是不是一样的尿性),如果用http请求就无法获取下载进度。
6.如何读取已下载完成缓存在本地的bundle问题(2.4.3以上已经支持加载缓存的bundle,2.4得改引擎)

1赞

不要勾选配置为远程包不是都会全部打进去了

嗯。。但是现在方案是使用的远程bundle来做热更

那可以做两个manifest 一个是进游戏的必须资源的生成一个manifest,然后直接打包,剩下的不是进游戏必须资源的单独一个manifest,进入游戏后再慢慢下载,然后在loadbundle的时候判断当前本地的bundle是不是最新的,是就用本地的,不是就去远程加载这个bundle,这个需要改下源码

应该用jsb.AssetsManager去进行热更新,利用manifest一次性检测所有的bundle,需要更新的全部下载。总比多次检测多次下载效率高,而且asset bundle的版本还要自己去管理,如果使用md5,那又是另一段故事了

把remote放到 打包后的 asset 里面,在游戏逻辑里面把资源添加到 cache 里面

mark…