Cubietruck---20.SurfaceFlinger创建过程分析

本文详细解析了Android系统中SurfaceFlinger的启动流程,包括如何阻止system_init启动SurfaceFlinger,以及SurfaceFlinger真正的启动过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.surfaceFlinger的启动过程
1. 阻止system_init启动SF
在init.rc中
  1. Set this property so surfaceflinger is not started by system_init
  2.     setprop system_init.startsurfaceflinger 0
即然上面说了要阻止system_init把surfaceFlinger启动,那就看一下是如何阻止的吧.
在frameworks/base/cmds/system_server/library/system_init.cpp中
  1. extern "C" status_t system_init()
  2. {
  3.     char propBuf[PROPERTY_VALUE_MAX];
  4.     property_get("system_init.startsurfaceflinger", propBuf, "1");
  5.     if (strcmp(propBuf, "1") == 0) {
  6.         SurfaceFlinger::instantiate();
  7.     } 
  8. }
获取system_init.startsurfaceflinger这个属性的值,如果为1的话,就启动sf.
但是在init.rc中把这个属性值设为了0,这个就不会启动sf了.
2. SF的真正启动过程
还是在init.rc中
  1. service surfaceflinger /system/bin/surfaceflinger
  2.     class main
  3.     user system
  4.     group graphics
  5.     onrestart restart zygote
在frameworks/native/cmds/surfaceflinger/main_surfaceflinger.cpp中
  1. int main(int argc, char** argv) {
  2.     SurfaceFlinger::publishAndJoinThreadPool(true);
  3.     ProcessState::self()->setThreadPoolMaxThreadCount(4);
  4.     return 0;
  5. }
在frameworks/native/include/binder/BinderService.h中
  1. static void publishAndJoinThreadPool(bool allowIsolated = false) {
  2.     sp<IServiceManager> sm(defaultServiceManager());
  3.     sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated);
  4.     ProcessState::self()->startThreadPool();
  5.     IPCThreadState::self()->joinThreadPool();
  6. }
其中的new SERVICE就是new一个surfaceflinger,进入surfaceflinger的构造函数
3. onFirstRef启动主线程
因为SurfaceFlinger继承自class Thread, Thread又继承自RefBase
在 frameworks/native/include/utils/Thread.h中, class Thread : virtual public RefBase
  1. void SurfaceFlinger::onFirstRef()
  2. {
  3.     mEventQueue.init(this);              //消息队列初始化
  4.     run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY);  //启动工作线程
  5.     mReadyToRunBarrier.wait();   //等侍标志
  6. }



  1. status_t SurfaceFlinger::readyToRun()
  2. {
  3.     mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
  4.     eglInitialize(mEGLDisplay, NULL, NULL);

  5.     mHwc = new HWComposer(this, *static_cast<HWComposer::EventHandler *>(this));

  6.     EGLint format = mHwc->getVisualID();
  7.     mEGLConfig = selectEGLConfig(mEGLDisplay, format);
  8.     mEGLContext = createGLContext(mEGLDisplay, mEGLConfig);


  9.     for (size_t i=; i<DisplayDevice::NUM_DISPLAY_TYPES ; i++) {
  10.         DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
  11.         mDefaultDisplays[i] = new BBinder();
  12.         wp<IBinder> token = mDefaultDisplays[i];

  13.         if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
  14.             bool isSecure = true;
  15.             mCurrentState.displays.add(token, DisplayDeviceState(type));
  16.             sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i);
  17.             sp<SurfaceTextureClient> stc = new SurfaceTextureClient(static_cast< sp<ISurfaceTexture> >(fbs->getBufferQueue()));
  18.             sp<DisplayDevice> hw = new DisplayDevice(this, type, isSecure, token, stc, fbs, mEGLConfig);
  19.             if (> DisplayDevice::DISPLAY_PRIMARY)
  20.                 hw->acquireScreen();            
  21.             mDisplays.add(token, hw);
  22.         }
  23.     }
  24.     sp<const DisplayDevice> hw(getDefaultDisplayDevice());

  25.     DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);
  26.     initializeGL(mEGLDisplay);

  27.     mEventThread = new EventThread(this);
  28.     mEventQueue.setEventThread(mEventThread);

  29.     mDrawingState = mCurrentState;

  30.     mReadyToRunBarrier.open();

  31.     initializeDisplays();

  32.     startBootAnim();

  33.     return NO_ERROR;
  34. }
a. 初始化egl
b. 新建 HWComposer
c. 新建 DisplayDevice
    

  1. DisplayDevice::DisplayDevice(const sp<SurfaceFlinger>& flinger, ...)
  2. {
  3.     init(config);
  4.     mDisplayDispatcher = new DisplayDispatcher(mFlinger); //新建一个DisplayDispatcher
  5. }






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值