Systrace — その概要とAndroidシステムトレースツール

著者: IT Sectr 公開日: 2026-03-31 読了時間: 9 分

Systraceは、Linuxカーネル、CPU、GPU、およびすべてのシステムプロセスに関するデータを短期間に収集するAndroidシステムトレースツールです。アプリケーション内のメソッドに焦点を当てるTraceviewとは異なり、Systraceはシステム全体の状況を示します。各CPUコアの負荷、SurfaceFlingerの動作、Binder呼び出し、GCサイクルなどです。Google、2024によると、このツールはフレーム落ち、頻繁なガベージコレクション、UIスレッドの異常を診断するために不可欠です。

主要ポイント

  • Systrace — atrace/ftraceを介して動作するAndroid向け低レベルシステムトレースツール
  • トレースには最大60秒間のCPU、GPU、スレッド、SurfaceFlinger、Binderデータが含まれます
  • 分析により、フレーム落ちやUIスレッドブロックの正確な原因を確認できます
  • 統合 — 柔軟なキャプチャと自動化のためのAndroid Studioおよびコマンドラインとの統合
  • Perfetto — Android 12+におけるSystraceの後継で、共通のprotobuf形式を使用

Systraceとは

Systraceは、Android SDKに含まれるコマンドラインユーティリティで、複数のカーネルトレース(ftrace)およびユーザースペース(atrace)ソースからのデータをキャプチャして1つのHTMLレポートに統合します。このツールはAndroid 4.1(Jelly Bean)で、システムプロファイリング用の古いtraceviewユーティリティの後継として登場し、長い間Androidプラットフォームにおける標準的なパフォーマンス診断ツールであり続けました。

Systraceのアーキテクチャ

Systraceはftraceに依存しています — これはAndroid 4.1以降で利用可能なLinuxカーネルトレースメカニズムです。Systraceが起動すると、指定されたトレースカテゴリを有効にします。sched(タスクスケジューラ)、freq(CPU周波数)、idle(アイドル状態)、workq(ワークキュー)、binder、gfxなどです。データはカーネルのリングバッファに収集され、停止後に1つのtrace.htmlファイルに統合され、任意のブラウザで開くことができます。

Android StudioのコンテキストにおけるSystrace

Android Studio 3.1以降、SystraceはCPU Profilerに組み込まれています。「Trace System Calls」モードでは、プロファイラが接続されたデバイスでSystraceを起動し、結果をAndroid Studioウィンドウに直接表示します。これにより、基本的なケースではコマンドラインで作業する必要がなくなり、すべてのトレースカテゴリ、フィルタリング、インタラクティブなタイムラインという完全な機能を維持します。トレース中のデバイスパフォーマンスへの影響はごくわずかです。ftraceは最小限のオーバーヘッドになるように設計されているためです。

Systraceの仕組み

Systraceは2つのデータ収集メカニズムを使用します。システムイベント用のカーネルレベルのftraceと、Android固有のタグ用のユーザースペースのatraceです。ftraceはコンテキストスイッチ(sched_switch)、CPU周波数の変更(cpu_frequency)、割り込み(irq_handler_entry)、その他のイベントを記録します。atraceはAndroidフレームワークからのタグ — フレームレンダリングの開始と終了、SurfaceFlinger呼び出し、Binderトランザクション — を追加します。

Systraceにおけるフレームレンダリングパイプライン

Systraceの主な機能は、各フレームのレンダリングパイプラインの可視化です。アプリケーション → BufferQueue → SurfaceFlinger → HWC(コンポーザー) → ディスプレイ。いずれかの段階で遅延が発生すると、Systraceは正確な原因を表示します。アプリケーションが時間内にバッファを準備しなかった、SurfaceFlingerがVSyncを待っていた、HWCがレイヤーを合成できなかったなどです。タイムライン上のフレームライフサイクルはステータスによって色分けされます。緑(時間内)、黄(遅延)、赤(ドロップ)。この可視化はUIパフォーマンスを最適化するための主要なツールです。

トレースカテゴリ

