文章目录
参考资料
一、SurfaceSession的创建
在上一篇文章(一个Activity的显示(1))中,我们最后发现Activity launch的时候创建的Window会创建一个SurfaceSession的对象。
现在我们看看这个对象是用来干什么的。
1.1 SurfaceSession 的创建
/** Create a new connection with the surface flinger. */
public SurfaceSession() {
mNativeClient = nativeCreate();
}
进入native层。
1.2 android_view_SurfaceSession.cpp:nativeCreate
static jlong nativeCreate(JNIEnv* env, jclass clazz) {
SurfaceComposerClient* client = new SurfaceComposerClient();
client->incStrong((void*)nativeCreate);
return reinterpret_cast<jlong>(client);
}
创建的是SurfaceComposerClient对象
1.3 SurfaceComposerClient.cpp 的创建
SurfaceComposerClient::SurfaceComposerClient()
: mStatus(NO_INIT)
{
}
void SurfaceComposerClient::onFirstRef() {
// 1.4 sf 看名字猜测这个是 SurfaceFlinger
sp<ISurfaceComposer> sf(ComposerService::getComposerService());
if (sf != 0 && mStatus == NO_INIT) {
// mParent 是 wp<IGraphicBufferProducer> 类型的指针
// 这里其实是空的
auto rootProducer = mParent.promote();
sp<ISurfaceComposerClient> conn;
// 1.5 所以 conn = sf->createConnection()
conn = (rootProducer != nullptr) ? sf->createScopedConnection(rootProducer) :
sf->createConnection();
if (conn != 0) {
mClient = conn; // 保存创建的Connection
mStatus = NO_ERROR;
}
}
}
1.4 SurfaceComposerClient.cpp:ComposerService:getComposerService
/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() {
ComposerService& instance = ComposerService::getInstance();
Mutex::Autolock _l(instance.mLock);
if (instance.mComposerService == NULL) {
ComposerService::getInstance().connectLocked();
assert(instance.mComposerService != NULL);
ALOGD("ComposerService reconnected");
}
return instance.mComposerService;
}
1.4.1 ComposerService 的初始化
ComposerService::ComposerService()
: Singleton<ComposerService>() {
Mutex::Autolock _l(mLock);
connectLocked();
}
void ComposerService::connectLocked() {
// 果然是创建和SurfaceFlinger的通信
const String16 name("SurfaceFlinger");
// 获取名为“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);
}
ComposerService 的初始化就是获取SurfaceFlinger服务,即将 mComposerService 指向SurfaceFlinger
1.5 SurfaceFlinger.cpp:createConnection
sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
return initClient(new Client(this));
}
Client::Client(const sp<SurfaceFlinger>& flinger)
: Client(flinger, nullptr)
{
}
Client::Client(const sp<SurfaceFlinger>& flinger, const sp<Layer>& parentLayer)
: mFlinger(flinger),
mParentLayer(parentLayer)
{
}
static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
status_t err = client->initCheck();
if (err == NO_ERROR) {
return client;
}
return nullptr;
}
这里就是创建了一个 Client 类型的对象,这个对象持有一个指向 SurfaceFlinger 的sp指针.
1.6 简略顺序图
小结
在继续分析之前我们先看看SurfaceFlinger这个庞然大物是怎么启动的.