Android测试了存储空间

m02*_*3u5 8 java filesystems testing android

我写了一个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)
Run Code Online (Sandbox Code Playgroud)

哪里write()将生成不同的文件或附加到单个文件.可能存在一些问题generateDataForSize()和大尺寸,但现在让我们把它放在一边.

让我感到沮丧的是,我必须把它放在我的应用程序中,而且我必须清理那个$%#!手动.好吧,如果我将它放在自己的目录中,我可以在adb shell上用一行丢弃整个东西.

无论如何,有什么比这更容易的方法,我失踪了吗?Android是否为此提供了任何机制,如暂时限制每个应用程序可用的存储空间?任何用于单元测试或android sdk工具的集成解决方案?其他人(你)如何做到这一点?


TL; DR:如何有效地填充fs来测试写入fs的情况.


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

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

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

323*_*3go 19

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

dd if=/dev/zero of=/sdcard/deleteme bs=1m count=1024
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这几乎就是我最终的结果.我通过`adb shell`连接并将fs与"cat-ting"填充了一些垃圾文件. (2认同)
  • 我不得不使用bs = 1m而不是bs = 1M (2认同)