文章都是通过阅读源码分析出来的,还在不断完善与改进中,其中难免有些地方理解得不对,欢迎大家批评指正。
转载请注明:From LXS. http://blog.csdn.net/uiop78uiop78/
GUI系统之SurfaceFlinger章节目录:
blog.csdn.net/uiop78uiop78/article/details/8954508
1.1.1 SurfaceFlinger的启动
SurfaceFlinger的启动和ServiceManager有点类似,它们都属于系统的底层支撑服务,必需在设备开机的早期就运行起来。
/*frameworks/base/cmds/system_server/library/System_init.cpp*/
extern "C" status_t system_init()
{…
property_get("system_init.startsurfaceflinger", propBuf,"1");
if (strcmp(propBuf,"1") == 0) {
SurfaceFlinger::instantiate();
}…
这个System_init.cpp会被编译到libsystem_server库中,然后由SystemServer在JNI层进行加载调用,从而启动包括SurfaceFlinger、SensorService等在内的系统服务。
和AudioFlinger/AudioPolicyService看到的情况一样,它调用instantiate来创建一个binder server,名称为“SurfaceFlinger”。而且强指针的特性让它在第一次被引用时会调用onFirstRef:
void SurfaceFlinger::onFirstRef()
{
mEventQueue.init(this);//初始化事件队列
run("SurfaceFlinger",PRIORITY_URGENT_DISPLAY);//启动一个新的业务线程
mReadyToRunBarrier.wait();//等待新线程启动完毕
}
成员变量mEventQueue是一个MessageQueue类型的对象,我们在进程章节已经详细分析过消息队列与Looper、Handler等类的使用,大家可以先回头参考下(虽然Java层的这些类与SurfaceFlinger中用到的有一定差异,但其本质原理是一样的)。既然有消息队列,那就一定会有配套的事件处理器Handler以及循环体