【问题标题】:Android test out of storage spaceAndroid测试存储空间不足
【发布时间】:2015-10-20 16:04:40
【问题描述】:

我编写了一个(除其他外)将文件写入磁盘的安卓应用程序。现在我想知道当文件系统运行存储空间不足时会发生什么。我想例如java.io.FileOutputStream.write() 会抛出一个IOException,我必须抓住它。

问题是,我不想依赖我的超级忍者能力——我可能忘记在某处放置 try-catch 或者没有正确处理它。因此,我想测试这个场景

遗憾的是,我找不到任何关于这方面的良好做法的消息 - 甚至在 SO 上也没有。

当然,我用这样的方式手动填充文件系统:

size = N
dir = /some/path
data = generateDataForSize(size)
while( write(data, dir) );
while( round(size/=2) > 1 )
    write(generateDataForSize(size), dir)

write() 将生成不同的文件或附加到单个文件。 generateDataForSize() 和大尺寸可能存在一些问题,但我们暂时将其放在一边。

让我很头疼的是,我必须把它放在我的应用程序的某个地方,而且我必须清理那个 $%#!手动上去。好的,如果我把它放在它自己的目录中,我可以用 adb shell 上的一行来丢弃整个东西。

无论如何,有没有更简单的方法可以解决我错过的问题? android 是否为此提供了任何机制,例如临时限制每个应用程序可用的存储空间?任何用于单元测试或 android SDK 工具的集成解决方案?其他人(你)如何做到这一点?


TL;DR:如何有效地填充 fs 以测试写满时写入 fs 的情况。


编辑:我正在未植根的真实设备上进行测试。即使 HAXM 启动并运行,模拟器也非常缓慢。遗憾的是,使用模拟器不是一种选择。

不过,Tasos Moustakas 暗示限制 AVD 的可用空间非常棒。我想如果您避免 android:installLocation="preferExternal" 的问题并将您的应用程序移动到 SD / 将文件写入有限的 SD,这是一个可以接受的解决方案。

接受的答案几乎就是我最终所做的。但这仍然需要一些手动工作,因此请随时发布更多答案。

【问题讨论】:

  • 首先,您在哪里测试您的应用程序? AVD 模拟器还是物理设备?

标签: java android testing filesystems


【解决方案1】:

Android 运行在 linux 上,所以你可以进入 shell 并使用dd 命令来填满磁盘。通过 USB 连接您的设备并输入adb shell,然后

dd if=/dev/zero of=/sdcard/deleteme bs=1m count=1024

将一个名为deleteme 的1GB 文件写入/sdcard,全是零。

  • if=是输入文件
  • /dev/zero 只会返回无穷无尽的零。
  • of= 是输出文件
  • bs= 是块大小,这里是一兆;一些实现更喜欢1M
  • count= 是要写入的块数,这里是 1024,相当于 1GB 文件。

调整大小以满足您的需要,或写入多个文件。一旦你达到大约 400MB 的可用空间,Android 就会开始抱怨磁盘空间不足。根据我的经验,Android 早在应用程序崩溃之前就开始抱怨磁盘空间不足。

【讨论】:

  • 这几乎就是我最终的结果。我通过adb shell 连接并在fs 中塞满了“cat-ting”一些垃圾文件。
  • 我不得不使用 bs=1m 而不是 bs=1M
  • @vman - 我还必须使用 bs=1m 而不是 bs=1M。我编辑了答案以反映这一点。
  • 似乎有些实现需要1M 和其他1m
  • 我的三星设备完全忽略了这些字母,始终以字节为单位。我的谷歌设备使用小写字母。绝对完全取决于设备。
【解决方案2】:

如果您在 AVD 模拟器上测试您的应用,您可以简单地配置模拟器中的可用空间。见documentation。让我知道该解决方案是否适合您。 这是您的tutorial,了解如何将 AVD 用于 Google Play 服务。

【讨论】:

  • 感谢您的回复。您应该将问题作为 cmets 放在您的答案中。 AVD 是一个很好的提示,为此 +1。遗憾的是,我的应用程序依赖于模拟器中不可用的服务。
  • 您指的是哪些服务?如果您分享一些关于您如何提出该解决方案的想法可能会非常有帮助
  • 播放服务和其他gms服务。
  • 幸运的是,您可以使用 AVD。查看编辑后的答案
  • 我更新了我的答案。模拟器太慢了,无法在我的机器上进行测试(2007 iMac w/HAXM & x86 image)。
【解决方案3】:

【讨论】:

    【解决方案4】:

    如果正在运行的程序仅进行 POSIX 系统调用,您可以使用 libfiu 执行故障注入,并且诸如写入调用之类的操作会返回 ENOSPC 以模拟磁盘已满。

    另一个技巧是使用 FUSE 文件系统,例如 charybdefs,它允许您在文件系统级别注入故障。

    【讨论】:

      猜你喜欢
      • 2014-12-22
      • 2014-07-01
      • 2018-04-26
      • 1970-01-01
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多