学习计划
Android 图形系统学习框架:
Android 图形系统 (一)-Windows 加载视图过程
Android 图形系统 (二)-DecorView 布局加载流程
Android 图形系统 (三)-View 绘制流程
Android 图形系统 (四)-Activity,Windows,View 关系总结
Android 图形系统 (五)-Surface 图形系统概览
Android 图形系统 (六)-App 与 SurfaceFlinger 服务连接过程
Android 图形系统 (七)-App 请求 SurfaceFlinger 创建 Surface 过程
Android 图形系统 (八)-App 与 SurfaceFlinger 共享 UI 元数据过程
Android 图形系统 (九)-View,Canvas 与 Surface 的关系
Android 图形系统 (十)-SurfaceFlinger 启动及图层合成送显过程
简单总结下 Activity 启动后布局显示过程:
SurfaceFlinger 是在 init.rc 解析的时候被创建的, 执行其 main 方法, 实例化了 Surfaceflinger, 并向 ServiceManager 注册, SurfaceFlinger 运行在单独进程中.
在 Activity 创建过程中执行 scheduleLaunchActivity() 之后便调用到了 handleLaunchActivity() 方法. 首先通过 Instrumentation 创建 Activity, 然后执行 Activity 的 attach() 方法, 创建 PhoneWindow, 且与 activity 建立回调关联. 获取 WindowManager, 层层代理最终干活的是 WindowManagerGlobal.
setContentView 过程, 创建 DecorView, 并把 xml 的 View 树解析出来, 加到 DecorView 上的 contentParent 部分.
Activity 调用 makeVisible , 实际上是 WindowManagerGlobal 执行 addView 操作, 然后调用 ViewRootImpl setView 操作.
ViewRootImpl setView 做了两件事: 1) requestLayout 触发绘制流程 2)mWindowSession.addToDisplay 通过 IPC 执行 WMS.addWindow
requestLayout : 中的 relayoutWindow 过程中 App 请求 SurfaceFlinger 创建 Surface
mWindowSession.addToDisplay: 最终执行 WMS.addWindow 方法, 该方法流程最终建立了 App 与 SurfaceFlinger 服务连接.
Android 应用程序与 SurfaceFlinger 服务是运行在不同的进程中的, 用 Binder 进行通信, 用匿名共享内存进行 UI 数据传递.
requestLayout draw 的流程中: Surface 通过 dequeueBuffer 获取一块 GraphicBuffer, 然后 onDraw 中通过传入的 Java 层 Canvas 调用底层 Skia 引擎中的 SKCanvas(画家),SKBitmap(画布) 进行具体绘制操作, 绘制完成之后把图形数据放入 GraphicBuffer, 最后 Surface 执行 queueBuffer, 把这块带有图形数据的 buffer 送回 BufferQueue, 并通过 onFrameAvailable 通知 Layer 更新.
SurfaceFlinger 合成图层依赖于 Android 的异步消息处理机制, 每 16ms 接收一次 vsync 信号来执行图层合成操作, 最终通过 handleMessageRefresh 一系列方法的处理, 其中包括把 GraphicBuffer 数据映射为 OpenGL 的 texture , 收集所有 Layer 计算显示区域, 然后通过 openG 或 HWC 进行合成以及栅格化处理, 最后送显.
另外, 这个过程了解了, 那么 Systrace 也就会看了.
来源: http://www.jianshu.com/p/180e1b6d0dcd