October 17 Mon, 2011
HTC Incredible / Android で Low on space 警告が頻発する原因判明
Posted by yoosee on Android at 2011-10-18 08:16 JST1 Android でのアプリケーションデータ領域の使われ方とIncredibleでの「癖」
HTC Droid Incredible を去年の夏から使い始め、大体 120 前後のアプリをインストールして使っている。アプリインストール領域である Phone Storage はこの端末では 748MiB あることになっているのだが、何故か 250-300MB 程度アプリをインストールした時点で Low on space (空き容量不足) 警告が出る症状が、かなり前から続いていた。警告発生時も空き容量は500MB以上残っており、SDカードにアプリを退避させても殆ど効果が無い。Android 2.3 Gingerbread に上がった際にマシになったかと思ったのだが、残念ながら気のせいだったようだ。こいつの原因は何だろうとしばらく色々調べていたのだが、どうもこの機種の Partition 構成に癖があるのが原因らしい。Androidでは通常、アプリケーションは /data というシステムディレクトリにインストールされ、アプリケーションが利用するデータは /data/data に収納されている。他の機種は分からないが、Incredible ではこれが別々のパーティションになっている。
/data: 765992K total, 228860K used, 537132K available (block size 4096) /data/data: 152576K total, 118348K used, 34228K available (block size 4096)見ての通り、/data は 748MiB の容量があるが、/data/data はそれとは別に 149MB の容量が割り当てられている。この状況により、アプリケーションのインストール領域である /data にまだ空きが十分ある状態でも、アプリのデータが /data/data を消費して残り容量が概ね 14MB (恐らく10%)を切った辺りで Low on space が出てしまう。SDカードに退避をかけても移動するのは主に /data のファイルなのでこの状況には効果が無い。質が悪いのは Android からの notification や Setting の Storage use を見てもこれが分かりようがないことである。
何故こんなことになっているのかだが、mount の情報を見ると
/dev/block/mmcblk0p1 /data ext3 rw,nosuid,noatime,nodiratime,errors=continue,data=writeback 0 0 /dev/block/mtdblock6 /data/data yaffs2 rw,nosuid,nodev,relatime 0 0/data のファイルシステムは ext3 だが /data/data は yaffs2 になっている。yaffs2 は NANDフラッシュ用のファイルシステムで、恐らく /data/data はアプリケーションのデータが常時更新を受けるのでそれに向いたファイルシステムを選んでいるのだろう。であれば別に /data も丸ごと yaffs2 にしてくれればいい気もするんだが、見ると /data は MMCblk だが /data/data は MTDblock (Memory Technology Device) になっていてデバイスタイプからして違うようだ。この理由はよく分からない。
2 Low on space (上記ケース) の緩和策
さてこういう状況なので、根本解決はパフォーマンスや寿命の劣化を覚悟でパーティションを切り直すとかの相当荒っぽい方法しかなく、通常は状況緩和策として /data/data の使用量を減らすことになるだろう。この端末の場合、内訳を見てみると com.android.providers.contacts (Contacts Storage) が 12MB 以上の容量を食っていた。実際の住所情報であろう contact2.db はせいぜい3,4MB 程度なのだが、それとは別に大量に .../thumbnail_photo_1234.jpg のようなファイルが存在している。
どうもこれは Facebook や Google 等から持ってきたプロフィール写真らしく、しかも見た感じ、最新のものだけでなく古いものも消さずに取ってあるようだ。とりあえずこれを Settings > Applications > Storage use > Contacts Storage から Clear Data で全て消して再同期させたところ、Data が 5MB 程度まで減ってくれて、これでようやく Low on space 警告が一旦消えてくれた。
これ以外では、以下のような方法がケースバイケースではあるが効果があった。当然だが実施に置いてはバックアップを取るのと合わせて必要なデータを消さないよう注意の上、自己責任でどうぞ。
- 使っていないアプリ・使わなくなったアプリの Data を消す: 特に他のアプリで置き換えした標準アプリなど。ただ自動起動時にまたデータを消費される事もある
- 実データがクラウド側にあるアプリの Data を一旦削除して同期しなおす: 恐らくcache がゴミとして溜まっていることがある。例えばだが ゆけ!勇者 0.9.5 では数MB程度が掃除できた
- anr_history.txt (Dalvik の作る dump file) と言うファイルがある場合、恐らく必要が無いので削除。私は数度 htc アプリのものを消したが今のところ問題は出ていない
- 不要なプレインストールアプリのアップデートを削除: Adobe Flash や Adobe Reader の update は library (.so) が何故か /data/data 以下にそれぞれ 5-8MB ものサイズでインストールされる
- 不要なアプリを削除: SDカードに退避しても Data が残っている限りこの問題は解決しないので、Data 利用が大きいものは削除する事も考えた方がいいかも。特にゲームに多い