SurfaceFlinger启动过程分析(一)

转载时请注明出处和作者
文章出处:http://danielwood.cublog.cn
作者:Daniel Wood
------------------------------------------------------------
以下将讲讲surfaceflinger的启动过程,可以结合 启动过程图 来了解。当然最关键是代码(Google Android 2.2),因为我讲的难免有错误之处。
由于工作需要,所以要了解surfaceflinger这一块,参考的资料也较多,已经无法追溯来源,所以参考文献如下:^_^
参考文献:
[1] www.baidu.com
[2] g.cn
[3]Android display架构分析系列http://hi.baidu.com/leowenj/blog/item/429c2dd6ac1480c851da4b95.html
[4] Android Display System --- Surface Flinger
http://blog.csdn.net/yili_xie/archive/2009/11/12/4803527.aspx
[5] Android核心分析系列
http://wsqhs.spaces.live.com/blog/cns!94F639580F58209C!668.entry

SurfaceFlinger的启动过程还是从Zygote说起。Zygote起来后会调用SystemServer.java[frameworks\base\services\java\com\android\server]里面的main函数,然后调用本地函数init1(),然后调用的是JNIcom_android_server_SystemServer.cpp里面的android_server_SystemServer_init1函数。

staticvoidandroid_server_SystemServer_init1(JNIEnv*env,jobject clazz)
{
system_init();
}

然后调用

System_init.cpp[frameworks\base\cmds\system_server\library]system_init函数,通过获取属性字段system_init.startsurfaceflinger,如果字段值为1,那么就在这里启动surfaceflinger

char propBuf[PROPERTY_VALUE_MAX];

property_get("system_init.startsurfaceflinger", propBuf, "1");

if(strcmp(propBuf,"1")==0){
// Start the SurfaceFlinger
SurfaceFlinger::instantiate();
}

然而,另一方面,有一个可执行文件surfaceflinger,由目录framework/base/cmds/surfaceflinger编译产生,目录下的主要文件main_surfaceflinger.cpp里面就一个main函数:

intmain(intargc,char**argv)
{
sp<ProcessState>proc(ProcessState::self());
sp<IServiceManager>sm=defaultServiceManager();
LOGI("ServiceManager: %p",sm.get());
SurfaceFlinger::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}

以上两者都会调用SurfaceFlinger.cpp文件的instantiate函数。

voidSurfaceFlinger::instantiate(){
defaultServiceManager()->addService(
String16("SurfaceFlinger"),newSurfaceFlinger());
}

如果你想在可执行文件中启动SurfaceFlinger,那么你可以在init.rc文件中增加类似如下语句:

service surfaceflinger /system/bin/surfaceflinger
user root
onrestart restart zygote
disabled

当然你也必须设置属性字段system_init.startsurfaceflinger为0,这个工作可以在init.rc中完成。

setprop system_init.startsurfaceflinger 0


surfaceflinger构造函数调用init()函数【surfaceflinger.cpp】,init函数主要打印"SurfaceFlinger is starting"Log信息,并且对一些debug属性进行配置。

surfaceflinger构造函数调用readyToRun函数【surfaceflinger.cpp】,至于为什么会调用readyToRun函数(并没有显式的调用语句),主要是因为surfaceflinger是一个线程类,必须实现并会调用如下两个函数:一是readyToRun(),该函数定义了线程循环前需要初始化的内容;二是threadLoop(),每个线程都必须实现,该函数定义了线程执行的内容,如果该函数返回true,线程会继续调用threadLoop(),如果返回false,线程将退出。-->选自参考文献。

关于readyToRun将在下节分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值