1.7.0 geStringFromFile 在 android 与 ios 表现不一致, 导致热更新失败!!!

1.7.0 jsb.fileUtils.getStringFromFile 在 Android 系统上获取二进制内容时内容可能不完整, 如 *.jsc, *.png, *.jpg 等。 在ios 和 mac 上, 内容正常~

这导致的一个问题是, 当我们使用 getStringFromFile 获取到的内容来计算md5时, 与project.manifest 中的不一致, 导致热更新等失败~

在 1.5.x, 1.6.1 上, 没有这个问题, 1.7.0 出现的, 希望引擎组的朋友看到能检查下,并给个回复~

@panda @jare @dumganhar

补充一下,换了 getDataFromFile 一样有问题~

demo 来一个。

早上做了个例子, 把 Test.zip 解压到工程的可写路径,模拟热更新。然后分别在 ios 和 android 上运行就能看出来~

对于相同的二进制文件, 在 mac 上 和 在 android 得到的值是不同的~

Test170.zip (608.5 KB)
Test.zip (517.7 KB)

通过例子, 我发现ios 和 mac 读到的是空, android 是能读到内容的。 (这与我最初的理解也不同,不过这不重要,重要的是两边得到的内容要一致)

附上运行结果:


mac

android

我先看看再说。

你确定你的test.jsc的md5是你android上截图么?

MD5 (test.jsc) = 48db173d1bc05b681bd575afe92bfcb8

至于 getStringFromFile 或者 getDataFromFile ,这块实现是平台相关的,计算md5建议直接用getDataFromFile。
这个接口会返回一个 Uint8Array,你根据这个Typed Array的值去计算。
getStringFromFile这个接口只能应用于文本文件。请勿乱用与二进制文件。

你可以跑我发你的工程看嘛, android上那个 md5也是不对,不知道它返回的是 md5(什么莫名其妙的内容)。

我们已经调整了, 使用 getDataFromFile 来处理了~

我们还做了其它的实验,

根据 @panda 提供的 热更新方案与脚本,生成md5 是依使用 nodejs 中的 readFileSync("", “utf8”)
对于二进制文件, 即使使用 getDataFromFile , 不定制Native也无法得到一致的文本

你的md5库太垃圾了了,还会改传入的参数的内容。导致计算出的md5不对。

用这个库计算md5:https://github.com/emn178/js-md5/blob/master/src/md5.js

记得用getDataFromFile, 我这里已经完全正常了。

这个库用法很简单,直接吧 getDataFromFile 返回的Uint8Array 传给 md5 接口即可。
:-1:一下你用的库,瞎改输入参数。。。

1赞

好, 谢谢~

能否把工程发出来, 大家学习一下, 谢谢.

另外, 你得到的 test.png 的 md5 值是多少? 也发一下吧, 我看一下与 panda 的脚本计算的是否相同

MD5 (test.jsc) = 48db173d1bc05b681bd575afe92bfcb8

用我发的那个开源库。

使用方式: md5(jsb.fileUtils.getDataFromFile()); 得出结果一样。

@panda 的脚本生成的 md5是:
“src/settings.jsc”: { “md5”: “1fbf03eee9668f99b52d9db65ef8222e”, …}

所以你这样还不够,

  1. 生成热更新文件时,readFileSync 使用 ‘binary’ 模式
  2. 做验证时,读取使用 getDataFromFile()
    这样就行了, 希望看到的朋友能少走弯路吧

麻烦 @panda 有时间也更新一下那个热更新脚本。

2赞

我也被坑了一把

:+1::+1::+1::+1::+1:
我用了你提供的链接,成功获取了图片和音频 md5 感谢大佬