下面看看初始化的代码
整个程序的入口位于文件:
src\chrome\app\chrome_exe_main_win.cc
这里只有一个入口函数wWinMain,标准的win32入口,这个函数很简单,调用CommandLine::Init(0, NULL);初始化命令行的对象,然后启动沙盒服务。
最后创建MainDllLoader对象,MainDllLoader对象只有一个主要作用,动态加载chrome.dll,调用的是Launch函数,并把主模块句柄和沙盒类的指针作为参数传递进去,而浏览器的主要功能都放在了chrome.dll中。
在Launch函数里面,很标准的动态加载dll方法,通过GetProcAddress获取chrome.dll的ChromeMain函数的地址,然后调用这个函数。这样程序流程来到了chrome.dll模块中,ChromeMain函数位于
src\chrome\app\chrome_dll_main.cc
ChromeMain函数主体就比较复杂了,做了一些初始化的工作,然后最重要的是通过调用
std::string process_type =
parsed_command_line.GetSwitchValueASCII(switches::kProcessType);
确定当前进程的类型,如果是“nacl-loader”则启动NaClMain,如果为空则启动BrowserMain,如果是randerer则启动randerer进程,或者Pugin进程等等。
一般情况下自然是启动BrowserMain,进入BrowserMain函数,会进行大量的初始化工作,把chrome的多进程的框架基本搭建起来。
BrowserMain函数位于src\chrome\browser\browser_main.cc中。
大概说说其中的几个关键处理过程:
一,调用MainMessageLoopStart函数创建主线程,并启动主线程的消息循环。
二, 定义BrowserProcessImpl对象并初始化,BrowserProcessImpl对象是一个很重要的组件,它有几个重要功能,创建各种线程,包括IO线程,数据库线程,文件线程,缓存线程,子进程启动线程。另外,创建各种resource_host和rander_host。
三,创建IO线程等几个必须的线程。
四,创建图形界面主窗口并初始化,这里调用的是 if (browser_init.Start(parsed_command_line, FilePath(), profile, &result_code)),创建完毕之后,按照win32的经典模式,启动一个主进程的消息循环,让主进程开始接收并处理系统或者用户信息,这里调用的RunUIMessageLoop(browser_process.get());整个主窗口以及所有相关操作封装在了Browser类里面,关于这个类,以后单独作详细分析。
其他任务还包括初始化toolkit,语言,添加tab项,初始化网络设置,初始化sdch压缩管理对象等等。
由于多进程是chrome的一个重要特征,并且多进程又涉及到进程间通信,这也是chrome的重要组成部分,因此我们先详细分析一下chrome的多进程模型。