3.8.7热更版本对比问题

同一个apk包,首次安装打开,有时候获取的版本是对的 1.0.0.2,有时候获取的版本是错的1.0.0.1 ,地址都没问题,远端地址从没上传过1.0.0.1的版本, 回调中也没发现manifest down的错误。


版本对比代码部分

首先 你把远端的版本文件的地址 设计成固定的连接形式了,这里就有很多隐患了,你要不断更新这个文件吧 随着你的版本更新,那么 你想一下 你怎么保证正在下载的人不受到影响?然后就算没有影响,然后 你怎么保证更新后的文件 没有被客户端和各种网络中间商缓存?你怎么保证你更新后的文件 客户端能拿到最新的版本?
换个设计思路吧 也许问题就解决了都,把上面说的各种问题屏蔽了 应该瞬间就通了都

这个函数只是比较作用,有时候会调用2次,你只要让他返回结果就行了,不要在这里做一些过程相关的逻辑。
代码里面会把你cache里面的manifest和apk内的manifest进行对比,然后再远端对比,从而出现调用2次的情况。第一次如果你的包内manifest有释放到cache,就有可能出现版本相同的对比。
可以在cpp代码里面看到具体的调用。

第一次:
apk 里面 manifest <–> 本地cache 里面manifest, 输出 1.0.0.1 = 1.0.0.1
第二次:
本地manifest (通过第一次判断后的) <—> 远程 manifest 输出 1.0.0.1 < 1.0.0.2

第一次的对比,在
engine\native\extensions\assets-manager\AssetsManagerEx.cpp 的 288 行

    if (_localManifest->isLoaded()) {
        // Compare with cached manifest to determine which one to use
        if (cachedManifest) {
            bool localNewer = _localManifest->versionGreater(cachedManifest, _versionCompareHandle);
            if (localNewer) {
                // Recreate storage, to empty the content
                _fileUtils->removeDirectory(_storagePath);
                _fileUtils->createDirectory(_storagePath);
                CC_SAFE_RELEASE(cachedManifest);
            } else {
                CC_SAFE_RELEASE(_localManifest);
                _localManifest = cachedManifest;
            }
        }
        prepareLocalManifest();
    }

我明白你的意思 我有看到手动改版本文件地址的方案 就是比较奇怪1.0.0.1是哪里返还的 因为远端根本就没这个版本的缓存。 假设1.0.0.1是因为远端下载失败返回本地的版本,但是又没有触发下载失败的回调。

CDN 可以保证,关于文件刷新的情况,可以有cdn上传后脚本刷新就可以了。
cdn 对这些已经有成熟的方案了,缓存,回源,刷新等等。所以固定连接没有什么问题。

有什么办法保证正确吗 假如版本对比相同 他就触发native.EventAssetsManager.ALREADY_UP_TO_DATE,直接进游戏了

不会吧,根据代码来说,对比2次还是会正常的获取远端版本的。
真的不行你打一个windows 包,开visual studio 调试一下吧。我是没有碰到这里有问题。

按你说的对比两次,但是对比第一次的时候,不就触发了版本相同,然后进入无需热更的判断?

还是说我判断两次结果再决定是否无需热更?

不是,这个函数是用来做compare 函数的,它不会显式触发什么,只是对比一下版本号的大小,你可以把它看成类似sort函数的compare函数,所以调用2次也没关系,只是第二次的时候才判断。

它唯一有效的就是返回值,你可以认为它是只读函数,过程中会利用这个返回值做判断,但是第一次调用只是用于判断在cache的文件是否小于包内文件,用于新装包版本比cache里面版本大的特殊情况处理。

你看看cpp代码吧

好的 谢谢

很好奇,现在不是AI很强大吗 你没试试这种问题让AI来解决一下 看能有何种结果到?

问了一下ds 都是回复网上有的答案不是很符合我的问题

(帖子被作者删除,如无标记将在 24 小时后自动删除)

发现一个新问题 cache的那次判断是相同之后 没有第二次触发, cache不同时就会有第二次触发

这个我也不太清楚,因为我这边好像也没碰到这个问题,我建议打个windows包来详细调试一下。

android 和 windows 的原生逻辑基本上是一样的,windows用visual studio 更好调试,然后那个cache文件夹也可以随便进去查看和修改。

我看了一下源码 cache 的对比是不会派发 native.EventAssetsManager.ALREADY_UP_TO_DATE的事件码的, 我是收到了这个事件码,导致跳过热更

(帖子被作者删除,如无标记将在 24 小时后自动删除)