对于分析一些显示问题,我们需要使用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窗口上设置了一块透明区域。