The Android Developer Challenge is back! Submit your idea before December 2.

Systrace レポートを操作する

このガイドでは、Systrace レポートの操作や解釈の方法について説明します。

一般的なレポートの要素

Systrace は、複数のセクションで構成される出力 HTML ファイルを生成します。レポートには、各プロセスのスレッドがリスト表示されます。対象のスレッドが UI フレームをレンダリングしている場合、レポートは、レンダリングされたフレームもタイムラインに沿って表示します。レポートの左から右に、時間が進みます。

レポートは、上から下に、以下のセクションで構成されています。

ユーザー操作

最初のセクションには、アプリやゲーム内のユーザー操作(デバイス画面のタップなど)を示すバーが表示されます。このようなインタラクションは、有用な時間マーカーとして機能します。

CPU アクティビティ

次のセクションには、各 CPU 内のスレッド アクティビティを示すバーが表示されます。アプリやゲームを含むすべてのアプリの CPU アクティビティがバーとして表示されます。

CPU アクティビティ セクションは展開することが可能で、各 CPU のクロック周波数を表示できます。CPU アクティビティ セクションを折りたたんだ状態の例を図 1 に示します。セクションを展開してクロック周波数を表示したバージョンを図 2 に示します。

Systrace レポートのスクリーンショット
図 1: Systrace レポート内の CPU アクティビティの例(折りたたみビュー)

Systrace レポートのスクリーンショット
図 2: Systrace レポート内の CPU アクティビティを展開して CPU クロック周波数を表示した例(展開ビュー)

システム イベント

このセクションのヒストグラムには、テクスチャ数や特定オブジェクトの合計サイズなど、システムレベルの個々のイベントが表示されます。

特に詳細にチェックする価値のあるヒストグラムは、「SurfaceView」というラベルの付いたヒストグラムです。このカウントは、ディスプレイ パイプラインに渡されてからデバイスの画面に表示されるのを待機している合成フレーム バッファの数を示します。大半のデバイスはダブルバッファまたはトリプル バッファであるため、このカウントはほとんどの場合、0、1、2 のいずれかになります。

VSync イベントや UI スレッドのスワップ処理など、Surface Flinger プロセスを示す他のヒストグラムの例を図 3 に示します。

Systrace レポートのスクリーンショット
図 3: Systrace レポート内の Surface Flinger グラフの例

表示フレーム

このセクションは、多くの場合、レポートの中で最も高さのある部分で、さまざまな色で彩色された行があり、その下部に複数のバーが多段表示されます。この形状は、作成された特定のスレッドのステータスとフレーム スタックを示しています。スタックの各段は、beginSection() 呼び出しか、アプリやゲーム用に定義したカスタム トレース イベントの開始を示します。

バーの各スタックの上部にある多色の行は、対象スレッドのステータスの経時的変化を示します。行の各セグメントは、次のいずれかの色で彩色されています。

緑色: 実行中
スレッドは、プロセスに関連する作業を完了しているか、割り込みに応答しています。
青色: 実行可能
スレッドは実行可能な状態ですが、現在はスケジュール設定されていません。
白色: スリープ中
スレッドは、実行すべき作業を持っていません。おそらく、ミューテックス ロックによってブロックされています。
オレンジ色: 割り込み不可能なスリープ
スレッドは、I/O によってブロックされているか、ディスク操作の完了を待機しています。
紫色: 割り込み可能なスリープ
スレッドは、別のカーネル操作(通常はメモリ管理)によってブロックされています。

キーボード ショートカット

Systrace レポートの表示中に使用可能なキーボード ショートカットのリストを下記の表に示します。

