本篇针对Surface模块进行分析,从Java层的Activity创建开始,到ViewRoot、WindowsManagerService,再到JNI层和Native层。
首先推荐一个Android源码查看的网站:http://androidxref.com/
Surface的创建涉及三个部分:
-
App 进程
App需要将自己的内容显示在屏幕上,所以App负责发起Surface创建请求,创建好Surface后, 就可以直接可以在canvas上画图等,最终都会保存到Surface里的buffer里,最后由SurfaceFlinger合成并显示。 -
System_Server进程
主要是其中的WindowManagerService, 负责接收APP请求,向SurfaceFlinger发起具体的请求创建Surface, 且WMS需要创建Surface的辅助管理类,如SurfaceControl。 -
SurfaceFlinger
为App进程创建具体的Surface, 在SurfaceFlinger里对应成Layer, 然后负责管理、合成显示。
总体流程(参考《深入理解Android》,源码较旧):
Surface创建过程: ActivityThread.java 调用handleLaunchActivity 调用handleResumeActivity函数 addView调用到LocalWindowManager.java的addView函数 然后调用WindowManagerImpl.java的addView函数 创建ViewRoot(分成两个分支): 1、执行ViewRoot的构造函数,创建mSurface(!实现ViewRoot的Surface创建)(创建IWindow) 2、调用ViewRoot的setView函数(分成两个分支): 1、setView调用WMS的add函数(IWindowSession) 调用WMS的addWindow函数 调用WMS.java::WindowState的attach函数 调用WMS.java::Session的windowAddedLocked函数,创建SurfaceSession(!实现WMS的SurfaceSession创建) 执行SurfaceSession的构造器,调用native函数init JNI层实现init函数,创建一个SurfaceComposerClient(分成两步): 1、SurfaceComposerClient构造函数调用SurfaceFlinger的createConnection(!和SF建立交互通道) 创建Client(创建共享内存)(一个Client最多支持31个显示层) Client构造函数创建SharedClient对象 SharedClient定义SharedBufferStack数组对象(有31个元素) 创建BClient(接受客户端请求,将处理提交给SF) 2、再调用_init(初始化SurfaceComposerClient一些成员变量) 2、调用requestLayout函数,向ViewRoot发送DO_TRAVERSAL消息 调用handleMessage函数 调用performTraversal函数(分成两个分支): 1、调用ViewRoot的relayoutWindow函数(调用IWindowSession的relayout函数) 调用createSurfaceControl创建一个SurfaceControl ?在SurfaceComposerClient的createSurface创建一个SurfaceControl(请求端) ?SurfaceComposerClient调用createSurface创建一个Surface(SurfaceControl类型) ? 调用SurfaceControl的writeToParcel将信息写入Parcel包中 ? 在readFromParcel中通过Parcel信息构造一个Surface对象,保存到mSurface ? ViewRoot获得一个Native的Surface对象 调用WMS.java::Session的relayout函数(!此和上这两步跨进程)(分成三步): 1、在IWindowSession.adil的Bn端调用onTransact,writeToParcel写入信息 2、在IWindowSession.adil的Bp端,relayout中传入outSurface,readFormParcel读取信息填充outSurface 3、调用WMS的relayoutWindow 》》调用WMS.java::WindowState的createSurfaceLocked,创建本地Surface(SurfaceSession) 》》调用copyForm,将本地surface信息拷贝到outSurface(即mSurface) 2、调用draw()函数开始绘制(lockCanvas、调用draw、unlockCanvasAndPost) 调用DecorView的draw函数(!实现UI绘制)
概述
Surface和APP的关系:
Surface像是UI的画布,APP就像是在Surface上作画,通过i使用Skia绘制二维图像,或是用OpenGL绘制三维图像,最终APP和Surfacea都要进行交互。
SUrface和SurfaceFlinger(SF)的关系:
surface向SF提供数据,SF进行混合数据。
Activity的显示(Java层)
1、应用程序的显示和surface有关,而应用程序的外表通过Activity展示的,那么Activity如何创建的呢?
App对应的进程,它的入口函数是ActivityThread类的main函数。
ActivityThread类中有一个handleLaunchActivity函数(创建Activity),代码如下:
private void handleLaunchActivity(ActivityClientRecord r , Intent customIntent , String reason) { ... Activity a = performLaunchActivity(r, customIntent); ... if (a != null) { ... handleResumeActivity(r.token , false , r.isForward ,!r.activity.mFinished && !r.startsNotResumed , r.lastProcessedSeq, reason); //Activity创建成功就往onResume()走了! ... } }
这个函数涉及了两个关键函数:
(1)performLaunchActivity
返回一个activity(即App中的Activity),该方法 创建了Activity:
private Activity performLaunchActivity(ActivityClientRecord r