Cubietruck---20.SurfaceFlinger创建过程分析
2016-06-28 18:31
351 查看
一.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
}
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
}
相关文章推荐
- 排序算法-基数排序
- MySql游标的使用
- [训练指南] 第一章 例题3 分金币 (Spreading the wealth,Uva 11300)
- Cubietruck---19.andorid进程创建过程分析
- 高考后的尴尬
- Andorid-20k+的面试题
- “个人总结”最基础博弈套路,实力山寨
- 微软发布屏蔽Win10升级的官方办法
- Objective-C Runtime 运行时之六:拾遗
- Cubietruck---18.input子系统启动流程分析
- 现在软件是不是越来越流氓了,越来越任性了.
- 详解Swift中enum枚举类型的用法
- Error reading from database: java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDyna
- DICOM医学图像彩色化
- Cubietruck---17.键盘设备的添加及数据流程分析
- 手把手教你禁止流氓软件进入电脑!小白福因~~~~
- Cubietruck---16.设备的添加及数据分析
- 东方输入法真的有流氓么?
- Linux编辑器vi的使用笔记
- Cubietruck---15. input系统分析2