android:SurfaceFlinger启动 .

来源:互联网 发布:紧急通知最新域名升级 编辑:程序博客网 时间:2024/06/07 22:48

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

[cpp] view plaincopyprint?
  1. 119 void SurfaceFlinger::instantiate() {  
  2. 120     if(surfaceflinger == NULL)  
  3. 121     {  
  4. 122         surfaceflinger = new SurfaceFlinger();  
  5. 123     }  
  6. 124     defaultServiceManager()->addService(  
  7. 125             String16(“SurfaceFlinger”), surfaceflinger);  
  8. 126 }  


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

[cpp] view plaincopyprint?
  1. 301 template<typename T>  
  2. 302 sp<T>::sp(T* other)  
  3. 303     : m_ptr(other)  
  4. 304 {  
  5. 305     if (other) other->incStrong(this);  
  6. 306 }  


在又有:

[cpp] view plaincopyprint?
  1. 281 void RefBase::incStrong(const void* id) const  
  2. 282 {  
  3. 283     weakref_impl* const refs = mRefs;  
  4. ….  
  5. 296  
  6. 297     android_atomic_add(-INITIAL_STRONG_VALUE, &refs->mStrong);  
  7. 298     const_cast<RefBase*>(this)->onFirstRef();  
  8. 299 }  


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

[cpp] view plaincopyprint?
  1. 376 void SurfaceFlinger::onFirstRef()  
  2. 377 {  
  3. 378 run(“SurfaceFlinger”, PRIORITY_URGENT_DISPLAY);  
  4. 379  
  5. 380 // Wait for the main thread to be done with its initialization  
  6. 381 mReadyToRunBarrier.wait();  
  7. 382 }  


于是SurfaceFlinger就开始运行了(readyToRun()->threadLoop())



Android 4.0(Ice Cream Sandwich)

init.rc中有

[cpp] view plaincopyprint?
  1. 268 setprop system_init.startsurfaceflinger 0  
  2. …  
  3. 409 service surfaceflinger /system/bin/surfaceflinger  
  4. 410 class main  
  5. 411 user system  
  6. 412 group graphics  
  7. 413 onrestart restart zygote  


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

 

 

加注:

当前在低于4.0的android中, 可以通过设置systeminit.startsurfaceflinger的属性值为0, 来禁止system server启动surfaceflinger.