WindowManager

WindowManager ダンプは、特定の時点の WindowManager のスナップショットを提供します。WindowManager トレースには、状態の順序が時系列で示されます。これにより、ウィンドウが画面に表示される理由、その構成、アクティビティ、タスク、ディスプレイ、または WindowManager 階層内の他の要素の構成に関する貴重な分析情報を得ることができます。この情報は、アプリが表示されない理由アプリを切り替える際にちらつくなどの問題のトラブルシューティングに役立ちます。

Winscope の WindowManager ビューアには、トレースおよびダンプに関するこの情報が表示されます。

トレース収集の詳細については、WindowManager をご覧ください。

windowmanager

図 1. WindowManager のトレース分析。

画面の左側には、窓の 3D ビューが表示されます。rects ビューは、ウィンドウの境界、Z オーダー、不透明度を考慮します。

タブの中央のセグメントには、ウィンドウの階層が表示されます。このビューには、ウィンドウ、アクティビティ、タスク間の親子関係に加えて、次の情報が含まれます。

  • V: 可視ウィンドウを識別します。

画面の右側には、使用可能なすべてのプロパティの proto dump が表示されます。proto ダンプ セクションの機能の詳細については、プロパティをご覧ください。

@IntDef の翻訳

@IntDef 変換は、WindowManager プロパティ パネルの重要なプロパティです。@IntDef は、整数型のアノテーション付き要素が論理型を表し、その値が明示的に名前が付けられた定数のいずれかである必要があることを示します。@IntDef は、メモリとパフォーマンスへの影響を軽減するために、列挙型の代わりに Android コードベース内で使用されます。

@IntDef の使用例を次に示します。

/**
  * The modes to control how root task is moved to the front when calling {@link Task#reparent}.
 */
@Retention(RetentionPolicy.SOURCE)
@IntDef({
  REPARENT_MOVE_ROOT_TASK_TO_FRONT,
  REPARENT_KEEP_ROOT_TASK_AT_FRONT,
  REPARENT_LEAVE_ROOT_TASK_IN_PLACE
})
@interface ReparentMoveRootTaskMode {}

// Moves the root task to the front if it was not at the front
static final int REPARENT_MOVE_ROOT_TASK_TO_FRONT = 0;
// Only moves the root task to the front if it was focused or frontmost already
static final int REPARENT_KEEP_ROOT_TASK_AT_FRONT = 1;
// Do not move the root task as a part of reparenting
static final int REPARENT_LEAVE_ROOT_TASK_IN_PLACE = 2;

フラグは、人が読める値ではなく整数として保存されます。これは解釈が難しい場合があります。Winscope は、@IntDef 定義を使用して、これらのフラグを人間が読める値に変換します。コンパイル時に、Winscope は @IntDef 値の辞書を収集し、このリストを使用して、実行時に @IntDef インスタンスを人が読める形式にデコードします。たとえば、activityType2 のアクティビティは、activityTypeACTIVITY_TYPE_HOME に翻訳されます。同様に、flags=2173763840 を含むウィンドウは、Winscope で次のように変換されます。

flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED | FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR | FLAG_LAYOUT_IN_SCREEN

Winscope が @IntDef インスタンスを正しく変換しない場合は、@IntDef マッピングを更新するの手順に沿って、Winscope で認識されている @IntDef インスタンスのリストを更新します。