アプリをインストルメント化してトレースログを生成する
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
アプリ実行のメソッド トレースを生成するために、Debug
クラスを使ってアプリをインストルメント化できます。この方法でアプリをインストルメント化すると、デバイスがトレース情報の記録を開始、停止する正確なタイミングをより細かく制御できます。また、デバイスでは指定した名前でトレースログが保存されるため、後で各ログを簡単に特定できます。各トレースログは Android Studio の CPU Profiler で表示できます。
アプリのコードをインストルメント化しなくても、CPU Profiler でトレースを開始、停止することもできます。
トレースログの生成を開始する前に、トレースログをアプリ固有のディレクトリに保存するためのロジックが追加されていることを確認してください。
アプリをインストルメント化する
トレースログを生成するには、トレースデータのログ記録を開始する場所で startMethodTracing()
を呼び出します。
この呼び出しで .trace
ファイルの名前を指定すると、ターゲット デバイス上で永続的なアプリデータを保存するためのパッケージ固有ディレクトリにファイルが保存されます。このディレクトリは、getExternalFilesDir()
で返されるものと同じであり、ほとんどのデバイスでは ~/sdcard/
ディレクトリ以下になります。このファイルには、メソッド トレースのバイナリデータと、スレッド名とメソッド名のマッピング テーブルが含まれます。トレースを停止するには、stopMethodTracing()
を呼び出します。
次のサンプルでは、sample.trace
という名前のトレースログの記録の開始と停止が行われます。
Kotlin
// 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 <code><a href="/reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code>, at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing()
Java
// 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 <code><a href="/reference/android/os/Debug.html#stopMethodTracing()">stopMethodTracing()</a></code>, at which time it writes
// the buffered data to the output file.
Debug.stopMethodTracing();
トレースログの名前を変更せずにアプリで startMethodTracing()
を再度呼び出した場合、デバイスに保存された既存のログが上書きされることに注意してください。各トレースログの名前を動的に変更する方法について詳しくは、複数のログを保存するのセクションをご覧ください。
stopMethodTracing()
を呼び出す前にシステムが最大バッファサイズに到達した場合は、トレースが停止して通知がコンソールに送られます。トレースの開始と停止を行うメソッドは、アプリプロセス全体で機能します。つまり、アクティビティの onCreate(Bundle)
メソッドで startMethodTracing()
を呼び出し、そのアクティビティの onDestroy()
メソッドで stopMethodTracing()
を呼び出すことができます。
プロファイリングを有効にすると、アプリの実行速度が遅くなることに注意してください。つまり、プロファイリング データを使用して、絶対的なタイミング(「メソッド foo()
の実行に 2.5 秒かかる」など)を決定することはできません。トレースログのタイミング情報は、以前のトレースログと比較した場合にのみ有用であり、その場合は最近の変更によりアプリの速度が速くなったか、遅くなったかを確認できます。
Android 5.0(API レベル 21)以降を搭載しているデバイスにデプロイする際、サンプルを基にしたプロファイリングを使用すると、実行時のパフォーマンスへの影響を抑えてプロファイリングできます。サンプルを基にしたプロファイリングを有効にするには、(startMethodTracing()
を呼び出す代わりに)startMethodTracingSampling()
を呼び出して、サンプリング間隔を指定します。アプリで stopMethodTracing()
を呼び出すまで、定期的にサンプルが収集されます。
複数のログを保存する
トレースログの新しい名前を指定せずにアプリがメソッド トレースの開始と停止を繰り返すと、デバイスでは古いトレースログが新しいトレースログで上書きされます。つまり、最新のトレースログのみが保持されます。デバイスに複数のトレースログを保存するには、アプリで startMethodTracing()
を呼び出すたびにトレースログの名前を動的に変更します。以下のサンプルでは、SimpleDateFormat
クラスを使用して、各トレースログに名前を付けるときに現在の日時を追加しています。
Kotlin
// Uses the <code><a href="/reference/java/text/SimpleDateFormat.html">SimpleDateFormat</a></code> class to create a String with
// the current date and time.
val dateFormat: DateFormat = SimpleDateFormat("dd_MM_yyyy_hh_mm_ss", Locale.getDefault())
val logDate: String = dateFormat.format(Date())
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing("sample-$logDate")
Java
// Uses the <code><a href="/reference/java/text/SimpleDateFormat.html">SimpleDateFormat</a></code> class to create a String with
// the current date and time.
SimpleDateFormat dateFormat =
new SimpleDateFormat("dd_MM_yyyy_hh_mm_ss", Locale.getDefault());
String logDate = dateFormat.format(new Date());
// Applies the date and time to the name of the trace log.
Debug.startMethodTracing(
"sample-" + logDate);
デバイスでトレースログにアクセスする
デバイスにトレースログが作成されたら、次のいずれかの方法でそのファイルにアクセスできます。
Device Explorer を使用します。Device Explorer を開くには、[View] > [Tool Windows] > [Device Explorer] をクリックします(または、ツール ウィンドウ バーで Device Explorer アイコン
をクリックします)。図 1 に示すように、アプリのパッケージ固有のディレクトリに移動して .trace
ファイルを見つけることができます。
図 1. Device Explorer を使用してトレースログを探しているところ
adb pull
コマンドを使用してファイルをローカルマシンにコピーします。以下のコマンドは、sample.trace
という名前のトレースログをデバイスからローカルマシンの ~/Documents/trace-logs/
ディレクトリにコピーします。
adb pull path-on-device/sample.trace ~/Documents/trace-logs/
その後、CPU Profiler を使用してトレース ファイルをインポートできます。
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-07-27 UTC。
[[["わかりやすい","easyToUnderstand","thumb-up"],["問題の解決に役立った","solvedMyProblem","thumb-up"],["その他","otherUp","thumb-up"]],[["必要な情報がない","missingTheInformationINeed","thumb-down"],["複雑すぎる / 手順が多すぎる","tooComplicatedTooManySteps","thumb-down"],["最新ではない","outOfDate","thumb-down"],["翻訳に関する問題","translationIssue","thumb-down"],["サンプル / コードに問題がある","samplesCodeIssue","thumb-down"],["その他","otherDown","thumb-down"]],["最終更新日 2025-07-27 UTC。"],[],[],null,["# Generate Trace Logs by Instrumenting Your App\n\nTo generate a method trace of your app's execution, you can instrument your app\nusing the [Debug](/reference/android/os/Debug)\nclass. Instrumenting your app this way gives you more control over exactly when\nthe device starts and stops recording tracing information. The device also saves\nyour trace logs using the names you specify, so you can easily identify each log\nlater. You can then view each trace log using the Android Studio\n[CPU Profiler](/studio/profile/cpu-profiler).\n\nYou can also\n[start and stop tracing in the CPU Profiler](/studio/profile/cpu-profiler#method_traces)\nwithout instrumenting your app's code.\n\nBefore you start generating trace logs, make sure your app has added logic to\nsave trace logs to its [app-specific\ndirectory](/training/data-storage/app-specific).\n\nInstrument your app\n-------------------\n\nTo create trace logs, call [startMethodTracing()](/reference/android/os/Debug#startMethodTracing())\nwhere you want the system to start logging tracing data.\n\nIn the call, you can specify the name for the\n`.trace` file, and the system saves it to a package-specific\ndirectory that's intended for persistent app data on the target device---this is\nthe same directory that is returned by\n[getExternalFilesDir()](/reference/android/content/Context#getExternalFilesDir(java.lang.String))\nand is located in the `~/sdcard/` directory on most devices.\nThis file contains the binary method trace data and a mapping table with thread\nand method names. To stop tracing, call\n[stopMethodTracing()](/reference/android/os/Debug#stopMethodTracing()).\n\nThe following sample starts and stops recording a trace log with the name\n`sample.trace`: \n\n### Kotlin\n\n```kotlin\n// Starts recording a trace log with the name you provide. For example, the\n// following code tells the system to start recording a .trace file to the\n// device with the name \"sample.trace\".\nDebug.startMethodTracing(\"sample\")\n\n// The system begins buffering the generated trace data, until your\n// application calls \u003ccode\u003e\u003ca href=\"/reference/android/os/Debug.html#stopMethodTracing()\"\u003estopMethodTracing()\u003c/a\u003e\u003c/code\u003e, at which time it writes\n// the buffered data to the output file.\nDebug.stopMethodTracing()\n```\n\n### Java\n\n```java\n// Starts recording a trace log with the name you provide. For example, the\n// following code tells the system to start recording a .trace file to the\n// device with the name \"sample.trace\".\nDebug.startMethodTracing(\"sample\");\n...\n// The system begins buffering the generated trace data, until your\n// application calls \u003ccode\u003e\u003ca href=\"/reference/android/os/Debug.html#stopMethodTracing()\"\u003estopMethodTracing()\u003c/a\u003e\u003c/code\u003e, at which time it writes\n// the buffered data to the output file.\nDebug.stopMethodTracing();\n```\n\nNote that if your app calls the\n[startMethodTracing()](/reference/android/os/Debug#startMethodTracing())\nagain without changing the name of the trace log, it overwrites the existing log\nsaved to the device. To learn how to dynamically change the name of each trace\nlog, go to the section about [saving multiple logs](#save_multiple_logs).\n\nIf the system reaches the maximum buffer size before you call\n[stopMethodTracing()](/reference/android/os/Debug#stopMethodTracing()),\nthe system stops tracing and sends a notification to the console.\nThe methods that start and stop traces work across your entire app process. That\nis, you could call\n[startMethodTracing()](/reference/android/os/Debug#startMethodTracing())\nin your activity's\n[onCreate(Bundle)](/reference/android/app/Activity#onCreate(android.os.Bundle))\nmethod, and call [stopMethodTracing()](/reference/android/os/Debug#stopMethodTracing())\nin that activity's [onDestroy()](/reference/android/app/Activity#onDestroy())\nmethod.\n\nNote that your app runs more slowly when profiling is enabled. That is, you\nshouldn't use the profiling data to determine absolute timings (such as, \"method\n`foo()` takes 2.5 seconds to run\"). The timing information in the trace logs are\nuseful only when comparing it to previous trace logs, so you can see if recent\nchanges make your app faster or slower.\n\nWhen deploying to devices running Android 5.0 (API level 21) and higher, you can\nuse sample-based profiling to profile with less runtime performance impact. To\nenable sample profiling, call\n[startMethodTracingSampling()](/reference/android/os/Debug#startMethodTracingSampling(java.lang.String, int, int))\n(instead of calling `startMethodTracing()`) with a specified sampling\ninterval. The system gathers samples periodically until your app calls\n[stopMethodTracing()](/reference/android/os/Debug#stopMethodTracing()).\n\n### Save multiple logs\n\nIf your app starts and stops a method trace multiple times without specifying a\nnew name for the trace log, the device overwrites the older trace log with the\nnew one---that is, it only keeps the most recent trace log. To save multiple\ntrace logs to your device, dynamically rename the trace log each time your app\ncalls [startMethodTracing()](/reference/android/os/Debug#startMethodTracing()).\nThe sample below uses the [SimpleDateFormat](/reference/java/text/SimpleDateFormat)\nclass to include the current date and time when naming each trace log: \n\n### Kotlin\n\n```kotlin\n// Uses the \u003ccode\u003e\u003ca href=\"/reference/java/text/SimpleDateFormat.html\"\u003eSimpleDateFormat\u003c/a\u003e\u003c/code\u003e class to create a String with\n// the current date and time.\nval dateFormat: DateFormat = SimpleDateFormat(\"dd_MM_yyyy_hh_mm_ss\", Locale.getDefault())\nval logDate: String = dateFormat.format(Date())\n// Applies the date and time to the name of the trace log.\nDebug.startMethodTracing(\"sample-$logDate\")\n```\n\n### Java\n\n```java\n// Uses the \u003ccode\u003e\u003ca href=\"/reference/java/text/SimpleDateFormat.html\"\u003eSimpleDateFormat\u003c/a\u003e\u003c/code\u003e class to create a String with\n// the current date and time.\nSimpleDateFormat dateFormat =\n new SimpleDateFormat(\"dd_MM_yyyy_hh_mm_ss\", Locale.getDefault());\nString logDate = dateFormat.format(new Date());\n// Applies the date and time to the name of the trace log.\nDebug.startMethodTracing(\n \"sample-\" + logDate);\n```\n\nAccess trace logs on the device\n-------------------------------\n\nAfter the system creates the trace log on your device, you can access the file\nin one of the following ways:\n\n- [Use the Device Explorer](/studio/debug/device-file-explorer).\n To open the Device Explorer, click\n **View \\\u003e Tool Windows \\\u003e Device Explorer** (or click the\n **Device Explorer**\n button in the tool window bar). As shown in figure 1\n you can locate the `.trace` files by navigating to your app's\n package-specific directory.\n\n\n **Figure 1.** Locating the trace logs using the Device Explorer.\n\n \u003cbr /\u003e\n\n- Copy the file to your local machine using the `adb pull` command.\n The command below copies a trace log named `sample.trace` from the device to\n the `~/Documents/trace-logs/` directory of your local machine.\n\n ```\n adb pull path-on-device/sample.trace ~/Documents/trace-logs/\n ```\n\n \u003cbr /\u003e\n\nYou can then\n[import the trace file](/studio/profile/import-traces) with the CPU Profiler."]]