Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程讲义.doc
文本预览下载声明
Android应用程序与SurfaceFlinger服务之间的共享UI元数据(SharedClient)的创建过程分析
在前面一篇文章中,我们分析了Android应用程序与SurfaceFlinger服务的连接过程。Android应用程序成功连接上SurfaceFlinger服务之后,还需要一块匿名共享内存来和SurfaceFlinger服务共享它的UI元数据,以便使得SurfaceFlinger服务可以正确地为它创建以及渲染Surface。在本文中,我们将详细地分析这块用来保存UI元数据的匿名共享内存的创建过程。
在 一文中提到,用来保存Android应用程序的UI元数据的匿名共享内存最终是被结构化为一个SharedClient对象来访问的。每一个与UI有关的Android应用程序进程有且仅有一个SharedClient对象,而且这些SharedClient对象是由Android应用程序请求SurfaceFlinger服务创建的:Android应用程序首先获得SurfaceFlinger服务的一个Binder代理接口,然后再通过这个代理接口得到另外一个类型为UserClient的Binder代理接口,最后就可以通过后一个Binder代理接口来获得一个SharedClient对象。
由于每一个与UI有关的Android应用程序进程有且仅有一个SharedClient对象,因此,Android系统就通过一个单例模式的类来专负责创建和管理这个SharedClient对象。这个类的名称为SurfaceClient,定义在frameworks/base/libs/surfaceflinger_client/Surface.cpp文件中,如下所示:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
class SurfaceClient : public SingletonSurfaceClient
{
// all these attributes are constants
spISurfaceComposer mComposerService;
spISurfaceComposerClient mClient;
status_t mStatus;
SharedClient* mControl;
spIMemoryHeap mControlMemory;
SurfaceClient()
: SingletonSurfaceClient(), mStatus(NO_INIT)
{
spISurfaceComposer sf(ComposerService::getComposerService());
mComposerService = sf;
mClient = sf-createClientConnection();
if (mClient != NULL) {
mControlMemory = mClient-getControlBlock();
if (mControlMemory != NULL) {
mControl = static_castSharedClient *(
mControlMemory-getBase());
if (mControl) {
mStatus = NO_ERROR;
}
}
}
}
friend class SingletonSurfaceClient;
public:
status_t initCheck() const {
return mStatus;
}
SharedClient* getSharedClient() const {
return mControl;
}
ssize_t getTokenForSurface(const spISurface sur) const {
// TODO: we could cache a few toke
显示全部