SurfaceFlinger SurfaceContol(一) SurfaceComposerClient
1. handleResumeActivity
App onReusme的时候会走到ActivityThread.java的handleResumeActivity,我们从这里入手,之前App从冷启动到onResume是怎么样一个流程,这里不做介绍,有机会后面写一篇。
public void handleResumeActivity(ActivityClientRecord r, boolean finalStateRequest,boolean isForward, String reason) {...// r.activity.getWindow() 是在ActivityThread.java的performLaunchActivity方法中,// 调用Activity的attach方法,在attach()中new PhoneWindow。r.window = r.activity.getWindow();// r.window.getDecorView()是Activity的onCreate方法中,调用setContentView(很熟悉吧),// 在Activity有调用了PhoneWindow的setContentView,最后在PhoneWindow的installDecor中创建的DockerView。View decor = r.window.getDecorView();decor.setVisibility(View.INVISIBLE);// wm 经过一系列的调用,最后得到一个WindowManagerImpl对象ViewManager wm = a.getWindowManager();...a.mWindowAdded = true;// 调用到WindowManagerGlobal.java的addViewwm.addView(decor, l);
WindowManagerGlobal.java
public void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow, int userId) {...root = new ViewRootImpl(view.getContext(), display);view.setLayoutParams(wparams);mViews.add(view);mRoots.add(root);mParams.add(wparams);...root.setView(view, wparams, panelParentView, userId);}
ViewRootImpl.java
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView,int userId) {...requestLayout();...// mWindowSessions是ViewRootImpl构造的时候创建的。用于和WMS通信// mWindow是ViewRootImpl内部类W 类型对象,也是在构造的时候创建。// W类型继承IWindow.Stub,看了也是用于和WMS做进程间通信用。// 在调用这个函数之后,就跨到system server进程了。res = mWindowSession.addToDisplayAsUser(mWindow, mWindowAttributes,getHostVisibility(), mDisplay.getDisplayId(), userId,mInsetsController.getRequestedVisibilities(), inputChannel, mTempInsets,mTempControls); }
2. WMS addWindow
在Session.java的addToDisplayAsUser会调用WindowManagerService.java的addWindow函数:
public int addWindow(Session session, IWindow client, LayoutParams attrs, int viewVisibility,int displayId, int requestUserId, InsetsVisibilities requestedVisibilities,InputChannel outInputChannel, InsetsState outInsetsState,InsetsSourceControl[] outActiveControls) {...// 创建windowStatefinal WindowState win = new WindowState(this, session, client, token, parentWindow,appOp[0], attrs, viewVisibility, session.mUid, userId,session.mCanAddInternalSystemWindow);...win.attach();
WindowState.java的attach会调用到Session.java的windowAddedLocked,这里会mSurfaceSession = new SurfaceSession(); SurfaceSession的构造方法会调用natve的构造。
android_view_SurfaceSession.cpp
static jlong nativeCreate(JNIEnv* env, jclass clazz) {SurfaceComposerClient* client = new SurfaceComposerClient();client->incStrong((void*)nativeCreate);return reinterpret_cast<jlong>(client);
}
SurfaceComposerClient.cpp
SurfaceComposerClient::SurfaceComposerClient() : mStatus(NO_INIT) {}void SurfaceComposerClient::onFirstRef() {sp<ISurfaceComposer> sf(ComposerService::getComposerService());if (sf != nullptr && mStatus == NO_INIT) {sp<ISurfaceComposerClient> conn;// 终于看到和surfaceflinger的跨进程通信了conn = sf->createConnection();if (conn != nullptr) {mClient = conn;mStatus = NO_ERROR;}}
}
3. SurfaceFlinger
SurfaceFlinger Client的构造和initCheck没干任何事情,看来到这里为止,使app - system server(wms) - surfaceFlinger建立联系后,
// 这部分的流程就结束了。
sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {const sp<Client> client = new Client(this);return client->initCheck() == NO_ERROR ? client : nullptr;
}
总结
SurfaceComposerClient的作用通过上面分析,就是为了完成和SurfaceFlinger的通信链路。
那么app和sf怎么来识别对方呢,毕竟app有很多个。
在1章节中,ViewRootImpl调用addToDisplayAsUser时,将session和W类型的window对象都传递下去了。
在2章节中,创建WindowState时,也将session和W类型的window对象都传递给了WindowState。
WindowState的attach中,会调用session接口,最后使得session中的mSurfaceSession的mNativeClient指向native的SurfaceComposerClient,从而完成app与sf的链接。