web-dev-qa-db-ja.com

Androidデバイスでのバイナリファイルの破損の考えられる理由は何ですか?

最近、バイナリファイルの破損の理由を調査しています。具体的には、Androidアプリ、ネイティブ部分はSDカード上のバイナリファイルの読み取り/書き込みが可能です。不明な理由でバイナリファイルが破損することがあります。これらのファイルの一部をさまざまなユーザーから収集しました。 、そしていくつかの興味深い事実を見つけました。

破損の大部分の種類の1つは、バイナリファイルの最初の4096バイトが消去されることです。これらのファイルを16進ダンプすると、最初の4096バイトはすべてゼロになります。 4096以下または4096未満ですが、正確には4096バイトです。これは偶然ではないと思います。 4096バイトは1ページサイズです。しかし、経験が不足しているため、理由がわかりません。さらに重要なことに、他のユーザーやデバイスでそのようなことを回避する方法がわかりません。

それに加えて、いくつかのバイナリファイルの途中に、いくつかの連続したゼロセグメントもありますが、そこにあるべきではありません。それが私たちのプログラムのバグではない場合、プラットフォーム/デバイスカーネル、またはデバイスのような他の何かが突然電源を切ったことに関連する可能性のある理由はありますか?

同様の状況を経験した人が、ヒント/アドバイス/解決策などを教えてくれることを願っています。これは本当に私を混乱させました。

どうもありがとう〜

13
songlj

私は、バイナリを破壊するいくつかの組み込みアプリケーションでいくつかの同様の経験を持っています。まず、ファイル処理を再確認します(特にマルチスレッド環境で)。完全に実行したと思います。次に、すべての書き込みを同期してみます。 Linuxカーネルは、アプリに書き込みを指示しても書き込みを行いませんが、ディスクにフラッシュする前にデータをバッファリングします。

http://linux.die.net/man/2/sync

お役に立てれば。

3
Nikilator

私の経験では通常問題となるファイル処理を確認してください

1
massex12

壊れたファイル、または壊れたファイルシステムでさえ、「4096バイトのファイル」によって奇妙に引き起こされます。

この破損は、ページサイズと等しいext4ファイルシステムのクラスターサイズが原因です。

現時点では、ブロックのデフォルトサイズは4KiBです。これは、ほとんどのMMU対応ハードウェアで一般的にサポートされているページサイズです。ブロックサイズがページサイズを超える場合を処理するためにext4コードが準備されていないため、これは幸運です。

PS

LinuxベースのOS(Androidを含むがこれに限定されない)のデフォルトのファイルシステムであるext4を使用しています

4KiBファイルが危険である理由について説明します。理由は簡単に理解できます。

  • 不適切なファイル処理:ファイルの作成、読み取り、編集、または削除の手順を間違えると、ファイルが損傷し、ファイルシステム全体と一緒に破損する可能性があります。これらの「不適切な手順」には、人間以外の行動や事故が含まれます。 (追記:これは4KiBファイルに限定されません)
  • 不適切な低レベルのデータ処理:一般的なケースではありませんが、それでも可能です。これは、カーネルまたはユーザーがファイルシステムを低レベルで編集しようとしているときに発生します。 (このケースは長すぎる記事に書かれているはずなので、さらに調査する必要があります!)
  • データを壊すための奇妙な方法はまだたくさんあります。私は簡潔にしようとしています。他の理由は多くの要因に依存しているので、Androidデバイスでのその問題の最も一般的な原因について説明しました。

あなたはここでもっと読み続けることができます:

1
Omar El Don