lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

アプリをインストルメント化してトレースログを生成する

アプリの実行のメソッド トレースを生成するために、Debug クラスを使用して、アプリをインストルメント化できます。 この方法でアプリをインストルメント化すると、端末がトレース情報の記録を開始および停止する正確なタイミングをより細かく制御できます。 また、端末では指定された名前でトレースログが保存されるため、後で各ログを簡単に特定できます。 その後、Android Studio または Traceview を使用して、各トレースログを表示できます。

アプリのコードをインストルメント化する必要がない、アプリをトレースするもう 1 つの方法は、Android Studio の CPU Profiler を使用して、メソッド トレースを開始して停止することです。 詳細については、CPU Profiler を使用して CPU Activity とメソッド トレースを検査するをご覧ください。

トレースログの生成を開始する前に、アプリがトレースログを端末に保存できるようにするために、外部ストレージに書き込むパーミッション(WRITE_EXTERNAL_STORAGE)がアプリにあることを確認してください。

アプリをインストルメント化する

トレースログを生成するには、トレースデータのログ記録の開始を指示する startMethodTracing() を呼び出します。

この呼び出しで、.trace ファイルの名前を指定すると、ターゲット端末上の永続的なアプリデータが保存されるパッケージ固有のディレクトリにそのファイルを保存できます。このディレクトリは、getExternalFilesDir() が返すディレクトリと同じであり、ほとんどの端末の ~/sdcard/ ディレクトリにあります。 このファイルには、メソッド トレースのバイナリデータと、スレッド名とメソッド名のマッピング テーブルが含まれます。 トレースを停止するには、stopMethodTracing() を呼び出します。

次のサンプルは、sample.trace という名前のトレースログの記録を開始して停止します。

// Starts recording a trace log with the name you provide. For example, the
// following code tells the system to start recording a .trace file to the
// device with the name "sample.trace".
Debug.startMethodTracing("sample");
...
// The system begins buffering the generated trace data, until your
// application calls stopMethodTracing(), at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing();

トレースログの名前を変更せずに、アプリで startMethodTracing() を再度呼び出した場合、端末に保存された既存のログが上書きされることに注意してください。 各トレースログの名前を動的に変更する方法の詳細については、複数のログの保存に関するセクションをご覧ください。

stopMethodTracing() を呼び出す前に、システムが最大バッファサイズに到達した場合は、トレースが停止し、通知がコンソールに送られます。 トレースの開始と停止を行うメソッドは、アプリプロセス全体で機能します。 つまり、activity の onCreate(Bundle) メソッドで startMethodTracing() を呼び出し、その activity の onDestroy() メソッドで stopMethodTracing() を呼び出すことができます。

プロファイリングを有効にすると、アプリの実行速度が遅くなることに注意してください。 つまり、プロファイリング データを使用して、絶対的なタイミング(「メソッド foo() の実行に 2.5 秒かかる」ことなど)を決定することはできません。 トレースログのタイミング情報は、以前のトレースログと比較した場合にのみ有用であり、その場合、最近の変更によりアプリの速度が速くなったか、遅くなったかを確認することができます。

Android 5.0(API レベル 21)以降を実行している端末にデプロイするときに、サンプルを基にしたプロファイリングを使用すると、実行時のパフォーマンスへの影響を抑えてプロファイルすることができます。 サンプルを基にしたプロファイリングを有効にするには、サンプリング間隔を指定して(startMethodTracing() を呼び出す代わりに)startMethodTracingSampling() を呼び出します。 システムは、アプリが stopMethodTracing() を呼び出すまでサンプルを定期的に収集します。

複数のログを保存する

トレースログの新しい名前を指定せずに、アプリがメソッド トレースを何回も開始して停止すると、端末では、古いトレースログが新しいトレースログで上書きされます。つまり、最新のトレースログのみが保持されます。 端末に複数のトレースログを保存するには、アプリが startMethodTracing() を呼び出すたびにトレースログの名前を動的に変更します。 以下のサンプルでは、SimpleDateFormat クラスを使用して、各トレースログに名前を付けるときに現在の日時を追加しています。

// Uses the SimpleDateFormat class to create a String with
// the current date and time.
SimpleDateFormat date =
        new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss");
String logDate = date.format(new Date());
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing(
        "sample-" + logDate);

端末でトレースログにアクセスする

端末にトレースログが作成された後、次のいずれかの方法でそのファイルにアクセスできます。

  • Device File Explorer を使用します。 Device File Explorer を開くには、[View] > [Tool Windows] > [Device File Explorer] をクリックします(または、ツール ウィンドウ バーにある Device File Explorer ボタンをクリックします)。 図 1 に示すように、アプリのパッケージ固有のディレクトリに移動して .trace ファイルを見つけることができます。

    図 1 Device File Explorer を使用してトレースログを見つけます。

    • 図 2 に示すように、IDE のエディタ ウィンドウ内にトレースログをすばやく表示するには、ファイルをダブルクリックします。 また、ファイルを右クリックして、ローカル ディスクに保存してから、Traceview を使用して、親メソッドと子メソッド、メソッド呼び出しごとの平均実行時間、CPU 時間と実時間など、詳細な情報を調べることができます。 ログファイルが表示されない場合は、ファイルの表示が想定されるディレクトリを右クリックして、[Synchronize] を選択してみてください。

      図 2 Android Studio で .trace ファイルを表示します。

  • adb pull コマンドを使用して、ファイルをローカルマシンにコピーします。 以下のコマンドは、sample.trace という名前のトレースログを端末からローカルマシンの ~/Documents/trace-logs/ ディレクトリにコピーします。 その後、Traceview を使用して、.trace ファイルを表示できます。

    adb pull path-on-device/sample.trace ~/Documents/trace-logs/