编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 02.Android虚拟机知识
  • 03.App核心概念分析
  • 04.Android消息机制
  • 05.Android程序UI框架
  • 06.Android应用窗口
  • 07.WMS机制深入分析
  • 08.PMS机制深入分析
  • 09.AMS机制深入分析
  • 11.四大组件原理分析
  • 12.四大组件原理分析
  • 13.View绘制流程分析
  • 14.View渲染流程分析
  • 16.Android绘制原理
  • 17.Android事件传输
  • 18.Android事件拦截
  • 21.View自定义控件反思
  • 22.ViewGroup自定义控件
  • 25.IPC跨进程通信实践
  • 29.Binder机制的理解

05.Android程序UI框架

目录介绍

  • 01.应用程序UI架构
    • 1.1 程序UI框架介绍
    • 1.2 程序UI总体框架
  • 02.窗口(Window)的结构
    • 2.1 Window结构介绍
    • 2.2 Activity与上下文
    • 2.3 Window虚拟根View
    • 2.4 窗口绘图表面
    • 2.5 窗口会话Session
  • 03.UI的绘制过程
    • 3.1 UI的绘制流程
    • 3.2 软件渲染过程
    • 3.3 硬件渲染过程
  • 04.UI的绘制时机
    • 4.1 UI的绘制时机
    • 4.2 系统的VSync实现

01.应用程序UI架构

1.1 程序UI框架介绍

  • Android系统采用一种称为Surface的UI架构为应用程序提供用户界面。
    • 在Android应用程序中,每一个Activity组件都关联有一个或者若干个窗口,每一个窗口都对应有一个Surface。有了这个Surface之后,应用程序就可以在上面渲染窗口的UI。
    • 最终这些已经绘制好了的Surface都会被统一提交给Surface管理服务SurfaceFlinger进行合成,最后显示在屏幕上面。
  • WindowManagerService服务
    • 在Android应用程序UI架构中,还有一个重要的服务WindowManagerService,它负责统一管理协调系统中的所有窗口,例如管理窗口的大小、位置、打开和关闭等。

1.2 程序UI总体框架

  • 程序UI总体框架如下所示
    • image
      image

02.窗口(Window)的结构

2.1 Window结构介绍

  • Window结构如下所示
    • ViewRootImpl是一个虚拟根View,用来控制窗口的渲染,以及用来与WindowManagerService、SurfaceFlinger通信
    • DecorView是窗口的真正根View
    • ContentView描述窗口的主题风格
    • image
      image

2.2 Activity与上下文

  • Activity/Window的上下文
    • image
      image

2.3 Window虚拟根View

  • Window的虚拟根View -- ViewRootImpl
    • ViewRootImpl是在WindowManagerGlobal.addView()时创建的
    • image
      image

2.4 窗口绘图表面

  • 窗口绘图表面 -- Surface
    • image
      image

2.5 窗口会话Session

  • 窗口会话Session
    • image
      image

03.UI的绘制过程

3.1 UI的绘制流程

  • UI绘制流程
    • image
      image

3.2 软件渲染过程

  • 软件渲染过程
    • image
      image

3.3 硬件渲染过程

  • 硬件渲染过程
    • image
      image

04.UI的绘制时机

4.1 UI的绘制时机

  • Android应用程序UI的绘制时机 – Without Vsync -- Jank
    • image
      image
  • Android应用程序UI的绘制时机 – With VSync
    • image
      image
  • Android应用程序UI的绘制时机 – With Vsync and Double Buffering
    • image
      image
  • Android应用程序UI的绘制时机 – With Vsync and Triple Buffering
    • image
      image

4.2 系统的VSync实现

  • SurfaceFlinger内部维护有一个EventThread,用来监控显卡的VSync事件
  • Android应用程序通过注册一个DisplayEventReceiver来接收SurfaceFlinger的VSync事件
  • Android应用程序接收到重绘UI请求,通过前面注册的DisplayEventReceiver向SurfaceFlinger请求在下一个VSync事件到来时产生一个VSync通知
  • Android应用程序获得VSync通知的时候,才会真正执行重绘UI的请求
贡献者: yangchong211
上一篇
04.Android消息机制
下一篇
06.Android应用窗口