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

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.pb/data/misc/wmtrace/layers_trace.pb に書き込まれます。トレースはバグレポートにも含まれます。

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.pb wm_trace.pb

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.pb layers_trace.pb

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

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

状態ダンプの生成

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

WindowManager

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

SurfaceFlinger

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

トレースの分析

トレース ファイルを分析するには、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(画面): 画面上のすべての可視ウィンドウを視覚的に表示します。ウィンドウをクリックして、階層内でソース ウィンドウを選択します。
  • Hierarchy(階層): システムが認識しているウィンドウを表示します。一部のウィンドウにはバッファがありませんが、ウィンドウの子にポリシーを設定するために存在しています。可視ウィンドウには、V アイコンのマークが付けられます。
  • Properties(プロパティ): 階層内で選択されているエントリの状態情報を表示します。