2015-10-20 16 views
5

のディスクにファイルを書き込むアンドロイドアプリを書いた。今では、ファイルシステムがのストレージスペースを使い果たしたときに何が起こるのだろうかと思います。私はそう思う。 java.io.FileOutputStream.write()は私が捕まえなければならないIOExceptionを投げるでしょう。Androidの空き容量が不足している

私のスーパー忍者の力には頼りたくありません。私はtry-catchをどこかに置くことを忘れていたか、正しく処理していないかもしれません。したがってこのシナリオをテストしたい

悲しいことに、悲しいことに、私はそうしても良い練習について何の言葉も見つけられませんでした。私は手動でこのようなもので、ファイルシステムを詰めるコールドもちろん

、私は推測する:

write()が別個のファイルを生成するか、単一のものに追加するか
size = N 
dir = /some/path 
data = generateDataForSize(size) 
while(write(data, dir)); 
while(round(size/=2) > 1) 
    write(generateDataForSize(size), dir) 

generateDataForSize()と大きなサイズでいくつかの問題があるかもしれませんが、今のところそれを置いておきましょう。

私の悩みは、これを私のアプリのどこかに入れなければならないことです。私はその$%#を掃除しなければなりません!手動でさて、私はそれを自分のディレクトリの中に入れて、私はちょうどadbシェル上の1行ですべてを破棄することができます。

とにかく、私は行方不明でこれに行くための簡単な方法はありますか?アンドロイドはアプリごとに利用可能なストレージ容量を一時的に制限するような仕組みを提供していますか?すべて単体テストやアンドロイドSDKツールのソルト?どのように他の人(あなた)がこれを行うのですか?


TL; DR:効率的にそれはいっぱいだとき、FSに書き込みのテストケースのためのFSを詰め込む方法。


編集:私は根付いていない実際のデバイス上でテストしています。エミュレータは、HAXM​​が起動していても致命的に遅くなります。エミュレータを使用すると、悲しいことに、オプションではありません。

AVDに利用できるスペースを制限したTasos Moustakasのヒントは素晴らしいですが、私はあなたがandroid:installLocation="preferExternal"との問題を避けて、あなたのアプリをsdに書き込むか、限られたsdにファイルを書き込むかどうかは、これが受け入れられる解決策だと思います。

私がやったことは、受け入れられた答えはかなりです。しかし、それでもいくつかの手作業が必要なので、もっと答えを投稿してください。

+0

まず、どこアプリをテストするのですか? AVDエミュレータまたは物理デバイス? –

答えて

11

AndroidはLinux上で動作するため、シェルに移動してddコマンドを使用してディスクをいっぱいにすることができます。

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

その後、USBであなたのデバイスを接続し、 adb shellを入力するには、ゼロの完全な /sdcarddeletemeという名前の1GBのファイルを、書きます。

  • if=は、入力ファイル
  • /dev/zeroがちょうど無限のゼロを返します。
  • of=は出力ファイル
  • bs=はブロックサイズ、ここでは1メガバイトです。実装によっては、代わりに1Mが優先されます。
  • count=は1GBのファイルになり、ここで1024年、書き込みブロック数、です。

ニーズに合わせてサイズを調整し、または複数のファイルを書き込みます。約400MBの空き容量があると、Androidのディスク空き容量が不足していると不満を募らせます。私の経験では、Androidは、アプリケーションがクラッシュし始めるずっと前から、ディスクの空き容量が少ないと不満を持ち始めます。

+1

これは私が結局結んだものです。私は 'adb shell 'で接続し、fsに「cat-ting」というゴミ箱ファイルをいくつか入れました。 – m02ph3u5

+2

は私の代わりに、BS = 1M – vman

+1

@vmanのBs = 1メートルを使用していた - 私はまた、代わりに、BS = 1MのBs = 1メートルを使用する必要がありました。私はこれを反映する答えを編集しました。 – markproxy

1

アプリケーションをAVDエミュレータでテストする場合は、エミュレータで使用できる領域を設定するだけです。 documentationを参照してください。その解決策があなたのために働くかどうか私に教えてください。 Google PlayサービスでAVDを使用する方法はtutorialです。

+1

ご返信ありがとうございます。むしろあなたの答えにコメントとして質問を入れるべきです。 AVDのことは大きなヒントです、そのための+1です。残念なことに私のアプリはエミュレータ内で利用できないサービスに依存しています。 – m02ph3u5

+0

あなたはどんなサービスを紹介していますか?たぶんあなたがその解決策を思いついたかのあなたのアイデアの一部を共有すれば、とても役に立ちます。 –

+0

サービスやその他のgmsサービスを再生します。 – m02ph3u5

-1

実行中のプログラムは、POSIXシステムを作っている場合は、書き込み呼び出しはフルディスクをシミュレートするためにENOSPCを返すようにあなたが障害注入、物事を実行するためにlibfiuを使用することができます呼び出します。

もう一つのトリックは、あなたがファイルシステムレベルでの障害を注入することを可能にするなどcharybdefsとしてFUSEファイルシステムを使用することです。

関連する問題