android:SurfaceFlinger启动

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值