トレースを記録する

トレースの記録を開始するには、CPU Profiler の上部または下部いずれかのプルダウン メニューで記録構成を選択して、[Record] をクリックします。

図 1. CPU Profiler では実施中の記録のステータス、継続時間、種類が表示されます。

アプリを操作して、終了したら [Stop] をクリックします。図 2 に示すように、プロファイラのトレースペインにトレース情報が自動的に表示されます。

図 2. メソッド トレースを記録した後の CPU Profiler。

  1. 選択範囲: トレースペインで検証する記録時間の一部を決定します。メソッド トレースを初めて記録するとき、CPU Profiler は自動的に CPU タイムラインの記録全体を選択します。記録された時間範囲の一部だけについてトレースデータを調べるには、ハイライトされた領域の端をドラッグします。
  2. インタラクション セクション: タイムラインでのユーザー インタラクション イベントとアプリ ライフサイクル イベントが表示されます。
  3. Threads セクション: タイムライン上のすべてのスレッドについて、スレッド状態のアクティビティ(実行中やスリープ中など)と [Call Chart](システム トレースのトレース イベント グラフ)が表示されます。
    • タイムライン内を移動するには、マウスとキーボード ショートカットを使用します。
    • スレッド名をダブルクリックするか、スレッドを選択して Enter キーを押すと、スレッドを展開または折りたたむことができます。
    • スレッドを選択すると、分析ペインに詳細情報が表示されます。複数のスレッドを選択するには、Shift キーまたは Ctrl キー(Mac の場合は command キー)を押しながら選択します。
    • メソッド呼び出し(またはシステム トレースのトレース イベント)を選択すると、分析ペインに詳細情報が表示されます。
  4. 分析ペイン: 選択した時間範囲と、スレッドまたはメソッド呼び出しのトレースデータが表示されます。このペインでは、各スタック トレースの表示方法を(分析タブを使用して)選択したり、実行時間の測定方法を(タイム リファレンスのプルダウン メニューを使用して)選択したりできます。
  5. 分析ペインのタブ: トレースの詳細の表示方法を選択します。各オプションについて詳しくは、トレースを検証するをご覧ください。
  6. タイム リファレンスのメニュー: 次のいずれかを選択して、各呼び出しの計時情報を測定します(Sample/Trace Java Methods でのみサポートされます)。
    • Wall clock time: 計時情報が実際の経過時間を表します。
    • Thread time: 計時情報として、実際の経過時間からスレッドが CPU リソースを消費していない時間を引いた時間を表します。Thread time はすべてのメソッドで常に Wall clock time 以下になります。Thread time を使用すると、特定のメソッドまたは関数によるスレッドの実際の CPU 使用率について詳しく把握できます。
  7. フィルタ: 関数、メソッド、クラス、パッケージ名でトレースデータをフィルタします。たとえば、特定の呼び出しに関連するトレースデータをすばやく見つけるには、検索フィールドに名前を入力します。[Flame chart] タブでは、検索クエリに一致する呼び出し、パッケージ、クラスを含むコールスタックがハイライト表示されます。[Top down] タブと [Bottom up] タブでは、このコールスタックは他のトレース結果よりも優先されます。検索フィールドの横にあるチェックボックスをオンにして、次のオプションを有効にすることもできます。
    • Regex: 検索に正規表現を含める場合は、このオプションを使用します。
    • Match case: 検索クエリで大文字と小文字を区別する場合は、このオプションを使用します。
ヒント: [Threads] タイムラインを検査する際は、次のショートカットを使用できます。
  • ズームイン: Ctrl キー(Mac の場合は command キー)を押しながら、W キーを押すかマウスホイールをスクロールします。
  • ズームアウト: Ctrl キー(Mac の場合は command キー)を押しながら、S キーを押すかマウスホイールを後方にスクロールします。
  • 左にパン: Space キーを押しながら、A キーを押すかマウスを右にドラッグします。
  • 右にパン: Space キーを押しながら、D キーを押すかマウスを左にドラッグします。
  • スレッドを展開または折りたたむ: スレッドを選択して、スレッド名をダブルクリックするか Enter キーを押します。

記録構成を選択する

