下面对Surface与SurfaceControl类之间的关系进行一下分析。
在android_view_Surface.cpp中,可以看到这样一条语句:
SurfaceComposerClient* client =
(SurfaceComposerClient*)env->GetIntField(session, sso.client);
sp<SurfaceControl> surface(client->createSurface(pid, dpy, w, h, format, flags));
从字面意思猜测,由SurfaceComposerClient的一个对象创建了一个Surface交由SurfaceControl进行管理。
从一些参考资料中看到,创建一个Surface的过程如下
(1) 调用libui的接口SurfaceComposerClient::CreateSurface();
(2) 调用ISurfaceFlingerClient::CreateSurface();
(3) 由于继承关系,实际上调用的是SurfaceFlinger中的接口,即BClient::CreateSurface()
(4) 继续调用SurfaceFlinger::createSurface()
我们分析下代码,看看过程是不是这样的。
跟踪到SurfaceComposerClient::createSurface中,看到这样一条语句
sp<ISurface> surface = mClient->createSurface(&data, pid,
display, w, h, format, flags);
其中mClient是在SurfaceComposerClient中定义的一个sp<ISurfaceFlingerClient>类型的对象(还记得sp对->进行了重载吗?它其实返回了一个ISurfaceFlingerClient *)。由此可以看出,是调用的ISurfaceFlingerClient创建的Surface。而ISurfaceFlingerClient中的CreateSurface函数是一个纯虚函数,C++中,通过父类的指针可以调用子类中的函数,我们分析一下,看看在何处对mSurface进行了赋值操作,以至于产生了真正的调用。在SurfaceComposerClient::_init函数中,我们惊奇的发现,确实有一个对mSurface的赋值操作,但可惜的是,这也是将一个ISurfaceFlingerClient*类型的数赋值给了它。那它到底在什么地方进行了赋值呢?继续跟踪,找出SurfaceComposerClient::_init函数的调用者。在SurfaceComposerClient的构造函数中,有对_init函数的调用。代码如下
sp<ISurfaceComposer> sm(getComposerService());
if (sm == 0) {
_init(0, 0);
return;
}
_init(sm, sm->createConnection());
由此,我们需要继续跟踪ISurfaceComposer中的createConnection函数,跟踪过去,竟然也是纯虚函数,杯具啊!!
在调用Surface时,调用createSurface()函数,创建各个层之后,分别调用不同层中的getSurface()接口来得到一个ISurface类型的实例,然后在SurfaceComposerClient::createSurface()中得到Surface,并将其返回。
3. SurfaceFlinger和显示硬件的接口
4. SurfaceFlinger的显示设备,是由DisplayHardware目录中的DisplayHardware.cpp文件来实现的,其中创建了一个DisplayHardware来作为主要的显示界面。