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