Android dumpsys SurfaceFlinger分析

时间:2025-04-03 15:52:33

对于分析一些显示问题,我们需要使用adb shell dumpsys SurfaceFlinger命令来获取SurfaceFlinger的dump信息,因此这里来详细讲解下SurfaceFlinger的dump信息。

Display identification data:      //display信息 
Display 19260441557360770 (HWC display 0): port=130 pnpId=QCM displayName=""  //19260441557360770是HWC dislay id

Visible layers (count = 70)   //count的值来源于layersSortedByZ中layer的数量.

*- Output Layer 0xb4000073181a9a30(SurfaceView - /#0)   //括号里是当前layer的名称
Region visibleRegion (this=0xb4000073181a9a48, count=1)  //visibleRegion,表示可见区域的大小.每个region可能包含多个区域,所以这里count也可能不等于1.
    [  0,  38, 2340, 1041]
        Region visibleNonTransparentRegion (this=0xb4000073181a9ab0, count=1)
    [  0,  38, 2340, 1041]
        Region coveredRegion (this=0xb4000073181a9b18, count=1)
    [  0,  38, 2340, 1041]
        Region output visibleRegion (this=0xb4000073181a9b80, count=1)
    [ 39,   0, 1042, 2340]
        Region shadowRegion (this=0xb4000073181a9be8, count=1)
    [  0,   0,   0,   0]
      forceClientComposition=false clearClientTarget=true displayFrame=[39 0 1042 2340] sourceCrop=[0.000000 0.000000 1002.000000 2340.000000] bufferTransform=0 (0) dataspace=UNKNOWN (0) z-index=0 
      hwc: layer=0x0824 composition=DEVICE (2)    //表明这个layer是device合成

layerStack=   0, z=        3, pos=(0,0), size=(   0,   0), crop=[  0,   0,  -1,  -1], cornerRadius=0.000000, isProtected=0, isOpaque=0, invalidate=1, dataspace=Default, defaultPixelFormat=Unknown/None, backgroundBlurRadius=0, color=(0.000,0.000,0.000,1.000), flags=0x00000000, tr=[0.00, 0.00][0.00, 0.00]
parent=DefaultTaskDisplayArea#0
zOrderRelativeOf=none
activeBuffer=[   0x   0:   0,Unknown/None], tr=[0.00, 0.00][0.00, 0.00] queued-frames=0, mRefreshPending=0, metadata={5:4bytes}, cornerRadiusCrop=[0.00, 0.00, 0.00, 0.00], shadowRadius=0.000, 
      
//layerStack: 表示这个layer是保存在哪个layerstack中(不同的display是有不同的layerstack的,这点可以通过一个连接HDMI时的layerstack很容易确认).
//z: 表示Z轴坐标,z值越大,layer越靠上.
//pos: pos的值是layer左上角的位置.
//size: 是layer的大小.
//crop: crop代表裁剪区域.
//isOpaque: 代表是否是不透明的,只有完全不透明的layer这个值才是1.
//invalidate: 表示这个layer的数据是失效的,这个值绝大多数情况下都是0.
//alpha: 表示了这张layer的透明度,这个值跟isOpaque是有区别的.isOpaque表示了这个layer可以是透明的,也就是没有显示数据的地方;而alpha表示透明度,也即是有数据的地方也可以因为透明度而受到影响产生透明的效果.
//tr: 代表屏幕的旋转和缩放程度.大多数的layer实际上是不需要旋转和缩放的,因为他们定义的大小就是跟屏幕一致的.

Display 19260441557360770 HWC layers:   //Display 的layers合成信息
-----------------------------------------------------------------------------------------------------------------------------------------------
 Layer name
           Z |  Window Type |  Layer Class |  Comp Type |  Transform |   Disp Frame (LTRB) |          Source Crop (LTRB) |     Frame Rate (Explicit) [Focused]
-----------------------------------------------------------------------------------------------------------------------------------------------
 SurfaceView - /#0
  rel     -2 |            0 |            0 |     DEVICE |          0 |   39    0 1042 2340 |    0.0    0.0 1002.0 2340.0 |                              [*]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 /#0
  rel      0 |            1 |            0 |     DEVICE |          0 |    0    0 1080 2340 |    0.0    0.0 1080.0 2340.0 |                              [*]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 ScreenDecorOverlay#0
  rel      0 |         2024 |            0 |     DEVICE |          0 |    0    0 1080   60 |    0.0    0.0 1080.0   60.0 |                              [ ]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 ScreenDecorOverlayBottom#0
  rel      0 |         2024 |            0 |     DEVICE |          0 |    0 2280 1080 2340 |    0.0    0.0 1080.0   60.0 |                              [ ]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

这里注意:SurfaceView的Layer Z轴位置是小于用来其宿主Activity窗口的Layer的Z轴位置的,但是前者会在后者的上面挖一个“洞”出来,以便它的UI可以对用户可见。实际上,SurfaceView在其宿主Activity窗口上所挖的“洞”只不过是在其宿主Activity窗口上设置了一块透明区域。