还是首先来看一个序列图:
1.ViewRootImpl.mSurface
ViewRootImpl这个类是是处理视图绘画,input输入,调用wms调用窗口的核心类。其成员变量mSurface在申明的时候就初始化了:
final Surface mSurface = new Surface();
上面干巴巴的创建了Surface实例,进去看Surface这个类的无参构造函数也是个空的,所以还要继续往下分析
2.SurfaceSession的创建
在wms窗口管理过程中,视图的添加过程
ViewRootImpl.setView-> session.addToDisplay->WMS.addWindow
在WMS中添加窗口WindowState完成后,会调用WindowState类的attach函数
void attach() {
if (localLOGV) Slog.v(TAG, "Attaching " + this + " token=" + mToken);
mSession.windowAddedLocked(mAttrs.packageName);
}
void windowAddedLocked(String packageName) {
mPackageName = packageName;
mRelayoutTag = "relayoutWindow: " + mPackageName;
if (mSurfaceSession == null) {
if (WindowManagerService.localLOGV) Slog.v(
TAG_WM, "First window added to " + this + ", creating SurfaceSession");
mSurfaceSession = new SurfaceSession();
if (SHOW_TRANSACTIONS) Slog.i(
TAG_WM, " NEW SURFACE SESSION " + mSurfaceSession);
mService.mSessions.add(this);
if (mLastReportedAnimatorScale != mService.getCurrentAnimatorScale()) {
mService.dispatchNewAnimatorScaleLocked(this);
}
}
mNumWindow++;
}
上面就可以看到session的成员变量mSurfaceSession的赋值操作,这里通过
new SurfaceSession()创建了一个实例,下面我们看看SurfaceSession的构造函数。
3.SurfaceSession
private long mNativeClient; // SurfaceComposerClient*
public SurfaceSession() {
mNativeClient = nativeCreate();
}
public SurfaceSession(Surface root) {
mNativeClient = nativeCreateScoped(root.mNativeObject);
}
这里就是获取SurfaceComposerClient的指针地址,而其实现方式是通过JNI来的,这里我们来看看其JNI的实现
4android_view_SurfaceSession.nativeCreate
static jlong nativeCreate(JNIEnv* env, jclass clazz) {
SurfaceComposerClient* client = new SurfaceComposerClient();
client->incStrong((void*)nativeCreate);
return reinterpret_cast<jlong>(client);
}
上面的代码就是new了一个SurfaceComposerClient对象,然后返回了这个对象的地址,也就是我们实际得到的是SurfaceComposerClient实例
5.SurfaceComposerClient
SurfaceComposerClient::SurfaceComposerClient()
: mStatus(NO_INIT), mComposer(Composer::getInstance())
{
}
SurfaceComposerClient::SurfaceComposerClient(const sp<IGraphicBufferProducer>& root)
: mStatus(NO_INIT), mComposer(Composer::getInstance()), mParent(root)
{
}
void SurfaceComposerClient::onFirstRef() {
sp<ISurfaceComposer> sm(ComposerService::getComposerService());
if (sm != 0) {
auto rootProducer = mParent.promote();
sp<ISurfaceComposerClient> conn;
conn = (rootProducer != nullptr) ? sm->createScopedConnection(rootProducer) :
sm->createConnection();
if (conn != 0) {
mClient = conn;
mStatus = NO_ERROR;
}
}
}
void ComposerService::connectLocked() {
const String16 name("SurfaceFlinger");
while (getService(name, &mComposerService) != NO_ERROR) {
usleep(250000);
}
assert(mComposerService != NULL);
// Create the death listener.
class DeathObserver : public IBinder::DeathRecipient {
ComposerService& mComposerService;
virtual void binderDied(const wp<IBinder>& who) {
ALOGW("ComposerService remote (surfaceflinger) died [%p]",
who.unsafe_get());
mComposerService.composerServiceDied();
}
public:
explicit DeathObserver(ComposerService& mgr) : mComposerService(mgr) {
}
};
mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this));
IInterface::asBinder(mComposerService)->linkToDeath(mDeathObserver);
}
1.在onFirstRef函数里面会获取fingerprint的服务,看connectLocked实现就可以确定,通过getservice这个API获取指定的SurfaceFlinger服务实例,这样一来client就和surfaceflinger建立了联系。
2.当获取了Surfaceflinger实例后,调用createScopedConnection来创建client
6.createScopedConnection
sp<ISurfaceComposerClient