Android应用与SurfaceFlinger建立连接及通信的过程

Android应用与SurfaceFlinger建立连接及通信的过程
主要用到的文件
/frameworks/base/core/java/android/view/DisplayEventReceiver.java
/frameworks/base/core/jni/android_view_DisplayEventReceiver.cpp
/frameworks/native/libs/gui/DisplayEventReceiver.cpp
/frameworks/base/libs/androidfw/DisplayEventDispatcher.cpp
/frameworks/base/core/java/android/view/Choreographer.java
/frameworks/base/native/android/choreographer.cpp
/frameworks/native/services/surfaceflinger/EventThread.cpp
/frameworks/base/services/core/java/com/android/server/wm/Session.java
/frameworks/base/core/java/android/view/SurfaceSession.java
/frameworks/base/core/jni/android_view_SurfaceSession.cpp
/frameworks/native/libs/gui/ISurfaceComposer.cpp

一.Android应用与SurfaceFlinger建立连接过程


ActivityThread.handleResumeActivity(IBinder, boolean, boolean, String)
-->WindowManagerImpl.addView(View, LayoutParams) (android.view)
-->WindowManagerGlobal.addView(View, LayoutParams, Display, Window)
-->ViewRootImpl.ViewRootImpl(Context, Display) (android.view) 
-->ViewRootImpl.ViewRootImpl(..) 构造函数初始化 mChoreographer = Choreographer.getInstance();
-->Choreographer.Choreographer(Looper looper, int vsyncSource) 构造函数 执行两步,其中vsyncSource为 VSYNC_SOURCE_APP。
第一步.调用  mDisplayEventReceiver = new FrameDisplayEventReceiver(looper, vsyncSource) 创建FrameDisplayEventReceiver(继承DisplayEventReceiver),用于接收SurfaceFlinger发给应用的Vsync信号。
DisplayEventReceiver.DisplayEventReceiver(Looper looper, int vsyncSource) 构造函数 调用mReceiverPtr = nativeInit(.) Native层的DisplayEventReceiver初始化。
android_view_DisplayEventReceiver.nativeInit(.) 调用receiver = new NativeDisplayEventReceiver(...)  创建NativeDisplayEventReceiver,与SurfaceFlinger建立连接,获取显示事件socket接收端,
然后调用 receiver->initialize() 监听显示事件socket接收端。
NativeDisplayEventReceiver.NativeDisplayEventReceiver 构造方法 创建DisplayEventDispatcher 实例。
DisplayEventDispatcher::DisplayEventDispatcher 构造方法 初始化成员子对象,mReceiver(vsyncSource) mReceiver为DisplayEventReceiver对象。
DisplayEventReceiver::DisplayEventReceiver(ISurfaceComposer::VsyncSource vsyncSource) 流程也分为2步:
1.调用 mEventConnection = sf->createDisplayEventConnection(vsyncSource) 为客户端创建显示事件连接mEventConnection 为aidl 返回的接口类,通过该连接可以请求SurfaceFlinger发送Vsync以及接收SurfaceFlinger发送的显示事件。
BpSurfaceComposer.createDisplayEventConnection 这里 通过aidl跨进程调用服务端 SurfaceFlinger接口方法。
SurfaceFlinger::createDisplayEventConnection 
EventThread::createEventConnection()
EventThread::Connection::Connection 创建BitTube,BitTube的作用主要有 1.封装用于显示事件的socket通信 2.跨进程传递socket文件描述符。
2.调用 mEventConnection->stealReceiveChannel(mDataChannel.get())  通过Binder IPC获取对应的Connection的socket接收端给变量 mDataChannel (BitTube对象)。
EventThread::Connection::stealReceiveChannel(gui::BitTube* outChannel) 调用outChannel->setReceiveFd(mChannel.moveReceiveFd()) 设置socket接收端文件描述符,
mChannel.moveReceiveFd() 为上面创建BitTube.mReceiveFd 接收端的socket,

即可以通过 DisplayEventReceiver.mDataChannel.mReceiveFd 和 SurfaceFlinger socket通信

第二步.调用mCallbackQueues = new CallbackQueue[CALLBACK_LAST + 1] 创建CallbackQueue处理各种回调。

二.enableHardwareAcceleration及Android应用与SurfaceFlinger建立通信过程