Systraceは20以上のトレースカテゴリをサポートしており、各カテゴリには関連するイベントのセットが含まれます。重要なカテゴリには、gfx(グラフィックスレンダリング)、input(入力処理)、view(Viewシステム)、webview(WebView)、power(消費電力)、hal(ハードウェア抽象化レイヤー)などがあります。ゲームプロファイリングには、AGI(Android GPU Inspector)を介したGPUコマンド詳細を含むgfxカテゴリが有用です。

Systraceの主な機能

Systraceは、他のプロファイラでは利用できないAndroid向けのユニークな機能セットを提供します。システムタイムライン、カーネルレベルのメトリクス、自動問題検出です。

インタラクティブなタイムライン

Systrace HTMLレポートには、各レーンが1つのプロセスまたはスレッドに対応するマルチレベルのタイムラインが含まれています。時間スケールを拡大・縮小したり、イベントをクリックして詳細(期間、開始プロセス、追加引数)を表示したりできます。色分けにより迅速なナビゲーションが可能です。緑のブロック — プロセス実行中、青 — 待機中、オレンジ — 割り込み、白 — アイドル。

アラートメッセージ

Systraceはトレースを自動的に分析し、問題領域を示すアラートメッセージを表示します。例:「Buffer underrun — SurfaceFlingerがVSync前にバッファを受信しなかった」や「Long Binder transaction — スレッドBinder_1で42 ms」。各アラートにはタイムラインの該当セクションへのリンクと修正推奨事項が含まれます。これにより手動分析の時間を節約でき、手動ログ記録の代わりにSystraceを使用する主な理由の1つです。

Trace.beginSectionメソッド

開発者はTrace.beginSectionおよびTrace.endSection APIを介してSystraceトレースにカスタムタグを追加できます。これにより、システムタイムライン上で重要なコードセクションの実行を直接トレースできます — たとえば、データロードやレイアウト計算の開始と終了をマークできます。タグはアプリケーションレーンに個別のブロックとして表示され、システムイベントと並んで表示されます。

カテゴリデータ一般的な使用例
schedコンテキストスイッチ、アイドル状態スレッドブロック、競合
gfxVSync、バッファ準備、HWCフレームドロップ、ジャンク
binderBinderトランザクション、レイテンシIPC遅延、リモートコール
freqCPU周波数、スケーリングガバナースロットリング、消費電力
gfx + AGIGPUコマンド、シェーダーゲームパフォーマンス

Systraceの実行方法

Systraceの実行は2つの方法で可能です。Android Studio CPU Profiler(「Trace System Calls」モード)を使用するか、platform-toolsフォルダのsystrace.py Pythonスクリプトを使用してコマンドラインから実行します。各方法には独自の使用シナリオがあります。

Android Studioを使用した実行

デバイスを接続し、Profilerを開き(View → Tool Windows → Profiler)、プロセスを選択し、CPUタブに移動して「Trace System Calls」モードを選択し、Recordをクリックします。5–30秒後にStopをクリックします — Android Studioがデバイス上でSystraceを起動し、完了を待って結果をロードします。制限事項:録音はProfilerが開いている間のみ可能で、長時間のシナリオや自動化には不便です。

コマンドラインからの実行

より柔軟な制御のために、systrace.pyスクリプトを使用します。トレースカテゴリ、期間、出力ファイル名を指定します。例:10秒間のgfx、input、schedデータのキャプチャ。実行にはPython 2.7+とUSBデバッグが有効な接続デバイスが必要です。Android 12+では、SystraceはPerfettoに置き換えられました — コマンドは同じですが、スクリプトは呼び出しをperfettoにリダイレクトします。

bash
# systraceの10秒間の基本実行
$ python systrace.py \
    --time=10 \
    -o trace.html \
    gfx input sched

# UI分析のためのgfxカテゴリのみ
$ python systrace.py \
    --time=5 \
    -t gfx \
    -o ui_trace.html

コード内でのカスタムタグの設定

コードをSystraceタイムラインに表示するには、重要なセクションをTrace.beginSection / Trace.endSectionでラップします。beginSectionendSectionは厳密に対になる必要があります — そうしないとSystraceは不正確なタイムラインを表示します。Kotlinでは、例外が発生した場合でもセクションのクローズを保証するためにインライン拡張を使用すると便利です。

