Traceview のサポートは終了しました。Android Studio 3.2 以降を使用している場合は、代わりに CPU Profiler を使用することで、Debug
クラスを使用したアプリのインストルメント化によってキャプチャした .trace
ファイルの検査、新しいメソッド トレースの記録、.trace
ファイルの保存、アプリプロセスのリアルタイム CPU 使用率の検査を行うことができます。
Traceview は、トレースログを視覚的に表示できるツールです。Debug
クラスを使用してコードをインストルメント化することによって、ログを生成できます。トレースデータのロギングを開始する場所や停止する場所をコード内で正確に指定できるため、このトレース方法は非常に正確です。トレースログをまだ生成しておらず、接続したデバイスからローカルマシンに保存していない場合は、アプリをインストルメント化してトレースログを生成するをご覧ください。Traceview を使用したログの検査は、アプリのデバッグやパフォーマンスのプロファイリングに役立ちます。
ヒント: コマンドラインから dmtracedump
を使用すると、トレースログ ファイルのグラフィカルなコールスタック図を生成できます。
トレースログ(Debug
クラスを使用してアプリをインストルメント化することによって記録したログ)を表示する必要がない場合は、Android Studio 3.0 以降に含まれている CPU Profiler を使用して、アプリのスレッドを検査し、メソッド トレースを記録できます。
Traceview を使用してトレースログを開く
Android Studio から Traceview を使用してトレースログを開く手順は次のとおりです。
- Android Device Monitor を起動します。
- Android Device Monitor で、[File] > [Open File] を選択します。
- 検査する
.trace
ファイルに移動します。 - [Open] をクリックします。
注: コード圧縮を有効にしてビルドされたアプリ(リリースビルドなど)のトレースログを表示しようとすると、一部のメソッドとメンバー名が難読化される場合があります。ProGuard の mapping.txt
ファイルを使用すると、難読化されていない元の名前がわかります。このファイルの詳細については、難読化されたスタック トレースのデコードをご覧ください。
注: コマンドラインから traceview
を実行する方法は、サポートが終了しました。
Traceview の概要
トレースログを開くと、Traceview は次の 2 つのパネルを使用してログデータを表示します。
- タイムライン パネル: 各スレッドがメソッドを開始するタイミングと終了するタイミングを示します。
- プロファイル パネル: トレースログ期間にわたる各スレッドの実行状況の概要を示します。
以下のセクションでは、各 Traceview 出力パネルについて詳細に説明します。
タイムライン パネル
タイムライン パネルの拡大図を図 1 に示します。各スレッドの実行状況が、それぞれ個別の行に表示されます。経過時間は左から右に増加しています。各メソッドは、さまざまな色で彩色されます。最初の行の下にある細い行は、選択したメソッドの子(エントリから終了まで)を示しています。
図 1. Traceview タイムライン パネル
プロファイル ペイン
プロファイル ペインには、トレースログの期間中にシステムが実行した各メソッドのリストと、各メソッドの実行にかかった時間が表示されます(図 2 を参照)。別のメソッドを呼び出すメソッドは「親」と呼ばれ、親が呼び出すメソッドは「子」と呼ばれます。メソッドをクリックして選択すると、親と子が 2 つの個別ノードの下に表示されます。
表には、各メソッド(最上位ノード)の包括的時間と排他的時間(単位: ミリ秒)、ならびに合計時間の割合が表示されます。「排他的時間」とは、メソッドの独自コードの実行に費やされた時間のことを指し、「包括的時間」とは、メソッドの独自コードの実行に費やされた時間と子の実行に費やされた時間とを総計した時間のことを指します。また、CPU 時間と実時間を基準とするタイミング情報もレポートされます。「CPU 時間」は、スレッドがアクティブに CPU 時間を使用している時間だけを対象とし、「実時間」は、スレッドがアクティブであるかスリープ状態であるかに関係なく、アプリがメソッドを入力してからそのメソッドを終了するまでの絶対的タイミング情報を提供します。
プロファイル ペインの各最上位ノードを対象として、表内の [Calls + Rec, Calls/Total] 列(図 2 には表示されていません)は、メソッドの呼び出し数と再帰呼び出しの数をレポートします。また、親メソッドや子メソッドの場合、この列には、対象メソッドが最上位ノード内のメソッドの子または親となった状況下での呼び出し数が表示されます。
図 2. Traceview プロファイル ペイン
Traceview に関する既知の問題
Traceview のロギングではスレッドの処理が厳密ではないため、次の問題が発生します。
- プロファイリング中にスレッドが終了した場合、スレッド名は出力されません(Android 5.1 以降は修正済み)。
- VM はスレッド ID を再利用します。スレッドが停止し、別のスレッドが開始した場合に、同じ ID を取得することがあります。