キー 説明
W トレース タイムラインにズームインします。
A トレース タイムラインを左にパンします。
S トレース タイムラインからズームアウトします。
D トレース タイムラインを右にパンします。
E 現在のマウスの位置にトレース タイムラインを配置します。
M 現在の選択をフレーミングします。
1 現在アクティブな選択モデルを「select」モードに変更します。マウスセレクタ ツールバーに表示される 1 番目のボタンに対応します(右の画像を参照)。 Systrace レポート内のマウスセレクタ ツールバーのスクリーンショット
2 現在アクティブな選択モデルを「pan」モードに変更します。マウスセレクタ ツールバーに表示される 2 番目のボタンに対応します(右の画像を参照)。 Systrace レポート内のマウスセレクタ ツールバーのスクリーンショット
3 現在アクティブな選択モデルを「zoom」モードに変更します。マウスセレクタ ツールバーに表示される 3 番目のボタンに対応します(右の画像を参照)。 Systrace レポート内のマウスセレクタ ツールバーのスクリーンショット
4 現在アクティブな選択モデルを「timing」モードに変更します。マウスセレクタ ツールバーに表示される 4 番目のボタンに対応します(右の画像を参照)。 Systrace レポート内のマウスセレクタ ツールバーのスクリーンショット
G 現在選択されているタスクの始まりにグリッドを表示します。
Shift+G 現在選択されているタスクの終わりにグリッドを表示します。
左矢印 現在選択されているタイムライン上で前のイベントを選択します。
右矢印 現在選択されているタイムライン上で次のイベントを選択します。

パフォーマンスに関する問題を調査する

Systrace レポートを操作して、記録された期間のデバイス CPU 使用率を検査できます。HTML レポートの操作方法については、キーボード ショートカットをご覧ください。また、レポートの右上隅にある [?] ボタンをクリックすると、ヘルプが表示されます 。

以下のセクションでは、レポート内の情報を検査し、パフォーマンスに関する問題を見つけて解決する方法について説明します。

パフォーマンスに関する問題を識別する

Systrace レポートを操作している際、以下のような設定を行うことで、パフォーマンスに関する問題を簡単に見つけることができます。

  • 時間間隔の周囲に長方形を描画することで、目的の時間間隔を選択できます。
  • ルーラーツールを使用して、問題のある領域のマーキングやハイライト表示ができます。
  • [View Options] > [Highlight VSync] をクリックすることで、各ディスプレイ更新操作を表示できます。

UI フレームとアラートを検査する

図 4 に示すように、Systrace レポートは、UI フレームをレンダリングする各プロセスをリスト表示し、レンダリングされた各フレームをタイムラインに沿って示します。安定した 60 フレーム/秒を維持するのに必要とされる 16.6 ミリ秒以内でレンダリングされたフレームは、緑色のフレーム サークルで示されます。レンダリングに 16.6 ミリ秒より長い時間がかかったフレームは、黄色または赤色のフレーム サークルで示されます。

フレームのビューにズームイン
図 4: 長期フレームにズームインした後の Systrace の表示

フレーム サークルをクリックするとハイライト表示され、アラートを含め、そのフレームをレンダリングするためにシステムが行った作業に関する追加情報が提供されます。また、そのフレームのレンダリング中にシステムが実行したメソッドもレポートに表示されます。このようなメソッドを調査することで、UI ジャンクの潜在的原因について判断することができます。

問題のあるフレームを選択
図 5: 問題のあるフレームを選択すると、問題を識別するアラートがトレース レポートの下部に表示される

遅いフレームを選択すると、レポートの下部パネルにアラートが表示されることがあります。図 5 に示されているアラートの場合、このフレームに関する最も重要な問題は、ListView のリサイクルと再バインドに時間がかかりすぎていることです。トレース内の関連イベントへのリンクをクリックすると、この期間中にシステムが何をしていたのか詳細な説明を表示することができます。

ツールがトレース内で検出した各アラートの内容や、デバイスが各アラートをトリガーした回数を表示するには、ウィンドウの右端にある [Alerts] タブをクリックします(図 6 を参照)。[Alerts] パネルでは、トレース中に発生した問題の内容や、その問題がジャンクに寄与した頻度を確認できます。このパネルは、修正すべきバグのリストと考えることができます。1 つの領域で小さな変更や改善を行うだけで、アラートセット全体が削除されることもよくあります。

[Alerts] タブを表示
図 6: [Alert] ボタンをクリックすると、[Alerts] タブが表示される

UI スレッド上で行われている作業が多すぎる場合は、次のいずれかの方法を使用することで、CPU 時間を過度に消費しているメソッドを判断できます。

  • ボトルネックの原因となっているメソッドに心当たりがある場合は、そのメソッドにトレース マーカーを追加します。詳細については、コード内でカスタム イベントを定義する方法をご覧ください。
  • UI ボトルネックの原因が不明な場合は、Android Studio 内で利用可能な CPU Profiler を使用します。CPU Profiler を使用すれば、トレースログを生成して、インポートや検査を行うことができます。