分享

Android L SurfaceFlinger dump信息全解(1)

 wusiqi111 2019-09-23

4 layer的dump

接下来就是很长的一段layer的dump,一般以这样一句话开始:

Visible layers (count = 9)

count的值来源于layersSortedByZ中layer的数量. 

接下来就进入各个layer的dump,我们参考代码并以launcher所在的layer为例来解释下各行的意义:

+ Layer 0xb3f92000 (com.sec.android.app.launcher/com.android.launcher2.Launcher) id=87

0xb3f92000指向当前layer对象的值,括号中是当前layer的名称,id是创建layer时产生的序列号.

4.1 区域信息

Region transparentRegion (this=0xb3f92164, count=1) [ 0, 0, 0, 0] Region visibleRegion (this=0xb3f92008, count=1) [ 0, 0, 1440, 2560]

接下来的两段是两个Region的dump,每个region可能包含多个区域,所以这里count也可能不等于1. 

前两行的值来源于activeTransparentRegion,表示的是这个layer里面透明区域的大小. 

后两行值来源于visibleRegion,表示可见区域的大小.

4.2 基本信息

layerStack= 0, z= 21010, pos=(0,0), size=(1440,2560), crop=(0, 0,1440,2560), isOpaque=0, invalidate=0, alpha=0xff, flags=0x00000000, tr=[1.00, 0.00][0.00, 1.00] client=0xb11160c0

上面这段dump源自这段代码:

result.appendFormat( " " "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), " "isOpaque=%1d, invalidate=%1d, " "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" " client=%p\n", s.layerStack, s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h, s.active.crop.left, s.active.crop.top, s.active.crop.right, s.active.crop.bottom, isOpaque(s), contentDirty, s.alpha, s.flags, s.transform[0][0], s.transform[0][1], s.transform[1][0], s.transform[1][1], client.get());

layerStack表示这个layer是保存在哪个layerstack中(不同的display是有不同的layerstack的,这点可以通过一个连接HDMI时的layerstack很容易确认).

z表示Z轴坐标,z值越大,layer越靠上.

pos的值是layer左上角的位置,这个值比较特殊的是ImageWallpaper这个layer的pos值,因为ImageWallpaper的大小大于屏幕大小,所以ImageWallpaper的pos值在屏幕的外面(note4是pos=(-560,0)).

size自然是layer的大小

enum { eLayerHidden = 0x01, // SURFACE_HIDDEN in SurfaceControl.java eLayerOpaque = 0x02, // SURFACE_OPAQUE eLayerTransparent = 0x200, // SURFACE_TRANSPARENT }; enum { ePositionChanged = 0x00000001, eLayerChanged = 0x00000002, eSizeChanged = 0x00000004, eAlphaChanged = 0x00000008, eMatrixChanged = 0x00000010, eTransparentRegionChanged = 0x00000020, eVisibilityChanged = 0x00000040, eLayerStackChanged = 0x00000080, eCropChanged = 0x00000100, /* SRIB : Smg Surface Animator : State that will indicate animation change */ e3DAnimationChanged = 0x00001000, /* SRIB : Smg Surface Animator : Change End*/ eOpacityChanged = 0x00000200, // { SRUK-SFBLUR eTranslucentRegionChanged = 0x00000400, // SRUK-SFBLUR } eTransparencyChanged = 0x80000000, }; enum { // (keep in sync with Surface.java) eHidden = 0x00000004, eDestroyBackbuffer = 0x00000020, eSecure = 0x00000080, eNonPremultiplied = 0x00000100, eOpaque = 0x00000400, eProtectedByApp = 0x00000800, eProtectedByDRM = 0x00001000, eCursorWindow = 0x00002000, /* SISO Changes for Internal_Only - Start */ eFXInternalDisplay = 0x80000000, /* SISO Changes for Internal_Only - End */ eFXSurfaceNormal = 0x00000000, eFXSurfaceDim = 0x00020000, eFXSurfaceMask = 0x000F0000, // begin of app fw : fixed orientation window eFixedOrientation = 0x40000000, // end of app fw // begin of MDM remote control eNoRemoteControl = 0x08000000, // end of MDM remote control };

所有的这些值都可能影响layer的状态,涉及不同模块不同功能,这里不再展开.


(4)打印Displays信息

  首先会打印当前display的数量,数量基于mDisplays的大小,这个容器在SurfaceFlinger初始化时会生成数据,后面根据收到不同的消息在handleTransactionLocked函数中也会调整.
正常情况下是1,也就是只有一个display(Built-in Screen),当设备连接了HDMI或者使用了屏幕共享等功能时,会有额外的display加入。

  1. Displays (2 entries) //这个是连接了HDMI后的数据

  2. + DisplayDevice: HDMI Screen

  3. type=1, hwcId=1, layerStack=6, (1920x1080), ANativeWindow=0xb4d94d08, orient= 0 (type=00000000), flips=1173, isSecure=1,

  4. secureVis=0, powerMode=2, activeConfig=0, numLayers=1

  5. v:[0,0,1920,1080], f:[0,0,1920,1080], s:[0,0,1920,1080],transform:[[1.000,0.000,-0.000][0.000,1.000,-0.000][0.000,0.000,1.000]]

  6. mAbandoned=0

  7. -BufferQueue mMaxAcquiredBufferCount=2, mDequeueBufferCannotBlock=0, default-size=[1920x1080], default-format=1, transform-hint=00,

  8. FIFO(0)={}

  9. [00:0xb6418c80] state=FREE , 0xb43ed880 [1920x1080:1920, 1]

  10. [01:0xb43cb300] state=FREE , 0xb640d970 [1920x1080:1920, 1]

  11. >[02:0xb43cb280] state=ACQUIRED, 0xb43ed830 [1920x1080:1920, 1]

  12. + DisplayDevice: Built-in Screen //DisplayDevice是设备的名字,这个可以调用接口设置,但是比较常见的值一般有:Built-in Screen,HDMI Screen,Virtual Screen,wfdservice等等

  13. type=0, hwcId=0, layerStack=0, (1080x1920), ANativeWindow=0xb4d94608, orient= 0 (type=00000000), flips=3140, isSecure=1,

  14. secureVis=0, powerMode=2, activeConfig=0, numLayers=2

  15. v:[0,0,1080,1920], f:[0,0,1080,1920], s:[0,0,1080,1920],transform:[[1.000,0.000,-0.000][0.000,1.000,-0.000][0.000,0.000,1.000]]

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多