安卓设备上二进制文件损坏的可能原因是什么?

13

最近,我在调查二进制文件损坏的原因。具体来说,我们有一个安卓应用程序,本地部分可以在SD卡上读/写二进制文件。有时候,二进制文件因为未知原因而损坏。我们从不同用户那里收集了一些这样的文件,并发现了一些有趣的事实。

其中一种主要的损坏类型是,二进制文件的前4096个字节被擦除了。当我使用hexdump查看这些文件时,前4096个字节都是零。不多于4096或少于4096,而是确切的4096字节。我认为这不是巧合。我知道4096字节是一页大小。但是由于缺乏经验,我无法想出原因,更重要的是,我不知道如何避免其他用户/设备遇到类似问题。

此外,在一些二进制文件的中间,还有一些连续的零段,这不应该存在。如果这不是我们程序的错误,是否有任何可能与平台/设备内核有关,或者像设备突然断电之类的其他原因?

我希望有经历过类似情况的人能给我一些提示/建议/解决方案等。这真的让我很困惑。

非常感谢~


1
你尝试过不同的SD卡吗?有许多被黑客篡改的SD卡。我曾经遇到过这种情况,丢失了许多文件。 - Bing Bang
@BingBang 不可以,因为这些文件是从不同的用户那里收集来的,不是在我的设备上。 - songlj
@AndrewHenle,您是指多线程问题可能会导致基于页面大小的损坏吗?您能否详细说明一下您之前遇到的情况?谢谢。 - songlj
2
我在几个长时间运行的硬件项目中不得不使用SD卡,有一点我可以告诉你,那就是它们被视为易失性存储。简单来说,我们无法依赖它们。SanDisk工业级SD卡是我最不信任的那些,而且它们价格昂贵。普通廉价的SD卡在经过几个吉字节的读写循环后很可能会出现故障。我建议你将代码尝试在其他介质上进行测试(最好是通过USB适配器和供电USB集线器连接硬盘或固态硬盘),看看是否仍然发生损坏。 - user5069935
1
我们从未弄清楚原因。这就像是一个“医生,我这样做会痛”的案例。所以我们停止了那样做。我们猜测可能是磁盘控制器的问题,并且只发生在多线程访问时。如果你正在进行多线程访问,请在所有写操作上放置mutex并查看问题是否解决。或者如@Wossname建议的那样,尝试写入不同的硬件。 - Andrew Henle
显示剩余7条评论
3个回答

3
我在一些嵌入式应用中有一些破坏二进制文件的类似经验。 首先,仔细检查您的文件处理(特别是在多线程环境下),我可以想象您已经彻底地做了这件事。 然后,尝试同步所有写操作。Linux内核不会像您命令应用程序写入数据那样进行写入,而是在刷新到磁盘之前缓冲数据。 http://linux.die.net/man/2/sync 希望这能帮助您。

1

检查你的文件处理,通常这是我的经验中出现问题的地方。


1

文件系统损坏或文件损坏通常是由于“4096字节文件”引起的。

这种损坏是由于ext4文件系统的簇大小等于页面大小。

目前,块的默认大小为4KiB,这是大多数MMU可用硬件上常见的页面大小。这是幸运的,因为ext4代码没有准备处理块大小超过页面大小的情况。

PS

我将使用ext4作为默认文件系统,因为它是基于Linux的操作系统(包括但不限于Android)的默认文件系统。

现在让我们看看4KiB文件为什么会危险,原因很容易理解:

  • 不当的文件处理:在创建、读取、编辑或删除文件时使用错误的程序可能会损坏文件,甚至可能破坏整个文件系统。这些“不当的程序”包括非人类行为和意外情况。(注:这不仅限于4KiB文件)
  • 不当的低级数据处理:虽然不常见,但仍有可能发生。当内核或用户尝试以低级别编辑文件系统时,就会发生这种情况。(您需要进一步调查此案例,因为它应该写在一篇太长的文章中!)
  • 仍然有许多奇怪的方法可以破坏数据,我正在试图保持简洁。其他原因取决于许多因素,因此我提到了Android设备上最常见的原因。

您可以在这里继续阅读:

  • Ext4磁盘布局:一位研究人员需要了解的关于Ext4的所有内容
  • Exfat文件系统:Exfat深入解析!另一个常用的文件系统(甚至在Android上也是如此),被认为过于脆弱!
  • ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接