设为首页 加入收藏

TOP

「Android」 Surface分析(一)
2019-09-01 23:27:34 】 浏览:256
Tags:Android Surface分析

 本篇针对Surface模块进行分析,从Java层的Activity创建开始,到ViewRoot、WindowsManagerService,再到JNI层和Native层。

首先推荐一个Android源码查看的网站:http://androidxref.com/

Surface的创建涉及三个部分:

  1. App 进程
    App需要将自己的内容显示在屏幕上,所以App负责发起Surface创建请求,创建好Surface后, 就可以直接可以在canvas上画图等,最终都会保存到Surface里的buffer里,最后由SurfaceFlinger合成并显示。

  2. System_Server进程
    主要是其中的WindowManagerService, 负责接收APP请求,向SurfaceFlinger发起具体的请求创建Surface, 且WMS需要创建Surface的辅助管理类,如SurfaceControl。

  3. 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
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/9/9
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android--解决图片保存到相册显示.. 下一篇Kotlin入门(32)网络接口访问

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目