文章目录
上一篇《SurfaceFlinger学习之路 (一) 》 介绍了View的绘制流程,最后讲到了WMS与SurfaceSession、Surface之间关系。
SurfaceComposeClient
上一层说到,Surface在ViewRootImpl被new出了一个空壳:
// ViewRootImpl.java
Surface mSurface = new Surface()
我们在创建window都调用了WMS.addWindow()
// WindowManagerService.java
public int addWindow(...) {
final WindowState win = new WindowState(...)
win.attach();
mWindowMap.put(client.asBinder(), win);
}
在WMS中,每一个Window都会对应一个WindowState,表示具体窗口信息,而mWindowMap保存着WindowState。
最后,调用了WindowState的attach()
// WindowState.java
void attach() {
mSession.windowAddedLocked(mAttrs.packageName);
}
// Session.java
void windowAddedLocked(String packageName) {
if (mSurfaceSession == null) {
mSurfaceSession = new SurfaceSession();
mService.mSessions.add(this);
}
mNumWindow++;
}
Session中创建了SurfaceSession,Session通过SurfaceSession可以跟SurfaceFlinger通信,SurfaceSession只是在java层的代表,类似于Session和WMS的关系。
其实SurfaceSession是个壳,内部持有者一个native对象,就是SurfaceComposerClient,他是由SurfaceFlinger创建的,
// SurfaceSession.java
private static native long nativeCreate();
private long mNativeClient; // SurfaceComposerClient*
public SurfaceSession() {
mNativeClient = nativeCreate();
}
nativeCreate是个native方法,我们得到android_view_SurfaceSession.cpp继续追
// android_view_SurfaceSession.cpp
static jlong nativeCreate(JNIEnv* env, jclass clazz) {
SurfaceComposerClient* client = new SurfaceComposerClient();
client->incStrong((void*)nativeCreate);
return reinterpret_cast<jlong>(client);
}
nativeCreate创建了一个SurfaceComposerClient对象
// android_view_SurfaceSession.cpp
void SurfaceComposerClient::onFirstRef() {
sp<ISurfaceComposer> sf(ComposerService::getComposerService());
if (sf != 0 && mStatus == NO_INIT) {
auto rootProducer = mParent.promote();
sp<ISurfaceComposerClient> conn;
conn = (rootProducer != nullptr) ? sf->createScopedConnection(rootProducer) :