Traceview を使用してトレースログを検査する

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 を使用してトレースログを開く手順は次のとおりです。

  1. Android Device Monitor を起動します。
  2. Android Device Monitor で、[File] > [Open File] を選択します。
  3. 検査する .trace ファイルに移動します。
  4. [Open] をクリックします。

注: ProGuard を有効にしてビルドされたアプリ(リリースモード ビルド)のトレースログを表示しようとすると、一部のメソッド名やメンバー名が難読化される場合があります。ProGuard mapping.txt ファイルを使用すると、難読化されていない元の名前を把握できます。このファイルの詳細については、ProGuard のドキュメントをご覧ください。

注: コマンドラインから traceview を実行する方法は、サポートが終了しました。

Traceview の概要

トレースログを開くと、Traceview は次の 2 つのパネルを使用してログデータを表示します。

以下のセクションでは、各 Traceview 出力パネルについて詳細に説明します。

タイムライン パネル

タイムライン パネルの拡大図を図 1 に示します。各スレッドの実行状況が、それぞれ個別の行に表示されます。経過時間は左から右に増加しています。各メソッドは、さまざまな色で彩色されます。最初の行の下にある細い行は、選択したメソッドの子(エントリから終了まで)を示しています。

Traceview タイムライン パネル

図 1: Traceview タイムライン パネル

プロファイル パネル

プロファイル パネルには、トレースログの期間中にシステムが実行した各メソッドのリストと、各メソッドの実行にかかった時間が表示されます(図 2 を参照)。別のメソッドを呼び出すメソッドは「親」と呼ばれ、親が呼び出すメソッドは「子」と呼ばれます。メソッドをクリックして選択すると、親と子が 2 つの個別ノードの下に表示されます。

表には、各メソッド(最上位ノード)の包括的時間と排他的時間(単位: ミリ秒)、ならびに合計時間の割合が表示されます。 「排他的時間」とは、メソッドの独自コードの実行に費やされた時間のことを指し、「包括的時間」とは、メソッドの独自コードの実行に費やされた時間と子の実行に費やされた時間とを総計した時間のことを指します。また、CPU 時間と実時間を基準とするタイミング情報もレポートされます。「CPU 時間」は、スレッドがアクティブに CPU 時間を使用している時間だけを対象とし、「実時間」は、スレッドがアクティブであるかスリープ状態であるかに関係なく、アプリがメソッドを入力してからそのメソッドを終了するまでの絶対的タイミング情報を提供します。

プロファイル パネルの各最上位ノードを対象として、表内の [Calls + Rec, Calls/Total] 列(図 2 には表示されていません)は、メソッドの呼び出し数と再帰呼び出しの数をレポートします。また、親メソッドや子メソッドの場合、この列には、対象メソッドが最上位ノード内のメソッドの子または親となった状況下での呼び出し数が表示されます。

Traceview プロファイル パネル

図 2: Traceview プロファイル パネル

Traceview に関する既知の問題

Traceview のロギングではスレッドが正しく処理されないため、次の問題が発生します。

  • プロファイリング中にスレッドが終了した場合、スレッド名は出力されません(Android 5.1 以降は修正済み)。
  • VM はスレッド ID を再利用します。スレッドが停止し、別のスレッドが開始した場合に、同じ ID を取得することがあります。