背景:
近期学员们学习了马哥wms课程后,去参加相关的大厂的framework面试,有一个学员朋友带回来了一个wms相关的面试题,具体面试题描述如下:
问题1
请问wms的window和SurfaceFlinger的Layer有什么关系?
回答了这问题1后,紧接着会继续深入问问题2
问题2
既然二者关系是一一对应的,那么请问wms层面的层级结构树就一定和SurfaceFlinger层面的Layer结构树一定一致么?
如果回答了不一致,会要求列举出几种不一致的情况(这里还会对列出的情况还进行深入挖)。
基于上面这个2个面试题,其实本质上是对wms还有surfaceflinger相关知识的深入考察,而且问题属于难度等级层次分明,慢慢变大的情况,所以要完全可以拿捏对这问题,基本上wms部分的知识考察就可以得到面试官的高度认可打高分。
那么下面来剖析一下如何得上面问题的高。
面试题回答和剖析
问题1
请问wms的window和SurfaceFlinger的Layer有什么关系?
难度评价: 中
考察wms理解,SurfaceFlinger的理解
这个其实课程就已经和大家讲解的很清楚了,高版本android把引入了窗口层级结构树的概念,这个树上的任意节点其实都是继承了WindowContainer类,WindowContainer在创建或者添加时候都会产生一个对应的SurfaceControl,而SurfaceControl又会触发到SurfaceFlinger创建一一对应的Layer,而且WindowContainer的层级结构关系都会一一影响自己SurfaceControl,所以一般在SurfaceFlinger也会有一个和wms一一对应Layer结构树。
问题2
请问wms层面的层级结构树就一定和SurfaceFlinger层面的Layer结构树一定一致么?
难度评价: 较高
问题1属于考查wms理论知识后,开始要加大难度考察wms的深入实战理解知识,即这个问题如果你平时只是学习了wms理论知识,理解了层级结构树,但是没有做过较多wms相关的实战项目及丰富经验。那么这个问题很可能就答不上来,因为在正常情况下,确实wms的层级结构树都是与Sf的Layer结构树完全一致
那么什么时候不一致呢,不一致又有哪些情况呢?
这个面试问题课程可能没有现成的答案,但是课程其实也都有讲解过不一致的情况,具体列出几个经典的案例场景
1、经典的学习车载多屏互动课程时候,是不是有创建单独Mirror图层,一直靠操作这个Mirror图层来进行的操作画面,但是并没有在wms成名创建对应的WindowContainer。
2、学习分屏PIP自由窗口专题时候,有讲解PIP的顶层WindowLess的部分,是不是就是在dumpsys window方式看不到任何的window,但是确实有相关Sf的Layer情况。
3、还有在以前直播时候也讲解过,普通的InputMonitor全局监听事件和monitorGestureInput有啥区别?本质就是GestureInput额外多了图层在sf中。
4、blog有分享过ActivityRecordInputSink相关的剖析,他也是个典型的sf中有图层,但是window中没有。
上面若干案例其实都有一个共同点,都明显表达出一个结论:
sf中的图层不一定window中有,即sf图层可以单独创建挂载不受window的约束和影响,即sf的图层一般比window多的情况。
问题要是可以回答到以上几点其实基本上就算过关了,但是如果还要深挖,那么可能还有有如下的问题:
是否有遇到过sf中的Layer图层和window结构树数目对象都一样,但是顺序不一样,如果有遇到过请举例一下案例。
这种其实就是对一些少见的疑难bug问题的分析经验的考察,看看你是否有遇到过同类型的疑难杂症。
针对这个问题,其实就是说window结构树顺序依赖关系和sf的Layer结构树依赖关系居然不同,大家也知道正常情况下肯定要一模一样,因为Layer虽然可以新加入,但是不能说原来的window对应的Layer结构树顺序都乱了,这样可能会造成显示类的bug。
正常dumpsys activity containers看到是com.android.messaging/.ui.conversation.ConversationActivity在顶部显示者,但如果dumpsys SurfaceFlinger 发现确实com.android.launcher3/com.android.launcher3.uioverrides.QuickstepLauncher显示,而短信却被显示在桌面下面即被遮盖了,无法显示出来。
如果有遇到过这类的问题再聊一下相关分析和经验那么问题也就完美得分肯定也会额外加分。
更多framework技术干货,请关注下面“千里马学框架”