我们有一个跨平台移动应用,它使用原生的 C 库来读取一些数据(以及其他内容)。在Android上,数据位于我们使用Expansion APK机制获得的obb文件中。这对我们来说非常有效。但是,我们发现在第二代(2013)Nexus 7表和Nexus 5手机上,我们正在读取已损坏的obb中的一些数据。实际的obb文件没有损坏,但我们从中读取的是。
我最好的例子是WebView从已安装的obb中读取HTML文件。 HTML的第一部分会很好,然后第二部分就会出现乱码。有趣的是,胡言乱语可以从obb的其他地方识别为二进制数据。这几乎就像Android代码一样,读取obb会导致块映射错误。
我已将其缩小为由某些 C 代码触发,该代码从obb中读取对象。如果我对此进行评论,那么当我稍后访问它时,HTML就会没问题。现在, C 代码中可能存在错误,但此库已在其他两个平台上使用而没有问题。它也适用于第一代Nexus 7和其他非Nexus设备。
那么有人对这可能是什么有任何想法吗?在这些Nexus设备上,Android 4.3.x和Android 4.4.x似乎都会发生。什么可能是硬件方面不同可能导致这种腐败?我认为 C 库之类的东西都带有Android,并且不会以某种方式内置到固件中?
答案 0 :(得分:1)
我有完全相同的问题,使用stdio函数从本机C库中的OBB读取时随机损坏的资产。在安装的OBB中,128字节的段始终被破坏。数据中的任何更改都会改变字节段,从而导致不同的资产被破坏。对于运行O / S v.4.4.x(KitKat)和v.5.xx(Lollipop)的手机而言,这只是一个问题,运行6.xx(Marshmallow)的手机以及之后不受影响,据我所知。
为了避免这种情况,我没有安装.obb,而是使用了此处概述的备用.zip方法:https://developer.android.com/google/play/expansion-files.html。
我只是将数据打包成一个带有0压缩(存储)的.zip,重命名为.obb,将其上传到谷歌播放。当用户首次启动应用程序时,我使用APK扩展Zip库将文件解压缩到外部存储,然后直接读取文件而不是通过安装。这导致应用程序的大小是手机的两倍,但由于数据损坏,最好在某些系统上完全中断。