Android電話

[電話] GalaxySの/dbdata を正しく使ってみよう

Amazonのアソシエイトとして、8796.jp管理日誌は適格販売により収入を得ています。

初代の高速化で使った /dbdata ですが、なんのためにあるんでしょうこれ?ってことでまとめ。

単純に名前から考えるとデータベース置き場ですね。 /dbdata/databases/ を見るとアプリケーション名(com.google.android.gm とか)のディレクトリがありその中にはSQLiteのデータベースファイルが入っています(gmail.db とか)あと、shared_prefs ディレクトリに設定ファイルが入ってます。ブラウザだけは特別でキャッシュファイルなども入ってます。

本来 /data/data 以下に置かれているはずの一部データがなぜそんなところにあるのかと。

要するに /data の内部SD領域 /dev/block/mmcblk0 は遅いんです。そんなことはメーカーが一番わかってる。

ここでおさらい。

GalaxySには2種類のフラッシュメモリが搭載されてます。8GBモデルとか16GBモデルの8GBとか16GBは内部的には MMC(SDカード) 扱いです。moviNANDってやつだそうで、MMCコントローラー経由でNANDへのアクセスをします。MMCコントローラーの処理速度はあまり速くないようでプチフリの原因の一つです。PCでSDカードのベンチマークを取ってみればわかりますがランダムアクセスには弱いので、データベースファイルを置くなんてとんでもない。元々写真とか音楽とか1このファイルが大きい物を置く場所として作られているのでしかたない。ポイントは大容量で安い。

このうち約2GBが /data として使われます。残りは /sdcard で内部SD扱いですね。

各モデル共通で載ってるフラッシュメモリが512MBの /dev/block/stl で、いわゆるNANDです。/system とかが入ってます。Nexus OneとかHTCの端末はこれしか無いのでここに /data もあります。CPU直結なのかなんらかのコントローラーが挟まってるかはよく知りませんが MMC とは比べものにならないほど速い。でもどうやら高価っぽいのであんまり沢山積めないっぽいです。

このうち約130MBが /dbdata として使われています。

つまり、 /data に置くと遅くてかなわんファイルは /dbdata に置くようにしてしまおうということです。じゃあ /data/data を /dbdata に置けばいいじゃんってのが初代高速化ですね。容量が限られているため全部置くと空き容量が厳しくなるのでプリインストールされているアプリ(システム含む)のうち限定された40個ちょっとだけを /dbdata に置きましょう。後から勝手に入れたアプリなんて遅くたってシラネーヨってことです。

よく使用するブラウザのキャッシュなど速度が重要なファイルを /dbdata に入れることで欠点を見えにくくして上辺だけ取り繕うところがいかにも(ry

閑話休題

どのアプリのデータベースファイルを /dbdata に置くかというのをどのように決定しているかを調査したところ

/system/etc/purenandpackages.txt
/system/etc/purenandpackages_pref.txt

がありました。ピュア NAND なんて素敵な名前が付いてますが、MMC じゃないよってことだと思います。prefって付いてる方は設定ファイルを /dbdata に逃がすかどうか、そうでない方が SQLite のデータベースファイルを逃がすかどうかの設定です。frameworkなどをばらしてみてみたら既存の API を改造してあるのが散見されました。この条件式を外したら SQLite のデータベースファイルは全部 /dbdata に作られるようになるよなーとかぼんやり眺めたりしたけど時間がないのでまた。

で、どっちも内容はこんな感じ

45
com.android.browser
com.android.mms
以下43行略

1行目に行数。以下にパッケージ名がズラズラ。行数を増やして勝手に「com.aurorasoftworks.quadrant.ui.advanced」を追加。改行コードに注意。最後は改行なし。

追加したら念のため再起動。元々 /data/data にデータがあってもアプリはその存在を忘れるので設定等は初期状態に戻ります。適宜ファイルをコピーしてあげてください。ちゃんと権限もコピーするのも忘れずに。

以下ベンチ。ムシャクシャして色がつくやつ買った。

image  image

おおお、誤差の範囲w

理屈は間違ってないと思うんだけどなぁ…

ちなみに I/O のベンチはアプリのディレクトリにファイルを読み書きするのとSQLiteのデータベースファイルを読み書きする2部構成になってて、今回の話はデータベースファイルのベンチに関わる部分しか関係しません。動きを見ているとデータベースファイルの読み書き部分にかかる時間が短くなっているような気がするんですが数字には影響しないようです。

まあベンチはベンチとして、simeji の辞書学習が有効だと文字確定がだんだん遅くなっていく呪い対策として使えないかと思ったんですが、肝心の writableJAJP.dic と writableEN.dic がソースの中で /data/data/com.adamrocker.android.input.simeji 以下の 固定パスで指定されていてスマートな解決策が見つからずにしょんぼり。実際に /dbdata 以下に dic ファイルを逃がすと確定で固まるのが改善されたので意味はあると思うんだ。うん。

ドコモ版でsimeji入れてみたけど固まらないよ!!っていうのは使い込みが甘いからだと思うんだ。しばらくするときっと確定時にぷちぷち固まるようになると思う。それを回避するには学習を切るか root 取って /dbdata に逃すかみたいな話題になると未来予想。外れるほど改善されてたら原因を知りたいw

サムスンの日本語IMEはきっと /dbdata に辞書とか置くようにしてると思うので、変換は速いし固まりもしないのに simeji はなんだとか叩かれたら気の毒に存じます。

/dbdata/databases は権限が777だから勝手に書き込めそうな気がするからそのディレクトリがあればそっちに辞書を置くとかしてくれると素敵なんだけどなんか制限あるのかな?時間があったら検証したい

 

結論としては SQLiteのデータファイルを多用するアプリがあれば purenandpackages.txt に追記すればきっと体感は高速化する!…はず

 

例えば ADW.Launcher を追加するとホームにショートカットやウィジェットを追加したり削除したりするときの挙動が明らかに速くなります。

purenandpackages.txt の1行目の数字を増やして以下を追加して再起動すると有効になると思います

org.adw.launcher

アプリによって効果が違いますが、お手軽でリスクの少ない高速化です。

タイトルとURLをコピーしました