Android的UI渲染机制(一)

应用程序与Surface的关系,从应用程序的Activity开始,一路追踪到ViewRoot、WindowManager Service。

SurfaceFlinger则主要负责视图的显示,其管理多个surface进行图像合成。WindowManager Service由System_Server进程启动,SurfaceFligner也在这个进程中。

App端copyFrom() 出来 Native Surface 时会创建一个 SharedBufferClient ,其与与 SharedClient 这块共享内存关联。当客户端 addView() 或者需要更新 View 时,会通过 SharedBufferClient写入数据到 ShareClient 中,SurfaceFlinger 中的 SharedBufferServer 接收到通知会将 FrameBuffer 中的数据传输到屏幕上。

HWComposer 是基于硬件来产生 VSync 信号的,来通知 SurfaceFlinger 重绘,控制显示的帧率。

接下来,我们来看下一个Android应用从应用程序图标到视图渲染完成的完成过程。

  1. zygote进程在响应请求后会fork 一个子进程,这个子进程是App对应的进程,它的入口函数是ActivityThread类的main函数。
  2. ActivityThread类中有一个handleLaunchActivity函数,它就是创建Activity的地方。handleLaunchActivity中用performLaunchActivity返回一个Activity,其作用有以下两点:根据类名以Java反射的方法创建一个Activity;调用Activity的onCreate函数。在onCreate函数中,我们一般会调用setContentView函数。
  3. setContentView即为window设置当前view。这里的window即phoneWindow,用于控制顶层窗口的外观和行为,它的作用是绘制背景和标题栏、默认的按键处理等。它将作为一个顶级的View加入到WindowManager中;View是一个基本的UI单元,占据屏幕的一块矩形区域,可用于绘制,并能处理事件。
  4. ViewRoot是View视图体系的根,每一个Window(注意是Window,比如PhoneWindow)有一个ViewRoot,它的作用是处理layout和View视图体系的绘制工作。视图体系包括Views和ViewGroupViewRoot继承了Handler类,看来它能处理消息。ViewRoot重写了handleMessage函数。
  5. ViewRoot有一个成员变量叫mSurface,它是Surface类型,它和一块RawBuffer有关联。Surface操作这块Raw buffer。
  6. ViewRoot还有W类型的mWindow和一个View类型的mView变量,mWindow将参与binder进行进程间通信,mView指向PhoneWindow的DecorView。
  7. ViewRoot通过mWindow和远端进程SystemServer的WMS有交互,当WMS所在的SystemServer进程接收到按键事件后,会把它交给这个IWindow对象
  8. 整个Activity的绘图流程就是从mSurface中lock一块Canvas,ViewRoot和它所控制的View及其子View公用同一块canvas。Canvas有一个bitmap,那么绘制UI时,数据就画在Canvas的这个bitmap中。
  9. 绘图完成后,客户端经由SharedBufferClient将数据提交到SurfaceFlinger。SurfaceFlinger在收到 VSync 信号时将FrameBuffer中的内容渲染上屏。
相关推荐
恋猫de小郭4 小时前
Fluter 共享内存多线程正在落地,IsolateGroupBound 来了
android·前端·flutter
三少爷的鞋5 小时前
Kotlin 协程的七重境界:从 launch(IO) 到执行模型设计
android
-SOLO-15 小时前
Android Event 日志完全指南
android
壮哥_icon16 小时前
【Android 系统开发】从掉帧卡顿到丝滑:高频硬件中断(IRQ)的 CPU 亲和性性能优化实战
android·性能优化
千里马学框架16 小时前
Android Framework 新手学习踩坑建议指南
android·智能手机·性能优化·framework·aaos·车载开发·系统工程师
我命由我1234518 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
狂奔solar19 小时前
ARMA 模型:从白噪声到万能逼近器
android
渣渣灰飞19 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第二章:RBAC 权限系统设计
android·学习·mysql
qq_4228286219 小时前
android 图形学之图层数据送显及合成图层(七)
android
MiyamuraMiyako21 小时前
Compose:从自动滚动到双锚点 LazyLayout
android·android jetpack