Perfetto UI でプロファイルを可視化する

テストデバイスからプロファイルを取得するか、バックエンドからダウンロードしたら、Perfetto UI でファイルを開いて、タイムライン、スレッドの状態、メモリ保持グラフを調べることができます。このページでは、ProfilingManager でキャプチャされた、秘匿化されたシステム トレースと Java ヒープダンプを操作する方法について説明します。

システム トレースを可視化する

Perfetto UI で .perfetto-trace ファイルを開き、CPU とスレッドのアクティビティを時系列で検査します。

Perfetto UI での、秘匿化されたシステム トレースのタイムライン
図 1. 秘匿化されたトレースの例。

ユーザーのプライバシーを保護するため、ProfilingManager は、他のすべてのプロセスの CPU アクティビティを 1 つの OtherProcesses トラックに統合することで、システム トレースを編集します。この統合されたトラックを検査することで、アプリの速度低下が内部のボトルネックによるものか、デバイス全体の負荷によるものかを判断できます。

図 2 は、秘匿化されたシステム トレースの主なセクションを示しています。

Perfetto UI で秘匿化されたシステム トレースの番号付きセクション
図 2. 秘匿化されたトレースのセクション。
  1. CPU リスト: デバイスで使用可能なすべてのプロセッサが表示されます。
  2. CPU タスク: 各 CPU が実行していたスレッドを示します。
  3. その他のプロセスのビュー: 他のプロセスによって消費された CPU リソースが表示されます。
  4. Process View: アプリのプロセスを表示します。
  5. Threads View: プロセス内で実行されているスレッドと、そのスレッドの状態(実行可能(R)、実行中(R)、スリープ(S)、割り込み不可スリープ(D))を表示します。これらは Linux プロセスの状態に直接マッピングされます。
  6. トレース スライス: このセクションには、アプリ デベロッパーまたはフレームワークによって追加されたトレース アノテーションが表示されます。これらのアノテーションは、Trace.beginSection と Trace.endSection の間の計算を対象としています。

Perfetto UI とトレースの可視化について詳しくは、Perfetto のドキュメントをご覧ください。

Java ヒープダンプを可視化する

PROFILING_TYPE_JAVA_HEAP_DUMP を使用して Java ヒープダンプをキャプチャしたら、生成された .perfetto-java-heap-dump ファイルを Perfetto UI で開き、メモリリークを特定するか、メモリ使用量を最適化します。ヒープダンプ エクスプローラでは、図 3 に示すように、ヒープグラフの探索、累積オブジェクト サイズのフレームグラフの検査、クラス、オブジェクト、ドミネーターの閲覧が可能です。

Java ヒープ オブジェクト サイズのフレームグラフを示す Perfetto UI Heapdump Explorer。
図 3. Perfetto UI の Java ヒープダンプのフレームグラフ。

ProfilingManager ヒープダンプと HPROF ダンプの違い

標準の .hprof ヒープダンプ(Debug.dumpHprofData や Android Studio でキャプチャされたものなど)とは異なり、ProfilingManager は Perfetto ART ヒープダンプ(.perfetto-java-heap-dump)をキャプチャします。ProfilingManager は、未加工のメモリ コンテンツをダンプするのではなく、オブジェクト保持グラフとサイズ設定メタデータを記録し、オブジェクト内に保存されている未加工のデータは省略します。

  • 収集されるデータ:
    • クラスと型: クラス名、スーパークラス階層、クラスローダ、インスタンス サイズ、参照型(通常のクラス、配列、文字列、弱参照、ソフト参照、ファイナライザ参照、ファントム参照など)。
    • オブジェクトのインスタンスとサイズ: 各オブジェクトのシャローサイズ(self_size)、ヒープ領域(HEAP_TYPE_APP、HEAP_TYPE_ZYGOTE、HEAP_TYPE_BOOT_IMAGE)、NativeAllocationRegistry を介して登録された関連するネイティブ メモリ。
    • 参照と GC ルート: ガベージ コレクション ルート(JNI グローバルとローカル、Java スタック フレーム、スレッド オブジェクトなど)と、どのオブジェクトがどのフィールド名で別のオブジェクトを保持しているかを示すフィールド レベルの参照チェーン。
    • サイズ設定メタデータを選択する: Bitmap ディメンション(mWidth と mHeight)など、特定のフレームワーク タイプに関する機密性のないメタデータ。
  • 省略されるもの: 実際のプリミティブ フィールド値、String 文字コンテンツ、未加工の配列ペイロード(byte[]、char[]、その他のプリミティブ配列)。未加工のオブジェクト コンテンツを省略すると、本番環境デバイスでユーザーのプライバシーが保護され、ダンプファイルのサイズが大幅に小さくなります。

次のステップ

Perfetto UI での視覚的な検査以外にも、PerfettoSQL を使用してプロファイルをクエリしたり、トレースを一括で分析したり、AI を使用してプロファイルを分析したりできます。