kotlin
import android.os.Trace

fun traceSection(name: String, block: () -> Unit) {
    Trace.beginSection(name)
    try {
        block()
    } finally {
        Trace.endSection()
    }
}

// コード内での使用
traceSection("load_screen_data") {
    fetchData()
    updateUI()
}

Systrace HTMLレポートの読み方

Systraceレポートは自己完結型のHTMLファイルで、Chrome、Edge、Firefoxで開くことができます。インタラクティブなタイムライン、プロセス選択パネル、アラートメッセージのリスト、主要メトリクス(フレームレート、CPU使用率、Binderトランザクション)が含まれています。レポート構造を理解することは、効果的なプロファイリングのための重要なスキルです。

タイムラインとナビゲーション

タイムラインは時間を左から右に表示します。各プロセスとスレッドは個別のレーンです。W/Sキーで拡大・縮小、A/Dで時間を移動します。セクションを拡大するにはマウスで領域を選択します。VSyncラインはフレーム境界を示します(60 FPSで16.6 msごと)。2つのVSyncラインの間に完全なレンダリングサイクルが収まらない場合 — フレームがドロップされます。SurfaceFlingerレーンに注目してください。長時間ビジー(オレンジ色のブロック)の場合、レイヤー合成が全体的なレンダリングを遅くしています。

アラートメッセージの分析

レポート左側のアラートパネルには、自動的に検出された問題が表示されます。各アラートはクリック可能で — クリックするとタイムラインが問題の瞬間に移動します。最も一般的なアラート:「Long Sync」(長いスレッド同期)、「Scheduling Delay」(スケジューラ遅延)、「Buffer Overrun」(SurfaceFlingerバッファオーバーフロー)。Scheduling Delayに~100 msの値が表示された場合、UIスレッドがバックグラウンド負荷のためにCPUを待っていたことを直接示しています — 重い計算はワーカースレッドに移動する必要があります。

フレームライフサイクルとジャンク

ドロップフレームを分析するには、SurfaceFlingerとapp.gfxレーンを有効にします。各フレームは長方形で表示されます。緑(≤16 ms)、黄(16–32 ms)、赤(>32 ms)。アプリケーションレーンに赤い長方形が表示されたら、それをクリックします — Systraceが制限を超えた特定のメソッド(またはシステムコール)を表示します。Google(Android Performance Patterns、2023)によると、ジャンク問題の70%は遅いonBindViewHolderまたは頻繁なGCが原因です。

Systrace vs Perfetto: 新しい形式への移行

PerfettoはSystraceの後継であり、GoogleがAndroid 9(Pie)で実験的ツールとして導入し、Android 12から主要なソリューションになりました。Perfettoは最新のprotobufデータ形式を使用し、長時間セッション(秒ではなく時間)をサポートし、トレース表示用のWeb UIを備えています。2つのシステムの主な違いを見てみましょう。

基準SystracePerfetto
形式HTMLレポート(trace.html)Protobuf(.trace / .perfetto-trace)
期間最大60秒時間、ギガバイトのデータ
インターフェース組み込みHTMLWeb UI(ui.perfetto.dev)
カテゴリ固定(ftrace + atrace)拡張可能(トレースへのSQLクエリ)
モビリティAndroidのみAndroid、Linux、Chrome、Windows

Perfettoへの移行にもかかわらず、Systraceのスキルは引き続き重要です。Android 11以下のデバイスではデフォルトで使用され、PerfettoはSystraceカテゴリとの下位互換性を維持しています。Android Studio CPU Profilerでは、新しいデバイスにはPerfetto、古いデバイスにはSystraceが使用されます — ユーザーには透過的です。CI/CDでは、その形式がPythonとSQLを介して自動的に処理できるため、Perfettoが推奨されます。

Systraceの使用例

Systraceを実践的に習得するために、2つのシナリオを考えてみましょう。スクロール中のフレームドロップの原因を見つけることと、UIスレッドをブロックする頻繁なGCの診断です。

