SurfaceFlinger

SurfaceFlinger のダンプは、特定の時点における SurfaceFlinger のスナップショットを提供します。SurfaceFlinger のトレースには状態の時系列のシーケンスが含まれており、ウィンドウがどのように画面に表示されるのか、また特定の位置でどのウィンドウがタップへの反応を受け付けるのかについて有益な分析情報を提供します。この情報は、「アプリがタップに反応しない」や「動画視聴中に画面がちらつく」といった問題のトラブルシューティングに不可欠です。

Winscope の SurfaceFlinger ビューアでは、アクティブモードを使用して収集されたトレース、バグレポート取得時にトランザクションのトレースから生成されたトレース(デフォルトでは Droidfood 設定)、およびダンプにこの情報が表示されます。

トレースの収集方法の詳細については、SurfaceFlinger(レイヤ)をご覧ください。

SurfaceFlinger のトレース分析

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

画面の左側には、レイヤの 3D ビューが表示されます。長方形ビューでは、レイヤ境界、Z オーダー、不透明度、相対 Z、角の丸みを考慮した表示が可能です。

階層チップ

タブの中央部分には、レイヤ間の親子関係などの詳細情報を示すチップ付きのレイヤ階層が次のように表示されます。

  • V: 可視レイヤを識別する。
  • RelZParent: RelZ の子レイヤを持つレイヤを識別する。
  • RelZ: RelZParent を持ち、Z オーダーに従って描画されるレイヤを識別する。
  • HWC: Hardware Composer によって構成されたレイヤを識別する。
  • GPU: GPU によって構成されたレイヤを識別する。

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

厳選されたプロパティ

デバッグを容易にするために、SurfaceFlinger ビューアは厳選されたプロパティのリストを提供し、最もよく使用される情報をより整理された形式で表示します。

SurfaceFlinger のプロパティ

図 2. SurfaceFlinger のプロパティ。

このリストには次のカテゴリが含まれます。

公開設定

このブロックには、レイヤの表示と非表示に関する情報と、レイヤが表示されない場合の理由が記載されています。内容は次のとおりです。

フラグ: 可視性を制御するフラグ(例: HIDDENOPAQUE)。

非表示の理由: 該当する場合、レイヤまたはサーフェスが画面に表示されない理由の説明(例: それ自体またはその親によって非表示にされている、描画するバッファがないなど)。

遮られている部分的に遮られている、または覆われている:

  • 遮られている: 現在のレイヤは可視として計算されているが、上に別の不透明レイヤが描画されているため、実際には見えない状態。遮られているレイヤの上にあるレイヤは不透明。つまり、その OPAQUE フラグが設定されているか、ピクセル形式にアルファ チャンネルがないか、レイヤにアルファが設定されていない。
  • 部分的に遮られている: 現在のレイヤが、その上に描画された不透明レイヤによって完全には覆われていないため、部分的に見えている状態。部分的に遮られているレイヤの上にあるレイヤは不透明。つまり、OPAQUE フラグが設定されているか、ピクセル形式にアルファ チャンネルがないか、レイヤにアルファが設定されていない。
  • 覆われている: 現在のレイヤが不透明でないレイヤによって全体または一部を覆われている状態。依然として画面に表示される可能性がある。覆われているレイヤの上にあるレイヤは不透明ではない。つまり、OPAQUE フラグが設定されていないか、ピクセル形式にアルファ チャンネルがあるか、レイヤにアルファが設定されている。ただし、SurfaceFlinger のトレースでは、SurfaceFlinger より下にあるレイヤに限り、覆われているレイヤが可視として表示される。

    SurfaceFlinger 上の覆われているレイヤ

    図 3. SurfaceFlinger 上の覆われているレイヤ。

ジオメトリとエフェクト

このセクションでは、現在のレイヤに対して要求されたジオメトリやエフェクトと、最終的に適用された計算結果について説明します。

要求のセクションには、レイヤに設定されているプロパティが示されています。これに対して、計算のセクションには、実際にレイヤに適用されているプロパティが示されています。これらの違いは、ジオメトリやエフェクトが階層を通じて継承されるために発生します。

図 2 では、レイヤは角の丸みを 0 px に設定するよう要求していますが、その親レイヤの一つが角の丸みを 97.419 px に設定しているため、最終的にこの値が適用されます。

バッファ

以下のプロパティは、レイヤにバッファがあるか、そのサイズ、および変換に関する情報を示します。

  • フレーム番号: アプリが作成されてからの増分番号。
  • 宛先フレーム: 宛先フレームによって定義された境界に合わせてバッファをスケーリングするために使用される。

階層

以下のプロパティは、レイヤの階層構造がどのように決定されるかを示します。

  • Z オーダー: レイヤの階層内での兄弟レイヤに対する相対的な位置を決定する。Z 値が 0 のレイヤは親レイヤの上に配置される。複数のレイヤが同じ Z 値を持つ場合、レイヤ ID が高い方が上に配置される。
  • 相対親: Z オーダー内での相対的な親レイヤを示す。相対親からは非表示フラグのみを継承し、それ以外のプロパティは継承しない。

入力

以下のプロパティは、タップ可能な領域とフォーカスに関する情報を示します。

  • アイテムを使ってタップ領域を切り抜き: レイヤの境界を使用して、タップ可能領域を切り抜く。
  • 切り抜き領域をタップ領域として使用: 現在のレイヤの切り抜き領域を、そのままタップ可能領域として使用する。