ウィンドウ遷移のトレース

WinScope は、ウィンドウの遷移中と遷移後で WindowManager と SurfaceFlinger の状態を記録して分析するためのインフラストラクチャとツールを提供します。WinScope はすべての関連するシステム サービスの状態をトレース ファイルに記録します。このトレース ファイルを使用して、遷移をリプレイし、順を追って確認できます。

トレースのキャプチャ

クイック設定、または adb を userdebug や eng ビルドを実行しているデバイスで使用して、トレースをキャプチャします。

クイック設定

クイック設定からトレースをキャプチャするには、以下の手順を実行します。

  1. 開発者向けオプションを有効にします
  2. [開発者向けオプション] > [クイック設定開発者向けタイル] の順に移動します。
  3. WinScope Trace を有効にします。
  4. クイック設定を開きます。
  5. Winscope Trace をタップしてトレースを有効にします。
  6. デバイス上でウィンドウ遷移を実行します。
  7. 終了したら、クイック設定を開き、Winscope Trace をタップしてトレースを無効にします。

トレースは /data/misc/wmtrace/wm_trace.winscope/data/misc/wmtrace/layers_trace.winscope に書き込まれます。トレースはバグレポートにも含まれます。

adb

adb を使用してトレースをキャプチャする場合は、WindowManager と SurfaceFlinger のトレースを別々にキャプチャします。

WindowManager のトレース

WindowManager のトレースをキャプチャするには、以下の手順を実行します。

  1. トレースを有効にします。
    adb shell cmd window tracing start
  2. トレースを無効にします。
    adb shell cmd window tracing stop
  3. トレース ファイルを取得します。
    adb pull /data/misc/wmtrace/wm_trace.winscope wm_trace.winscope

WindowManager のトレースのさまざまな設定のデフォルトログ設定を変更することもできます。

  • トランザクションまたはフレームのログ取得頻度を設定します。
    adb shell cmd window tracing [frame | transaction]
  • ログエントリの詳細レベルを設定します。
    adb shell cmd window tracing level [all | trim | critical]
  • 最大バッファサイズを KB 単位で設定します。
    adb shell cmd window tracing size size-value
  • バッファ ステータス、ログレベル、残り容量、要素数をダンプします。
    adb shell cmd window tracing status

SurfaceFlinger のトレース

SurfaceFlinger のトレースをキャプチャするには、以下の手順を実行します。

  1. トレースを有効にします。
    adb shell su root service call SurfaceFlinger 1025 i32 1
  2. トレースを無効にします。
    adb shell su root service call SurfaceFlinger 1025 i32 0
  3. トレース ファイルを取得します。
    adb pull /data/misc/wmtrace/layers_trace.winscope layers_trace.winscope

SurfaceFlinger のトレースのさまざまな設定のデフォルトログ設定を変更することもできます。

  • 最大バッファサイズを KB 単位で設定します。
    adb shell su root service call SurfaceFlinger 1029 i32 size-value
  • ログエントリの詳細レベルを設定します。
    adb shell su root service call SurfaceFlinger 1033 i32 flags

トランザクション

トランザクションをキャプチャするには:

  1. トレースを有効にします。
    adb shell su root service call SurfaceFlinger 1020 i32 1
  2. トレースを無効にします。
    adb shell su root service call SurfaceFlinger 1020 i32 0
  3. トレース ファイルを取得します。
    adb pull /data/misc/wmtrace/transaction_trace.winscope

/data/misc/wmtrace/ にはその他のトランザクション マージファイルがあります。名前は transaction_merges_*.winscope という形式です。

状態ダンプの生成

WinScope は、バグレポートから WindowManager と SurfaceFlinger の状態のスナップショットを読み取ります。バグレポートでは、状態を別々の proto ファイルとして proto フォルダに保存します。adb を使用して状態ダンプを生成するには、次のコマンドを実行します。

WindowManager

adb exec-out dumpsys window --proto > window_dump.winscope

SurfaceFlinger

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

トレースの分析

トレース ファイルを分析するには、WinScope ウェブアプリを使用します。アプリは、ソースからビルドするか、ビルド済みのディレクトリから開きます。

  1. Android ソース リポジトリからビルド済みのアーティファクトをダウンロードします。
    curl 'https://android.googlesource.com/platform/prebuilts/misc/+/master/common/winscope/winscope.html?format=TEXT' | base64 -d > winscope.html
  2. ダウンロードしたアーティファクトをウェブブラウザで開きます。
  3. WinScope が起動したら、[OPEN FILE ] を選択してトレース ファイルを読み込みます。

WinScope の使用

WinScope でトレース ファイルを開いたら、いくつかの方法でトレースを分析できます。

WinScope のスクリーンショット
図 1: WinScope でのトレースの分析
  • Timeline(タイムライン): トレース内のイベントのシーケンスを表示します。タイムラインを移動するには、矢印キーを使用するか、各エントリをクリックします。
  • Screen(画面): 画面上のすべての可視ウィンドウを視覚的に表示します。ウィンドウをクリックして、階層内でソース ウィンドウを選択します。
  • Screen recording(画面の録画): トレースと同期しているデバイスの画面を表示します。 タイムラインと一緒にナビゲートします。
  • Hierarchy(階層): システムが認識しているウィンドウを表示します。一部のウィンドウにはバッファがありませんが、ウィンドウの子にポリシーを設定するために存在しています。可視ウィンドウには、V アイコンのマークが付けられます。
  • Properties(プロパティ): 階層内で選択されているエントリの状態情報を表示します。