surfaceflinger
文章平均质量分 85
千里马学框架
安卓架构师,安卓技术专家,android framework
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
sf干货知识:SurfaceControl数据如何与Layer的bounds进行关联及Winscope如何查看?
其实看完Layer的computeBounds方法也完全可以理解,因为Layer的bounds其实是受到几个关键因素的影响,比如parent的bounds,自己transform,crop等,综合计算得出了自己的screenbounds显示区域。但是也有同学求助马哥,希望这个文章内容可以扩展一下和平时接触的WMS或者SurfaceControl设置bounds相关数据结合起来,而且经常在Winscope使用时候也需要看这些bounds数据,希望马哥也可以稍微补充一下这块。原创 2025-12-22 12:18:59 · 569 阅读 · 0 评论 -
google官方文档:深入剖析ProtoLog原理及Winscope的查看方式
在我们学习了wms相关课程后,都知道wms和systemui很多地方调用都有Proto相关的日志,有了这些日志可以大大方便调试相关窗口显示疑难问题。这些proto的日志默认都是不开放的,可以动态通过相关命令打开。但是说实话,使用命令有以下几个痛点:1、不一定知道具体要开放哪些Proto的TAG,从而导致经常可能没有开放到对应TAG2、每次机器重启,都需要重新执行wm命令打开Proto那么有没有什么工具可以解决上面痛点呢?那就是今天介绍的Winscope中查看Proto日志。Android 日志记录系统原创 2025-12-21 11:06:28 · 960 阅读 · 0 评论 -
重学SurfaceFlinger之Layer显示区域bounds计算剖析
通过这个简单案例,我们可以看到computeBounds的核心思想:通过逆变换将父边界转换到子层坐标系,以便在同一个坐标系中进行裁剪。子层的内容(源边界)先与自身的裁剪区域相交,再与父边界相交,得到最终在子层坐标系中的边界(mBounds)。然后通过有效变换将mBounds变换到屏幕坐标系,得到屏幕上的实际显示区域(mScreenBounds)。这样的设计保证了每一层都只显示在父层允许的范围内,并且可以方便地应用自身的裁剪。原创 2025-12-19 23:19:00 · 588 阅读 · 0 评论 -
豆包手机助手权限之READ_FRAME_BUFFER剖析
READ_FRAME_BUFFER真的只能截图普通图层,就不可以截取secure的窗口图层吗?原创 2025-12-16 12:30:58 · 757 阅读 · 0 评论 -
Perfetto官方文档教你看CPU Scheduling events部分
例如,调度器可能宁愿等待一段时间,希望当前 CPU 上运行的线程进入空闲状态,从而避免跨 CPU 迁移,这在开销和功耗方面可能代价更高。sched_switch 事件仅在线程处于 R(可运行) 状态且正在 CPU 运行队列上运行时发出,而 sched_waking 事件则在任何导致线程状态改变的事件发生时发出。表中的每一行显示了特定线程(utid)开始运行的时间(ts)、在哪个核心上运行(cpu)、运行了多长时间(dur),以及它停止运行的原因:end_state。那么cpu片段这块的信息到底如何看呢?原创 2025-12-01 09:54:54 · 879 阅读 · 0 评论 -
Perfetto性能优化:卡顿检测之FrameTimeline官方文档详细剖析
NOTE: FrameTimeline requires Android 12(S) or higherA frame is said to be janky if the time the frame was presented on screen doesnot match the predicted present time given by the scheduler.A jank can cause:FrameTimeline is a module within SurfaceFlinger原创 2025-11-27 23:21:48 · 1087 阅读 · 0 评论 -
android图形绘制学习之从0写一个native层的绘图应用程序3种方式
在上面的示例中,几个关建点是,第一步,先创建出一个SurfaceComposerClient,它是我们和Surfaceflinger沟通的桥梁,第二步,通过SurfaceComposerClient的createLayer接口创建一个SurfaceControl,这是我们控制Surface的一个工具,第三步,从SurfaceControl的getSurface接口来获取Surface对象,这是我们操作BufferQueue的接口。更多framework实战开发干货,请关注下面“千里马学框架”原创 2025-11-27 09:13:44 · 851 阅读 · 0 评论 -
安卓自带实时帧率展示的2种方式详细剖析
但是大家注意,这样修改后发现后续进行setprop debug.fps.show 1后,新打开的app(也就是完全一个新的进程,这种我们常规理解是新的类要重新加载)也发现没有任何的变化,永远都是保持为DEBUG_FPS false。新版本的aosp15版本在看ViewRootImpl相关类代码时候,发现系统居然自带了各个图层的FPS相关的打印功能了,以前没有这个功能时候我们都是自己做的fps功能,今天一起来看看原生自带fps的2种方式哈。后续应用进程fork自Zygote,继承这些"固化"的值。原创 2025-11-25 11:33:13 · 1117 阅读 · 0 评论 -
上帝视角看App是如何绘制一帧画面的到Surface的?结合Perfetto/Systrace分析
以前讲解时候,为了方便都是以native程序进行分析,绘制数据等都是最简单填充rgb颜色数据,但是vip学员们反馈能否补充一些关于Activity这种普通apk绘制的流程。今天刚好找到一篇老同事们写的一篇blog刚好是讲解Activity的view绘制流程的,这里就稍微进行一些修改整理,给大家进行分享。原创 2025-11-21 12:44:56 · 1024 阅读 · 0 评论 -
如何让Perfetto像日志瞬时打印事件-重学Perfetto的ATRACE相关API
常见使用perfetto进行看方法调用时候,每个方法执行都是有一个个片段,因为代码中加入atrace时候都有对应begin和end方法成对出现,哪怕ATRACE_CALL这种宏其实也是一个临时对象进行构造时候调用atrace_begin,在析构方法中atrace_end。上面是我们的常用打印atrace方法情况,但是大家有没有想过我们打印日志其实是一个瞬时动作,直接调用一下ALOGE方法就可以这个时间点输出日志,完全不需要begin和end成对打印。可以看到最后就是调用到了atrace_instant。原创 2025-10-13 10:58:48 · 754 阅读 · 0 评论 -
aosp15 SurfaceFlinger打印ATRACE编译报错及ScopedTrace类剖析
首先大家可能下意识的会忽略掉前两个.h中错误,因为可能觉得这块代码都不是我们自己写的,所以很容易不理会,但是错误3因为属于自己加入代码并且报错就在加的哪一行,一般注意力都在错误3,这样看其实也算正常啦,毕竟大家下意识只关注自己加入代码。哈哈,那这里其实就清楚了,原理SurfaceFlinger对于ATRACE打印这块有自己做了全新的trace.h来定义相关的trace打印输出的宏,所以代码中一旦引入了SurfaceFlinger自己的trace.h就不可以再使用。那么到底是怎么回事呢?原创 2025-10-13 01:07:20 · 326 阅读 · 0 评论 -
aosp13/14/15/16如何实现窗口局部区域高斯模糊毛玻璃效果及Winscope原生重大bug发现
以前高斯模糊原理也分析过,知道是在SurfaceFlinger触摸绘制时候进行的高斯模糊,那么再来分析一下高斯模糊相关实现时候是否有相关区域设置参数,从而反推出相关接口。简单说学员就是想实现对状态栏等区域局部进行高斯模糊,以前方案是针对窗口layer所有进行模糊,那么是否可以实现窗口的局部高斯模糊呢?但是上面分享模糊都是针对整个窗口进行的,就是桌面窗口设置一下后面窗口进行模糊的标志位,然后针对桌面窗口后面的壁纸窗口进行整体模糊。那么接下来要去探索aosp原生系统是否有接口支持局部高斯模糊呢?原创 2025-09-19 10:17:56 · 728 阅读 · 0 评论 -
安卓闪黑黑屏分析工具:aosp14/15版本Winscope之SurfaceFlinger信息剖析
被覆盖的层前方的层透明,也就是说,前方的层未设置 OPAQUE 标志、像素格式包含 alpha,或设置了 alpha。被遮挡的层前方的层不透明,也就是说,前方的层设置了 OPAQUE 标志、像素格式不包含 alpha,或未设置 alpha。被部分遮挡的层前方的层不透明,也就是说,前方的层设置了 OPAQUE 标志、像素格式不包含 alpha,或未设置 alpha。注意:如果某个层被一个或多个不透明层遮盖,或者被一个包含不透明像素的半透明层覆盖,则该层可能会被视为可见,但不会显示在界面上。原创 2025-09-13 10:29:27 · 1034 阅读 · 0 评论 -
性能优化必学基础:perfetto/systrace添加抓取trace块java/c++方法汇总
这些perfetto上展示的执行块slice,其实一般都是在aosp的原生代码中进行的埋点,简单说看到每个slice其实都是有对应的埋点代码,当然这个代码可能是java,c++等,而且哪怕都是java和c++这种也分为是基于源码编译的java,c++代码还是说基于sdk和ndk的java、c++代码,这些都是有差异的,所以针对这些不同的代码和编译情况今天都进行汇总,给大家展示应该如何在自己程序埋入perfetto的slice。跟踪一个动画的开始与结束,可以看出它的执行时长,和同步执行那种单线程完全不一样。原创 2025-08-04 11:36:45 · 957 阅读 · 0 评论 -
重学WMS层级结构单手OneHanded Feature作用-源码分析
2、单手设置本质就是对上面所有FEATURE_ONE_HANDED的WindowContainer进行位置Y方向的偏移。1、收集所有的Feature为FEATURE_ONE_HANDED的WindowContainer,进行保存到集合。这里OneHandedTransitionAnimator又是由ofYOffset方法导致的构造。那么这里的mDisplayAreaTokenMap又是哪里设置的呢?那么看看这里的leash是哪里传递过来的。那么这里的mLeash又是哪来的呢?原创 2025-07-30 17:24:49 · 678 阅读 · 0 评论 -
重学wms的Feature之FEATURE_WINDOWED_MAGNIFICATION剖析
3、对系统的display的图层会进行Mirror,创建出一个新的MirroRoot图层,下面挂载了系统层级结构的Mirror图层,名字一般会在后面加上“(Mirror)”字样,内容和源图层一样。而且这些图层是有本质上是Mirror了现有的图层,比如桌面和壁纸都显示在放大镜的区域,而且只有放大镜的区域桌面和壁纸是放大的,其他非放大镜区域就是正常显示,那么是如何实现这样呢?但是大家是否有一个很大疑问?2、放大镜功能开启后,会创建对应的Windowless窗口,而且这个窗口有对应的SurfaceView。原创 2025-07-30 16:06:29 · 615 阅读 · 0 评论 -
深入再学wms:系统辅助放大镜功能原理剖析--学员作业
窗口放大功能Android 12 中引入的局部屏幕放大功能为弱视用户提供了经过改进的视图选项。弱视用户可能佩戴有一定度数的眼镜,或者由于环境条件或疾病而暂时难以看清屏幕。暂时性困难可能由过度照明或用户极度疲劳等原因导致。Android 12 中的局部屏幕放大功能让用户能够在整个屏幕放大和局部屏幕放大之间切换。使用局部屏幕放大功能,用户可以在屏幕上拖动放大的局部屏幕来查看不同区域。放大功能启用时,系统会显示一个可让用户切换到整个屏幕放大功能的切换按钮。原创 2025-07-29 12:54:42 · 403 阅读 · 0 评论 -
aosp15实现SurfaceFlinger的dump输出带上Layer详细信息踩坑笔记
但是在aosp15版本上这个mLayerLifecycleManagerEnabled值一直都是true,所以根本不会进入执行这块的mDrawingState.traverse,也就是说在aosp15版本的SurfaceFlinger已经弃用了这个mDrawingState.traverse。给大家布置了一个小作业,那就是需要实现dumpsys SurfaceFlinger相关输出中可以携带上所有的Layer的详细信息需求,今天来带大家详细实现一下这个需求。在总的dump方法最后,加入如下代码。原创 2025-07-19 22:11:24 · 1018 阅读 · 0 评论 -
aosp15上SurfaceFlinger的dump部分新特性-无Layer相关详细信息输出如何解决?
上面Input list输出内容可以看出,这里重点展示的触摸相关的区域信息,而且还会有当前input layer没有visibility的原因显示,因为layer虽然可以成为InputDispatcher中的传递对象,但是他不一定显示,最经典的就是ActivityRecordInputSink这种。虽然有了上面几个新特性的亮点功能,但是也发现aosp15版本把一些比较重要的信息进行了删除裁剪,这里最明显是再也没有详细的Layer信息。这块就留给学员朋友们的一个小作业哈,难度较低,希望大家积极踊跃完成哈。原创 2025-07-19 22:08:36 · 1214 阅读 · 0 评论 -
SurfaceFlinger中有Layer泄漏一直增长超过4096问题如何排查-实战问题分析排查
有学员在vip群里反馈一个SurfaceFlinger相关的报错群里讨论也非常激烈。问题如下:sf的报错信息大概可以看出这个是创建的Layer数量已经大于4096个,sf端有保护机制,为了让内存不会永久持续增大,只能报错异常,不然在创建新的。对应的代码如下:那么出现这种问题一般是什么原因呢?正常的系统要展示窗口时候创建layer,不展示时候肯定就会销毁layer,这样layer肯定不会只增不减,所以4096在长期经验来说已经足够大了,一旦会超过4096这个数量,那一般就是有泄露。原创 2025-07-10 11:03:08 · 1497 阅读 · 0 评论 -
自由窗口边框阴影描绘方案汇总-社群讨论学习
可以采用Windowless图层,让Windowless图层需要挂载在Task的父亲,而不是Task哈,因为Task本身被设置了WindowCrop,会裁剪掉面积大小,导致显示异常,所以这里要挂载到Task的显示区域大的父亲上。然后在GPU绘制时候,可以考虑使用skia绘制一个阴影图层,这个在SurfaceFlinger中gpu合成绘制时候是可以使用skia相关的api绘制阴影,具体skia代码如何绘制实现可以参考原来。2、阴影View正常要比Task区域显示要大一些,这样才可以有外阴影的效果。原创 2025-01-26 11:06:25 · 618 阅读 · 0 评论 -
Winscope中抓取window相关数据的原理剖析
因为Winscope是一个动态的过程,属于数据是不断变化的而上面只是开始抓取时候有往mBuffer中添加,那么是什么地方可以触发这个WindowTracing源源不断的打入log,即添加到mBuffer中?可以看出来这里会有一个很重要的 mRoot.dumpDebug,mRoot就是RootWindowContainer,它会迭代dump出来整个wms层级结构的所有数据的详细信息,这样也是浏览器上可以绘制层级结构详细信息的关键。然后主要看看WindowManagerShellCommand的相关的方法。原创 2024-11-30 12:02:34 · 1214 阅读 · 0 评论 -
Winscope中抓取Transaction相关的原理剖析
首先这个service call就是直接调用到SurfaceFlinger这个service的onTransact方法,1041代表是code,i32代表是data的int类型,1和0代表就是值。那么选着Transaction选项后抓取Winscope,看看winscope_proxy.py程序的相关输出,看看有没有线索可以查到是如何获取系统的相关Transaction数据。在使用Winscope过程经常会有如下的一些选项供我们进行选择,不同的选项最后就会展示不同的数据项出来。具体这些数据是哪里来的呢?原创 2024-11-28 12:11:15 · 1380 阅读 · 0 评论 -
aosp14/15上的针对单app录屏原理探索及自实现的方案讨论
时候,有给大家讲解过一个实战项目是针对某个app进行单图层进行截图方案,是不是和这个很类似,大家可以考虑一下是否可以进行简单的修改就可以实现对这个单app录屏功能。新版本的单独app进行录制视频功能的交互大概就是上面的,整个过程就是让用户可以选择一个app,然后启动这个app到前台,在进行单独录屏处理。这里针对aosp上实现单app录屏的进行一些代码的剖析,本篇不进行详细的源码分析,主要把核心原理给大家讲解清楚。如果针对单app进行录屏的功能要我们完全自己实现会如何实现呢?大家是否有相关的方案呢?原创 2024-11-20 15:33:08 · 829 阅读 · 0 评论 -
安卓手机/平板等设备添加左右两边侧边栏需求项目-学员作业布置
近期有学员朋友求助一个给安卓设备的左右两边要加入侧边栏的需求,这个需求其实还和平时的系统自带的Navigationbar,或者StatusBar等窗口不一样。因为无论是Navigationbar,或者StatusBar都是属于和手机屏幕画面是一起的,而这个左右侧边栏的需求是想把主屏幕画面和侧边栏画面是独立的,二者互不干扰的情况。3、侧边栏的画面不会因为正常手机画面的页面跳转而被覆盖,侧边栏点击相关按钮可以让正常手机画面有页面跳转等操作交互。1、input相关的触摸知识部分。2、wms相关的知识。原创 2024-11-11 09:25:49 · 525 阅读 · 0 评论 -
android12/13/14版本wms最新面试题:dumpsys window和sf一定会一致么?
针对这个问题,其实就是说window结构树顺序依赖关系和sf的Layer结构树依赖关系居然不同,大家也知道正常情况下肯定要一模一样,因为Layer虽然可以新加入,但是不能说原来的window对应的Layer结构树顺序都乱了,这样可能会造成显示类的bug。基于上面这个2个面试题,其实本质上是对wms还有surfaceflinger相关知识的深入考察,而且问题属于难度等级层次分明,慢慢变大的情况,所以要完全可以拿捏对这问题,基本上wms部分的知识考察就可以得到面试官的高度认可打高分。原创 2024-09-29 00:22:53 · 1504 阅读 · 0 评论 -
android14多屏幕帧率刷新率统计显示开发及成果展示
但是近来有学员提到一个疑问,那就是如果是存在多屏的情况下,而且多屏都在刷新的情况下,那么帧率显示起来就比较乱,因为原来方案基本上都是有layer显示就会累计,根本不管到底是哪个屏幕的。在SurfaceFlinger课程专题有做了一个帧率显示的工具,大部分在当时的代码大部分在SurfaceFlinger层面实现的。4、在computFps时候,针对拿layer的dispkayID和prop获取的displayID进行比较,相等则可以统计。1、针对layer需要获取每个layer的对应的displayID。原创 2024-09-12 16:39:58 · 1210 阅读 · 0 评论 -
安卓framework单屏幕Display秒双/多屏互动相关需求改进-fw窗口多屏sf实战开发
一些vip学员朋友也纷纷求助马哥的实现patch代码,想用于公司的实战项目实现。但是在公司需求实现要求和马哥这边的实现还是会有一些需求上的变更和设备环境差异,所以使用过程中学员朋友们也提出了一些额外的问题。这个问题其实在马哥自己设备上从来没有发现过,但是有的vip学员朋友和我反馈有这种黑屏不显示情况,针对这个问题第一时间进行了分析,主要通过提供的dumpsys SurfaceFlinger来查看。2、因为上下结构已经实现,如果左右结构,针对触摸部分,如果左右结构需要更改触摸区域的宽度变宽。原创 2024-09-08 09:00:00 · 1436 阅读 · 0 评论 -
android手机电视相框项目-学员做出个bug版本邀请大家review提意见
这个项目我说过不给提供答案哈,让各位学员朋友自己独立思考完成哈,因为尽量想让大家慢慢的要脱离每次可以抄袭马哥课程作业的习惯,这样才可以在以后framework工作中独立自主完成。上面就我们学员的成果和代码,让其他学员可以参考评估,在这基础上做出更好的相框手机和电视。明显在分屏情况等情况下会有画面显示异常,和正常屏幕显示画面有残缺部分。基本上看效果看着有相框的感觉了,功能应该算实现了80%本文章更多详细代码和资料原创 2024-07-06 11:27:15 · 564 阅读 · 0 评论 -
ActivityRecordInputSink的触摸区域TouchRegion详细解读
到这里就完美解释清楚了ActivityRecordInputSink巨大区域是哪里来的,本质还是因为replaceTouchableRegionWithCrop设置成了true原创 2024-06-18 16:38:29 · 1432 阅读 · 0 评论 -
安卓VirtualDisplay虚拟屏幕如何实现没有内容显示mirror内容(aosp14版本)
这里面主屏幕的Layer都会在虚拟屏幕有一个对应的Mirror Layer即直接对主屏幕的每一个layer进行了Mirror原创 2024-06-14 15:44:16 · 1630 阅读 · 1 评论 -
安卓VirtualDisplay虚拟屏幕如何实现自身display没有内容显示mirror屏幕内容(aosp13)
VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR设置1、会在DisplayContent的mApplySurfaceChangesTransaction中对Display是否有内容进行确定2、一旦涉及了Display的上有内容到无内容的变化会调用setDisplayLayerStack来重新设置layerStack3、在sf中layer会对layerStack进行匹配然后决定显示哪个Display本文章更多详细代码和资料需要购买课程获取。原创 2024-06-11 16:49:20 · 2239 阅读 · 0 评论 -
wms中对屏幕进行修改wm size设置屏幕宽高原理剖析
所以这里其实就是最核心的transform,有了它就可以把自定义的屏幕size和屏幕本身size进行统一,让1440x2960大小屏幕可以显示1080x1920屏幕大小内容。从上面一系列的dumpsys可以得出结论,一旦wm size成了新的屏幕size后,整个系统的大小确实变化了,连displayContent也是变化的。明显看到差异就是屏幕上下有黑边了,那么下面就来调研这个wm size是怎么做的的display大小修改的。原创 2024-06-03 18:55:38 · 1377 阅读 · 0 评论 -
Vsync之app层面深入分析
前面文章和视频课程都是直接从SurfaceFlinger层面开始讲解Vsync部分的,当然vsync的主要核心逻辑也确实在SurfaceFlinger,但是一般vsync都是由app层面发起请求的,这一部分也还是有必要带大家了解清楚。createDisplayEventConnection方法,这个方法app发起跨进程调用后会到服务端BnSurfaceComposer,这个SurfaceFlinger是继承这个BnSurfaceComposer的。原创 2024-04-23 23:37:47 · 1604 阅读 · 0 评论 -
实时刷新率Fps实现相关知识讲解
1、利用FrameTimeLine来获取实时fps的数据2、直接使用SurfaceFlinger中的RefreshRateOverlay这个图层类来负责显示这个实时fps数据原创 2024-03-25 23:39:29 · 1447 阅读 · 0 评论 -
SurfaceFlinger实战dump获取单个Layer图像方案学员改进成果
学员朋友们拿到后也进行了认真的实战开发,而且针对马哥提供方案也做了一些改进,下面就分享一下两个学员朋友等改进建议。原创 2024-03-20 00:18:11 · 1279 阅读 · 0 评论 -
c++基础知识之父类地址和基类地址一定相同?
是不是可以认为这里RefBase在incStrong of后面打印的this肯定和上面的LayerHandle打印的this一样?原创 2024-03-11 13:53:50 · 1098 阅读 · 0 评论 -
ActivityRecordInputSink深入剖析全网独家分析
dumpsys input可以看到一个ActivityRecordInputSink在Activity的下面原创 2024-03-06 12:56:26 · 1797 阅读 · 0 评论 -
安卓14/aosp14相比安卓13录屏多了MirrorRoot深入剖析解密-千里马android framework实战开发
到这里,就把学员提出的录屏时候Mirror问题前后版本出现与不出现的原因搞清楚了,整体其实探索出来了结果后并不是很复杂,但是如果要自己去探索还是有一定的难度的。虽然有难度,马哥还是希望大家平时遇到相关的技术疑问时候不要轻易放弃或者完全不管,应该努力用自己学习知识应用起来,结合起来,去分析实际开发中遇到一些问题。只有这样不断探索,技术才会不断成长,成长到有一天你发现你对这个模块理解深入程度基本上也不输给任何人的时候,你就是这方面的顶级专家。本文章更多详细代码和资料需要购买课程获取。原创 2024-03-02 17:15:48 · 1684 阅读 · 0 评论 -
SurfaceFlinger实战dump获取单个Layer图像方案及成果展示-千里马学框架
今天来给大家分享一下如何实现单独获取某个Layer的图片,而不是整个屏幕的图片。原创 2024-02-27 16:52:15 · 2804 阅读 · 0 评论
分享