安卓测试存储空间不足

2022-09-03 04:29:12

我写了一个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的情况。


编辑:我正在一个没有扎根的真实设备上进行测试。即使启动并运行 HAXM,模拟器的速度也非常慢。可悲的是,使用模拟器不是一种选择。

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

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


答案 1

Android在Linux上运行,因此您可以转到shell并使用该命令来填充磁盘。通过 USB 连接设备并键入 ,然后ddadb shell

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

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

  • if=是输入文件
  • /dev/zero只是返回无穷无尽的零。
  • of=是输出文件
  • bs=是块大小,这里是一兆字节;有些实现更喜欢。1M
  • count=是要写入的块数,此处为1024,这构成了一个1GB的文件。

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


答案 2

如果在 AVD 模拟器上测试应用,则只需配置模拟器中的可用空间即可。请参阅文档。让我知道该解决方案是否适合您。这是有关如何将AVD用于Google Play服务的教程