Traceview

Android SDKには最初から使えるプロファイリング用のツールが添付されている。
Traceview: A Graphical Log Viewer

ドキュメントを読めば解るが、取りあえずの計測の仕方は簡単。

// start tracing
Debug.startMethodTracing();

〜 計測したいロジック 〜

// stop tracing
Debug.stopMethodTracing();

これで計測範囲の間のメソッドの実行情報は全てログファイルに収集される。(開始メソッドの引数でログファイルの名前を指定することもできる)

Traceview(Windowsの場合は$SDK_ROOT/tools/Traceview.bat)は、表示するログファイルへのフルパスをパラメタで与える必要がある(TraceviewにはGUIメニューすらない)が、上記の仕掛けで収集したログファイルは、実機かエミュレータのSD cardイメージ上にできるため※エミュレータの場合であれば、SD cardイメージからログファイルを吸い出す必要がある。

では、Traceviewを起動してみよう。

  • Traceview e:\dmtrace.trace

一般的なプロファイラを使ったことがある開発者であれば、収集、表示されている情報がどんな意味を持つかはすぐに解るだろう。
横軸はスレッドがタイムラインでどんな処理がどれだけ動いたかが視覚的に表現されており、時間の範囲をマウスでドラッグすることで、その範囲を拡大することができる。

  • タイムライン拡大時

それぞれの行はドリルダウンが可能であり、プロファイル値は表示されているカラムで昇順/降順のソートができる。


最近のPC、O/Sではリソースにかなり余裕があるので、一般的なフロントエンド用途のクライアントアプリケーションではそれほどチューニングに気を遣う必要は無くなった間があるが、Androidは最新とはいえどもあくまでMIDプラットホームであり、PCに比べれば非力なCPU、限られたメモリ、インタプリタ上で動作する訳で、気を遣わなくてはならない点が多く、プロファイラは手放せないだろう。

特定のパッケージを隠すことができない、コールスタックを限定できない等、欲を言えばもう少し使い勝手が良くなって欲しいが、ADTから起動することもできるし、今後ブラッシュアップされていくことだろう。

(プロセス毎にプロファイリングの開始/停止を行うため、タイミング等若干使いづらい)


なお、上記のプロファイリングデータを収集してログファイルに出力する場合、パーミション"WRITE_EXTERNAL_STORAGE"をAndroidManifest.xmlに付加しなくてはならない。(Android 1.6以降)

  • AndroidManifest.xml
 
 

上記パーミションが設定されていない場合、以下のエラーが出てアプリケーションが実行できない。

Unable to open trace file '/sdcard/dmtrace.trace': Permission denied


エミュレータの場合、事前にSD cardイメージをエミュレータに作っておく必要がある。