トレース情報の記録を始める前に、取得したいプロファイリング情報の記録構成を適切に選択してください。

  • Sample Java Methods: アプリの Java ベースのコード実行中に、アプリのコールスタックを頻繁に取得します。プロファイラは取得したデータセットを比較し、アプリのコード実行に関するタイミングとリソース使用量情報を導き出します。

    サンプリング ベースのトレースに固有の問題として、コールスタックの取得後にアプリで開始されたメソッドが次のコールスタックの取得前に終了した場合、そのメソッド呼び出しがプロファイラのログに記録されない問題があります。このようなライフサイクルの短いメソッドを追跡する場合は、インストルメント化されたトレースを使用する必要があります。

  • Trace Java Methods: アプリを実行時にインストルメント化して、各メソッド呼び出しの最初と最後にタイムスタンプを記録します。計時情報や CPU 使用率などのメソッド トレースデータを生成するために、タイムスタンプが収集、比較されます。

    各メソッドのインストルメント化に伴うオーバーヘッドにより、実行時のパフォーマンスが低下し、プロファイリング データに影響がおよぶ場合があるので注意してください。これは、ライフサイクルが比較的短いメソッドの場合に顕著です。また、アプリが短時間で多数のメソッドを実行すると、プロファイラがファイルサイズの制限をすぐに超えてしまい、それ以上トレースデータを記録できなくなる可能性があります。

  • Sample C/C++ Functions: アプリのネイティブ スレッドのサンプル トレースを取得します。この構成を使用するには、Android 8.0(API レベル 26)以降を搭載しているデバイスにアプリをデプロイする必要があります。

    内部的には、この構成は simpleperf を使用して、アプリのネイティブ コードをトレースします。特定のデバイス CPU をサンプリングする場合や、高精度のサンプリング期間を指定する場合など、simpleperf の追加オプションを指定するには、simpleperf をコマンドラインから使用します。

  • Trace System Calls: アプリがシステム リソースをどのように使用しているか検査できる詳細情報を取得します。スレッドの状態の正確なタイミングと継続時間を調べたり、すべてのコアにおいて CPU ボトルネックが発生している箇所を視覚化したり、カスタム トレース イベントを追加して分析したりできます。このような情報は、パフォーマンスの問題を解決する際に重要です。この構成を使用するには、Android 7.0(API レベル 24)以降を搭載しているデバイスにアプリをデプロイする必要があります。

    このトレース構成を使用している場合は、コードをインストルメント化することで、重要なコードルーチンをプロファイラのタイムライン内で視覚的にマーキングできます。C / C++ コードをインストルメント化するには、trace.h によって提供されるネイティブ トレース API を使用します。Java コードをインストルメント化するには、Trace クラスを使用します。詳しくは、アプリのコードをインストルメント化するをご覧ください。

    このトレース構成は systrace をベースとしています。systrace コマンドライン ユーティリティを使用すると、CPU Profiler では指定できないオプションを指定できます。systrace によって提供される追加のシステムレベル データにより、ネイティブ システム プロセスを検査して、フレームの欠落や遅延をトラブルシューティングできます。

    Android 9(API レベル 28)以降を搭載しているデバイスの場合、「System Tracing」というシステムアプリを使用することで、デバイスのシステム トレースを記録できます。

記録構成を作成、編集、表示する

[CPU Recording Configurations] ダイアログで記録構成を作成、編集、表示するには、CPU Profiler 上部の記録構成プルダウン メニューで [Edit configurations] を選択します。

既存の記録構成の設定を表示するには、[CPU Recording Configurations] ダイアログの左ペインで設定を選択します。

新しい記録構成を作成する手順は次のとおりです。

  1. ダイアログの左上にある追加アイコン をクリックします。これにより、いくつかのデフォルト設定を含む新しい構成が作成されます。
  2. 構成に名前を付けます。
  3. [Trace Technology] を選択します。
  4. サンプリング ベースの記録構成の場合は、[Sampling interval] をマイクロ秒単位(µs)で指定します。この値は、アプリのコールスタックの各サンプル間の時間を表します。指定する間隔が短ければ短いほど、記録データのファイルサイズ制限により早く到達します。
  5. 接続されたデバイスに書き込まれる記録データの [File size limit] をメガバイト単位(MB)で指定します。記録を停止すると、Android Studio はこのデータを解析してプロファイラ ウィンドウに表示します。そのため、ファイルサイズ制限を拡大して大量のデータを記録すると、Android Studio ではファイルの解析により長い時間がかかり、応答しなくなる場合があります。

    注: Android 8.0(API レベル 26)以降を搭載している接続デバイスを使用する場合、トレースデータのファイルサイズに制限はなく、この値は無視されます。ただし、各記録の後、デバイスが収集するデータの量には引き続き注意する必要があります。Android Studio での大きなトレース ファイルの解析が難しくなる場合があります。たとえば、短いサンプリング間隔でサンプリング ベースのトレースを記録しているか、アプリが短い間に多くのメソッドを呼び出すときにインストルメント化されたトレースを記録している場合は、大きなトレース ファイルが短時間で生成されます。

  6. 変更を受け入れて他の構成を引き続き変更するには、[Apply] をクリックします。適用した変更をすべて受け入れてダイアログを閉じるには、[OK] クリックします。

Debug API を使用して CPU アクティビティを記録する

Debug API を使用すると、CPU Profiler 内で CPU アクティビティの記録を開始、停止する機能をアプリに付与できます。

CPU Profiler は、アプリが startMethodTracing(String tracePath) を呼び出すと記録を開始し、アプリが stopMethodTracing() を呼び出すと記録を停止します。この API によってトリガーされた CPU アクティビティを記録している間、CPU Profiler には、アクティブな CPU 記録構成として Debug API が表示されます。

Debug API を使用して CPU アクティビティの記録を制御するには、インストルメント化したアプリを Android 8.0(API レベル 26)以降を搭載しているデバイスにデプロイします。 API で開始されたアクティビティの記録は、プロファイル可能なアプリでサポートされています。ただし、Android Studio のプロファイラで記録ステータスを UI で表示するには、デバッグ可能なアプリが必要になります。

重要: Debug API は、CPU アクティビティの記録を開始、停止する他の手段(CPU Profiler のグラフィカル ユーザー インターフェース内のボタンや、アプリ起動時の自動記録用の記録構成の設定など)とは別々に使用するように設計されています。

バッファサイズの上限が 8 MB であるため、Debug API の startMethodTracing(String tracePath) メソッドは、記録の開始や停止を手動で行うのが難しい短い間隔やシナリオ用に設計されています。長期間記録する場合は、Android Studio のプロファイラ UI を使用します。

詳細については、アプリをインストルメント化してトレースログを生成するをご覧ください。

アプリ起動時の CPU アクティビティの記録

アプリの起動中に CPU アクティビティの記録を自動的に開始する手順は次のとおりです。

  1. [Run] > [Edit Configurations] の順に選択します。
  2. [Profiling] タブで、[Start recording a method trace on startup] の横にあるチェックボックスをオンにします。
  3. メニューから CPU 記録構成を選択します。
  4. [Apply] をクリックします。
  5. [Run] > [Profile] を選択し、Android 8.0(API レベル 26)以降を搭載しているデバイスにアプリをデプロイします。