2015-10-20 49 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,使您可以在文件系統層面注入故障。