Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2116743
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: Android平台

2014-07-17 19:34:57

一.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=0 ; 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 (i > 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. }












阅读(812) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~