Android测试存储空间

时间:2015-10-20 16:04:41

标签: java android testing filesystems

我写了一个Android应用程序(除此之外)将文件写入磁盘。现在我想知道当文件系统超出存储空间时会发生什么。我想这就是java.io.FileOutputStream.write()将抛出IOException,我将不得不抓住。

问题是,我不想依靠我的超级忍者力量 - 我可能忘记在某个地方放一个尝试捕捉或者不能正确处理它。因此我想测试这种情况

可悲的是,我没有找到关于这样做的良好做法的任何消息 - 甚至在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时的情况。

编辑:我正在测试一个没有root权限的真实设备。即使HAXM启动并运行,仿真器也非常慢。遗憾的是,使用模拟器不是一种选择。

但是,Tasos Moustakas暗示限制AVD的可用空间是很好的。我想如果你避免android:installLocation="preferExternal"的问题并将你的应用程序移动到sd / write文件到有限的sd,这是一个可接受的解决方案。

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

4 个答案:

答案 0 :(得分:16)

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=是块大小,这里是1兆字节;有些实现更喜欢1M
  • count=是要写入的块数,此处为1024,这样可生成1GB的文件。

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

答案 1 :(得分:1)

如果您在AVD模拟器上测试应用程序,则只需配置模拟器中的可用空间即可。见documentation。如果该解决方案适合您,请告诉我。 以下是关于如何将AVD用于Google Play服务的tutorial

答案 2 :(得分:0)

答案 3 :(得分:-1)

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

另一个技巧是使用诸如charybdefs之类的FUSE文件系统,它允许您在文件系统级别注入错误。