Android图形系统篇总结

18字数 716阅读 1584
学习计划

陆陆续续已经写了好多了,这个计划图之后再调整吧。

Android图形系统学习框架:
Android图形系统(一)-Window加载视图过程
Android图形系统(二)-DecorView布局加载流程
Android图形系统(三)-View绘制流程
Android图形系统(四)-Activity、Window、View关系总结
Android图形系统(五)-Surface图形系统概览
Android图形系统(六)-app与SurfaceFlinger服务连接过程
Android图形系统(七)-app请求SurfaceFlinger创建Surface过程
Android图形系统(八)-app与SurfaceFlinger共享UI元数据过程
Android图形系统(九)-View、Canvas与Surface的关系
Android图形系统(十)-SurfaceFlinger启动及图层合成送显过程
Android图形系统(十一)-Choreographer
Android图形系统(十二)-流畅度概念

简单总结下Activity启动后布局显示过程:

  1. SurfaceFlinger 是在init.rc解析的时候被创建的,执行其main方法,实例化了Surfaceflinger,并向ServiceManager注册,SurfaceFlinger运行在单独进程中。

  2. 在 Activity 创建过程中执行 scheduleLaunchActivity() 之后便调用到了 handleLaunchActivity() 方法。首先通过Instrumentation创建Activity,然后执行Activity的attach()方法,创建 PhoneWindow,且与activity建立回调关联。获取WindowManager,层层代理最终干活的是WindowManagerGlobal。

  3. setContentView过程,创建DecorView,并把xml的View树解析出来,加到DecorView上的contentParent部分。

  4. Activity 调用makeVisible ,实际上是WindowManagerGlobal执行addView操作,然后调用ViewRootImpl setView操作。

  5. ViewRootImpl setView 做了两件事: 1) requestLayout触发绘制流程 2)mWindowSession.addToDisplay 通过IPC 执行WMS.addWindow

  6. requestLayout :中的relayoutWindow过程中app请求SurfaceFlinger创建Surface

  7. mWindowSession.addToDisplay:最终执行WMS.addWindow方法,该方法流程最终建立了app与SurfaceFlinger服务连接。

  8. Android应用程序与SurfaceFlinger服务是运行在不同的进程中的,用Binder进行通信,用匿名共享内存进行UI数据传递。

  9. requestLayout draw的流程中:Surface通过dequeueBuffer获取一块GraphicBuffer, 然后onDraw中通过传入的Java层Canvas 调用底层Skia引擎中的SKCanvas(画家)、SKBitmap(画布)进行具体绘制操作,绘制完成之后把图形数据放入GraphicBuffer,最后Surface执行queueBuffer,把这块带有图形数据的buffer送回BufferQueue,并通过onFrameAvailable通知Layer更新。

  10. SurfaceFlinger合成图层依赖于Android的异步消息处理机制,每16ms接收一次vsync信号来执行图层合成操作,最终通过handleMessageRefresh一系列方法的处理,其中包括把GraphicBuffer数据映射为OpenGL的texture ,收集所有Layer计算显示区域,然后通过openG 或 HWC进行合成以及栅格化处理,最后送显。

另外,这个过程了解了,那么Systrace也就会看了。

推荐阅读更多精彩内容