文章出处:http://danielwood.cublog.cn 作者:Daniel Wood



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

static void android_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函数:

int main(int argc, 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函数。

void SurfaceFlinger::instantiate() {
defaultServiceManager()->addService(
String16("SurfaceFlinger"), new SurfaceFlinger());
}

如果你想在可执行文件中启动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将在下节分析


更多相关文章

  1. ffmpeg入门教程之Android使用FFmpeg so(封装格式转换)
  2. Android(安卓)N Ethernet新IP获取机制—IpManager
  3. Android(安卓)RILD运行机制详解
  4. Android(安卓)WebView Java和JavaScript的交互(一)
  5. Android进阶之抢购倒计时功能
  6. android view构造函数研究
  7. Android(安卓)Context 相关
  8. Android游戏框架Libgdx使用入门
  9. ContentProvider何时创建?SQLiteDatabase方法何时执行?

随机推荐

  1. Unable to start activity ComponentInfo
  2. android里getView,inflate,listview问题
  3. android ksoap用法
  4. Android(安卓)中Intent的putExtra()方法
  5. android,总结,判断应用程序是否切换到后
  6. android 获取当前时间
  7. android C/C++ source files 全局宏定义
  8. Android 之 setContentView 源码阅读
  9. android 调用系统相机程序,存放文件夹创建
  10. Android聊天软件开发(基于网易云IM即时通