RecyclerViewスクロール中のジャンクの発見

gfxカテゴリでSystraceを10秒間実行し、アプリ内でリストをスクロールします。レポートで赤いフレームのあるセクションを見つけます。問題のあるフレームをクリックし、アプリレーンを確認します — 「inflateLayout」や「onBindViewHolder」という16 msより広いブロックがある場合、問題はレイアウトインフレーションまたはデータバインディングにあります。解決策:レイアウトを最適化し(深いViewGroupの削減、ViewStub)、画像読み込みをonAttachedToWindow付きのGlideにオフロードします。

GCスループットの診断

freqおよびschedカテゴリのSystraceを使用すると、GCサイクルがどのくらいの頻度でUIスレッドをプリエンプトするかを確認できます。タイムライン上のアプリケーションレーンを見つけます — 「Concurrent GC」という名前の20–50 ms続く定期的なブロックが見られる場合、ガベージコレクターが頻繁に実行されています。詳細な分析のために「dalvik」カテゴリを追加します。解決策:BitmapをByteBufferに変換し、頻繁な割り当てにはオブジェクトプール(ObjectPool)を使用し、ART引数を介してヒープの断片化を減らします。

bash
# UI + GC分析のためのカテゴリ指定実行
$ python systrace.py \
    --time=15 \
    -o gc_analysis.html \
    gfx sched dalvik freq

# 再現可能なテストのための30秒間のキャプチャ
$ python systrace.py \
    --time=30 \
    --app=com.example.app \
    -o app_trace.html

よくある質問

ルート権限なしでSystraceを実行できますか?

はい、Systraceの実行にルートアクセスは必要ありません。このツールはatraceを使用し、USBデバッグが有効な任意のデバイスで利用できます。一部のカテゴリ(power、freq)はシステム署名が必要な場合がありますが、主要なカテゴリ(gfx、sched、input)はすべてのデバイスで動作します。

トレースファイルの最大サイズは?

60秒の制限はftraceリングバッファの容量に関連しています — 長時間の録音中、バッファは上書きされます。Perfettoはこの制限を取り除きます。USB転送またはディスクへのストリーミングにより、数ギガバイトまでのトレースを時間単位で記録できます。

私のアプリのデータがHTMLレポートに表示されないのはなぜですか?

考えられる原因:アプリがデバッグ可能モードになっていない、マニフェストでandroid:debuggable=“true”フラグが設定されていない、リリースビルドが使用されている。また、カテゴリで--app=com.example.appを指定したか確認してください — 指定しない場合、Systraceはシステムプロセスのみをキャプチャします。

ネイティブコードからSystraceにカスタムタグを追加するには?

C++の場合は、libcutilsライブラリのATRACE_BEGINATRACE_ENDを使用します。ヘッダーファイルをインクルードし、目的のセクションをラップします。タグはプロセスレーンのSystraceに表示され、ゲームエンジン(Unity、Unreal)の分析に特に有用です。

Android 12+ではSystraceの代わりに何を使うべきですか?

Android 12以降では、Perfettoを使用します。ADBを介してデバイスにperfettoエージェントをインストールし、JSON形式で録音を開始します。迅速な表示にはPerfetto Web UI(ui.perfetto.dev)を、CIにはPythonのTraceProcessorを使用したコマンドラインエクスポートを使用します。

まとめ

  • Systrace — ftraceとatraceを介してカーネルレベルで動作するAndroidシステムトレーサー
  • 統一タイムライン上でCPU、GPU、SurfaceFlingerの負荷とBinderトランザクションを表示
  • HTMLレポートには問題特定と推奨事項を含む自動アラートメッセージが含まれます
  • Android Studio Profilerまたはsystrace.pyを使用したコマンドラインから起動
  • UIスレッドは重要:60 FPSでは各フレームが16.6 ms以内に収まる必要があります
  • Android 12+では、Systraceは長時間セッションとSQLクエリをサポートするPerfettoに置き換えられました
  • システム + アプリケーションレベルのプロファイリングにはSystraceとTraceviewの組み合わせが推奨されます

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください