标签

,

Android 2.2(froyo)
system_init()(base/cmds/system_server/library/system_init.cpp)中的 SurfaceFlinger::instantiate();会注册SurfaceFlinger服务:

119 void SurfaceFlinger::instantiate() {
120     if(surfaceflinger == NULL)
121     {
122         surfaceflinger = new SurfaceFlinger();
123     }
124     defaultServiceManager()->addService(
125             String16(“SurfaceFlinger”), surfaceflinger);
126 }

而defaultServiceManager()->addService()实际上调用的是BpServiceManager::addService(const String16& name, const sp<IBinder>& service),所以surfaceflinger就转化成了const sp<IBinder>,又由于sp<T>的构造函数为:

301 template<typename T>
302 sp<T>::sp(T* other)
303     : m_ptr(other)
304 {
305     if (other) other->incStrong(this);
306 }

在又有:

281 void RefBase::incStrong(const void* id) const
282 {
283     weakref_impl* const refs = mRefs;
….
296
297     android_atomic_add(-INITIAL_STRONG_VALUE, &refs->mStrong);
298     const_cast<RefBase*>(this)->onFirstRef();
299 }

所以,最终会调用SurfaceFlinger::onFirstRef()

376 void SurfaceFlinger::onFirstRef()
377 {
378 run(“SurfaceFlinger”, PRIORITY_URGENT_DISPLAY);
379
380 // Wait for the main thread to be done with its initialization
381 mReadyToRunBarrier.wait();
382 }

于是SurfaceFlinger就开始运行了(readyToRun()->threadLoop())
Android 4.0(Ice Cream Sandwich)
init.rc中有

268 setprop system_init.startsurfaceflinger 0

409 service surfaceflinger /system/bin/surfaceflinger
410 class main
411 user system
412 group graphics
413 onrestart restart zygote

所以system_init()将不会启动SurfaceFlinger,而是由init程序启动的。而且instantiate()实际为BinderService::instantiate(),后面的实际启动也是由RefBase机制来进行的。

参考:
http://blog.csdn.net/yili_xie/article/details/4803517

Advertisements