android - 从 Nexus 设备上挂载的 obb 文件读取损坏的数据

标签 android corruption

我们有一个跨平台的移动应用程序,它使用 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/

相关文章:

mysql - 如果表损坏,我可以恢复备份吗?

java - Android: R.java: 错误 <identifier> 预期

android - 为类而不是实例实现监听器

带有额外信息的 Android 应用内购买

c - 将函数分离到不同文件时的数据损坏

删除数组时检测到 C++ 堆损坏

android - native Facebook 登录到 Xamarin WebApp

android - 为什么只有第一行显示使用 Recyclerview gridlayoutmanager

git - 由于缺少对象,我该如何处理 Git 损坏?

git - 如何修复 git 存储库中的 "bad date"问题?