专栏首页Android相关Android绘制系统简介

Android绘制系统简介

绘制简介

Android中使用OpenGL以及 Skia Vulkan来进行跨平台的绘制. 通过客户端进程、SystemServer、SurfaceFlinger三个进程的配合来完成Android系统上的绘制工作.

流程简介

阶段1 - 系统初始化

完成显示相关的设备驱动的初始化 :

  • 在系统启动的时候 ,init.rc中会启动SystemServer
  • system_server进程中初始化WindowManagerService, 以及启动SurfaceFlinger进程 ,
  • SurfaceFlinger中初始化Gralloc以及FrameBuffer设备驱动
阶段2 - 建立连接

在窗口(如ActivityDialogPopupWindow、悬浮窗等)需要被显示到屏幕上时 :

  • 在本进程创建一个PhoneWindow , 并且创建空的Surface(后面会将Surface进行填充)
  • 通过Session通知WindowManagerService创建WindowState代表窗口
  • 按排序将WindowState窗口添加到列表中
  • 建立起WindowManagerServiceSurfaceFlinger之间的桥梁SurfaceComposerClient.
阶段3 - 填充Surface

在进程收到Vsync信号之后 :

  • 窗口端向WindowManagerService申请填充Surface
  • WindowManagerService会向SurfaceFlinger创建Layer(其中包括BufferQueueIGraphicBufferConsumerIGraphicBufferProducer)以及对应的内存空间
  • Layer添加到Z-Order排序的列表中
  • 将该内存空间的信息、Layer信息返回给WindowManagerService
  • WindowManagerService将该信息返回给窗口端的Surface
阶段4 - 开始绘制

Surface填充完后 , 开始绘制工作 :

  • 通过performTravels开始在Surface上进行绘制
  • 当调用lockCanvas来通过IGraphicBufferProducer.dequeueBuffer来申请用来绘制的GraphicBuffer ,
  • 通过unlockAndPostCanvas调用IGraphicBufferProducer.queueBuffer来向SurfaceFlinger的消费者发送Buffer
阶段5 - 显示屏显示

在SurfaceFlinger端 :

  • 接收到生产者发送的Buffer后 , 会调用FrameBuffer驱动的方法
  • 将生产者传输的Buffer通过fb_memset将内存复制到驱动空间
  • 通过电子枪逐行扫描像素进行显示

关系图

image.png

核心类介绍

绘制相关的核心类主要包括三个进程中的类 .

应用进程

ActivityThread : 通过ApplicationThread接收AMS的消息 , 回调Activity生命周期 ViewRootImpl : 管理IWindowSession以及RootView IWindowSession : 负责与WMS通信 , 并且通过AIDL填充Surface PhoneWindow : 负责Activity的DecorView的inflate操作

SystemServer进程

WindowManagerService : 负责将Activity与Window进行绑定 , 管理所有窗口 WindowState : 每一个WindowState代表一个客户端窗口 , 并且保存与客户端窗口通信的IBinder Session : 用于保持与客户端的IBinder连接 SurfaceSession : SurfaceComposerClient的Java层代理 SurfaceComposerClient : SurfaceFlinger与Client在WMS中的代理 ComposerService : SurfaceFlinger在ServiceManager中注册的Service WindowStateAnimator : 负责Window的动画 IGraphicBufferProducer : SurfaceFlinger中BufferQueueProducer的代理对象

SurfaceFlinger进程

SurfaceFlinger : 负责与WMS进行 Client : 每个窗口都会对应一个Client Layer : 每一个窗口对应的Layer BufferQueue : 绘制缓冲队列 , 向每个Surface提供绘制的Buffer BufferQueueProducer : 绘制缓冲队列的生产者 , SurfaceFlinger提供给客户进程 BufferQueueConsumer: 绘制缓冲队列的消费者 , 用于接收客户端发送的Buffer

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux编程--地址计算

    在学习Matrix的ELF Hook的过程中,发现在查找Library基址指针的时候,对于指针的运算有一些疑惑,特此记录。

    None_Ling
  • IjkPlayer起播速度优化

    None_Ling
  • Gradle For Android(9)--自定义构建

    现在我们知道了Gradle如何工作,如何创建自己的Task以及Plugin,如何执行test任务,如何设置CI。这一章会包含一些小技巧,接下来会从以下Topic...

    None_Ling
  • 移动设备网页打电话、发短信、发邮件的html5链接实现方法

    在移动浏览器中实现拨打电话,调用sms发短信,发送email等功能,移动手机WEB页面(HTML5)协议提供的接口是一个好办法。采用url href链接的方式,...

    疯狂的技术宅
  • 面对20亿行代码,Google如何管理?

    大数据文摘
  • 以太坊客户端介绍

    首先我们要弄清楚,Geth,Mist,Ethereum Wallet这几个客户端的区别

    JouyPub
  • 实战 | F1060路由模式典型组网配置案例(RIP)

    本案例采用H3C HCL模拟器的F1060防火墙来模拟防火墙路由模式的典型部署。为了实现PC之间能够相互通信,因此需要分别在R1、R2、FW1采用三层互联,同时...

    网络技术联盟站
  • Swift2.0后Alamofire的使用方法

    Bison
  • Safari浏览器要屏蔽Google Analytics?

    苹果在WWDC上介绍了macOS 11 "Big Sur",其中之一就是Safari的新隐私功能,演示的新闻稿的屏幕截图显示Safari浏览器现在完全阻止了包含...

    GA小站
  • 实战 | F1060路由模式典型组网配置案例(静态路由)

    本案例采用H3C HCL模拟器的F1060防火墙来模拟防火墙路由模式的典型部署。为了实现PC之间能够相互通信,因此需要分别在R1、R2、FW1采用三层互联,同时...

    网络技术联盟站

扫码关注云+社区

领取腾讯云代金券