一.surfaceFlinger的启动过程
1. 阻止system_init启动SF
在init.rc中
-
# Set this property so surfaceflinger is not started by system_init
-
setprop system_init.startsurfaceflinger 0
即然上面说了要阻止system_init把surfaceFlinger启动,那就看一下是如何阻止的吧.
在frameworks/base/cmds/system_server/library/system_init.cpp中
-
extern "C" status_t system_init()
-
{
-
char propBuf[PROPERTY_VALUE_MAX];
-
property_get("system_init.startsurfaceflinger", propBuf, "1");
-
if (strcmp(propBuf, "1") == 0) {
-
SurfaceFlinger::instantiate();
-
}
-
}
获取
system_init.startsurfaceflinger这个属性的值,如果为1的话,就启动sf.
但是在init.rc中把这个属性值设为了0,这个就不会启动sf了.
2. SF的真正启动过程
还是在init.rc中
-
service surfaceflinger /system/bin/surfaceflinger
-
class main
-
user system
-
group graphics
-
onrestart restart zygote
在frameworks/native/cmds/surfaceflinger/main_surfaceflinger.cpp中
-
int main(int argc, char** argv) {
-
SurfaceFlinger::publishAndJoinThreadPool(true);
-
ProcessState::self()->setThreadPoolMaxThreadCount(4);
-
return 0;
-
}
在frameworks/native/include/binder/BinderService.h中
-
static void publishAndJoinThreadPool(bool allowIsolated = false) {
-
sp<IServiceManager> sm(defaultServiceManager());
-
sm->addService(String16(SERVICE::getServiceName()), new SERVICE(), allowIsolated);
-
ProcessState::self()->startThreadPool();
-
IPCThreadState::self()->joinThreadPool();
-
}
其中的new SERVICE就是new一个surfaceflinger,进入surfaceflinger的构造函数
3. onFirstRef启动主线程
因为SurfaceFlinger继承自class Thread, Thread又继承自RefBase
在 frameworks/native/include/utils/Thread.h中, class Thread : virtual public RefBase
-
void SurfaceFlinger::onFirstRef()
-
{
-
mEventQueue.init(this); //消息队列初始化
-
run("SurfaceFlinger", PRIORITY_URGENT_DISPLAY); //启动工作线程
-
mReadyToRunBarrier.wait(); //等侍标志
-
}
-
status_t SurfaceFlinger::readyToRun()
-
{
-
mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
eglInitialize(mEGLDisplay, NULL, NULL);
-
-
mHwc = new HWComposer(this, *static_cast<HWComposer::EventHandler *>(this));
-
-
EGLint format = mHwc->getVisualID();
-
mEGLConfig = selectEGLConfig(mEGLDisplay, format);
-
mEGLContext = createGLContext(mEGLDisplay, mEGLConfig);
-
-
-
for (size_t i=0 ; i<DisplayDevice::NUM_DISPLAY_TYPES ; i++) {
-
DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
-
mDefaultDisplays[i] = new BBinder();
-
wp<IBinder> token = mDefaultDisplays[i];
-
-
if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
-
bool isSecure = true;
-
mCurrentState.displays.add(token, DisplayDeviceState(type));
-
sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i);
-
sp<SurfaceTextureClient> stc = new SurfaceTextureClient(static_cast< sp<ISurfaceTexture> >(fbs->getBufferQueue()));
-
sp<DisplayDevice> hw = new DisplayDevice(this, type, isSecure, token, stc, fbs, mEGLConfig);
-
if (i > DisplayDevice::DISPLAY_PRIMARY)
-
hw->acquireScreen();
-
mDisplays.add(token, hw);
-
}
-
}
-
sp<const DisplayDevice> hw(getDefaultDisplayDevice());
-
-
DisplayDevice::makeCurrent(mEGLDisplay, hw, mEGLContext);
-
initializeGL(mEGLDisplay);
-
-
mEventThread = new EventThread(this);
-
mEventQueue.setEventThread(mEventThread);
-
-
mDrawingState = mCurrentState;
-
-
mReadyToRunBarrier.open();
-
-
initializeDisplays();
-
-
startBootAnim();
-
-
return NO_ERROR;
-
}
a. 初始化egl
b. 新建 HWComposer
c. 新建 DisplayDevice
-
DisplayDevice::DisplayDevice(const sp<SurfaceFlinger>& flinger, ...)
-
{
-
init(config);
-
mDisplayDispatcher = new DisplayDispatcher(mFlinger); //新建一个DisplayDispatcher
-
}
阅读(899) | 评论(0) | 转发(0) |