ActivityThread.handleResumeActivity(IBinder, boolean, boolean, String) 调用 wm.addView(decor, l) 设置DecorView的LayoutParams,添加DecorView到Window。
WindowManagerImpl.addView(...) 调用mGlobal.addView(view, params, mContext.getDisplay(), mParentWindow)。
WindowManagerGlobal.addView(...)  创建ViewRootImpl对象root 流程见上面,然后调用root.setView(view, wparams, panelParentView)。
ViewRootImpl.setView(view, wparams, panelParentView) 分为三步
第一步 调用enableHardwareAcceleration(attrs) 使能硬件加速。
ViewRootImpl.enableHardwareAcceleration调用mAttachInfo.mThreadedRenderer = ThreadedRenderer.create(...)  创建ThreadedRenderer对象。
ThreadedRenderer.ThreadedRenderer(...) 构造方法通过jni调用 nCreateProxy(translucent, rootNodePtr) 创建native 的RenderProxy对象。
RenderProxy::RenderProxy(...) 构造方法 主要调用2步
1.创建启动RenderThread线程
RenderThread::threadLoop() 方法中 调用initThreadLocals() 与SurfaceFlinger建立连接,然后开启循环处理消息。
2.调用 mDrawFrameTask.setContext(&mRenderThread, mContext, rootRenderNode) 为 mDrawFrameTask,
设置 RenderThread到DrawFrameTask.mRenderThread,CanvasContext对象到DrawFrameTask.mContext.
第二步 调用requestLayout() 调度首次layout, 请求SurfaceFlinger发送Vsync
ViewRootImpl.requestLayout()  调用scheduleTraversals()
ViewRootImpl.scheduleTraversals() 中调用 mChoreographer.postCallback   添加CALLBACK_TRAVERSAL回调,当下一帧(Vsync)到来时执行绘制
Choreographer.postCallback 最后调用了postCallbackDelayedInternal
Choreographer.postCallbackDelayedInternal 调用2步
1.调用mCallbackQueues[callbackType].addCallbackLocked(dueTime, action, token) 添加到CALLBACK_TRAVERSAL类型的CallbackQueue中
2.调用scheduleFrameLocked(now) 请求Vsync信号 
Choreographer.scheduleFrameLocked 调用scheduleVsyncLocked() 立即请求Vsync
Choreographer.scheduleVsyncLocked()  调用mDisplayEventReceiver.scheduleVsync()  mDisplayEventReceiver为上面创建
DisplayEventDispatcher::scheduleVsync() 调用 mReceiver.requestNextVsync()
DisplayEventReceiver::requestNextVsync() 调用 mEventConnection->requestNextVsync() mEventConnection为aidl返回的接口,调用服务端对应方法。
EventThread::Connection::requestNextVsync() 调用 mEventThread->requestNextVsync(this) 
EventThread::requestNextVsync(const sp<EventThread::Connection>& connection)  处理客户端Vsync请求。
第三步 调用mWindowSession.addToDisplay(mWindow..)  窗口注册到WindowManagerService
Session.addToDisplay(mWindow..) 调用mService.addWindow(...)
WindowManagerService.addWindow(...) 主要流程有如下几步
1. 调用win = new WindowState 创建WindowState用于描述一个窗口。
2.调用mPolicy.adjustWindowParamsLw(win, win.mAttrs, hasStatusBarServicePermission)根据窗口类型调整布局参数。
3.调用 win.attach()  创建SurfaceSession,添加Session到WindowManagerService
WindowState.attach()  调用mSession.windowAddedLocked(mAttrs.packageName) 
Session.windowAddedLocked(String packageName)  该方法先调用 mSurfaceSession = new SurfaceSession() 创建SurfaceSession对象,SurfaceSession代表一个到SurfaceFlinger的连接;
然后调用mService.mSessions.add(this) 将Session添加到WindowManagerService的mSessions中,
SurfaceSession.SurfaceSession 调用 mNativeClient = nativeCreate() 通过jni调用
android_view_SurfaceSession.nativeCreate() 该方法调用 client = new SurfaceComposerClient() 创建SurfaceComposerClient(继承RefBase),会调用onFirstRef。
SurfaceComposerClient::onFirstRef()  先 调用 sf(ComposerService::getComposerService()) 调用ISurfaceComposer.cpp中的。
BpSurfaceComposer.createConnection() 通过aidl跨进程调用服务端
SurfaceFlinger::createConnection() 调用 initClient(new Client(this)),
Client为参与合成的客户端在SurfaceFlinger侧的代表,是一个Binder服务对象,通过Binder IPC传递后,在客户端得到BpSurfaceComposerClient对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值