2015-10-20 78 views
5

我写了一个Android应用程序(其中包括)将文件写入磁盘。现在我想知道当文件系统在存储空间之外运行时会发生什么。我想,例如java.io.FileOutputStream.write()将抛出一个IOException,我将不得不赶上。Android测试存储空间

事情是,我不想依赖我的超级忍者的力量 - 我可能忘记了在某处放置试管或者没有正确处理它。因此我想测试这个场景

很遗憾,我找不到任何关于这样做的良好做法 - 甚至不在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是否为此提供了任何机制,例如暂时限制每个应用的可用存储空间?任何集成单元测试soldes或android sdk工具?其他人(你)如何做到这一点?


TL; DR:如何有效的工具和书写到fs时,它的充分的测试情况下,FS。


编辑:我测试未扎根在真实设备上。即使HAXM启动并运行,模拟器也非常慢。可悲的是,使用模拟器不是一种选择。尽管如此,Tasos Moustakas暗示限制了AVD的可用空间,但这一点很不错。我想如果你避免android:installLocation="preferExternal"的问题,并将你的应用程序移动到SD /写入文件到有限的SD,这是一个可接受的解决方案。

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

+0

首先,你在哪里测试你的应用程序? AVD仿真器还是物理设备? –

回答

11

Android在Linux上运行,因此您可以转到shell并使用dd命令填充磁盘。通过USB和类型adb shell连接你的设备,然后

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

编写了一个名为deleteme/sdcard 1GB的文件,全零的。

  • if=是输入文件
  • /dev/zero刚刚返回无尽零。
  • of=是输出文件
  • bs=是块的大小,在这里一兆字节;一些实现更喜欢1M
  • count=是写,这里1024块的数量,这对于一个1GB的文件。

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

+1

这几乎是我最终的结果。我通过'adb shell'连接,并在fs中填入了一些垃圾文件。 – m02ph3u5

+2

我不得不使用BS =1米而不是BS = 1M – vman

+1

@vman - 我也不得不使用BS = 1米,而不是BS = 1M。我编辑了答案来反映这一点。 – markproxy

1

如果您在AVD仿真器上测试您的应用程序,则可以简单地配置仿真器中可用的空间。请参阅documentation。让我知道这个解决方案是否适合你。 以下是您的tutorial关于如何使用Google Play服务的AVD。

+1

感谢您的回复。您应该将问题作为您的答案中的评论。 AVD是一个很好的提示,+1。可悲的是我的应用依赖于模拟器内部不可用的服务。 – m02ph3u5

+0

你指的是什么服务?也许如果你分享一些你的想法你如何走到该解决方案可以是非常有益 –

+0

播放业务和其他GMS服务。 – m02ph3u5

-1

如果程序正在运行仅使POSIX系统调用,您可以使用libfiu进行故障注入之类的东西写调用返回ENOSPC模拟盘满。

另一个技巧是使用FUSE文件系统,比如charybdefs,使您可以在文件系统层面注入故障。