chromium browser端启动逻辑

chromium浏览器的入口是chrome_exe_main_win.cc,wWinMain主函数就在这个文件里。wWinMain里面的逻辑很简单,里面MainDllLoader会根据命令行type参数去加载chrome.dll或者chrome_child.dll,然后调用dll中的ChromeMain函数。   在ChromeMain中会创建ChromeMainDelegate对象,生成ContentMainParams传递给content::ContentMain,再通过ContentMainParams去初始化ContentMainRunner对象。 ChromeMainDelegate继承自content::ContentMainDelegate,主要是在围绕Sandbox初始化的前后做一些工作,另外创建一些ChromeContentBrowserClient,ChromeContentRendererClient,ChromeContentPluginClient,ChromeContentUtilityClient的对象,浏览器的更多逻辑都在ChromeContent*Client这些对象中。此外还调用content::SetContentClient设置ChromeContentClient。 ChromeMainDelegate的那些方法都会在ContentMainRunner中陆续调用到。 在ContentMainRunner::Initialize函数中又调用ChromeMainDelegate::BasicStartupComplete。ChromeMainDelegate::BasicStartupComplete做一些初始化工作并调用content::SetContentClient。 ContentMainRunner::Initialize又调用ContentClientInitializer通过ChromeMainDelegate去CreateContent*Client。然后ContentMainRunner::Initialize继续做一些初始化工作。 ContentMainRunner::Initialize中接着调用ChromeMainDelegate::PreSandboxStartup。 PreSandboxStartup中初始化UserDataDir。初始化logging系统。 ContentMainRunner::Initialize中接着初始化Sandbox。初始化工作完成。 然后调用ContentMainRunner::Run,在run里面调用RunNamedProcessTypeMain。RunNamedProcessTypeMain先调用ChromeMainDelegate::RunProcess,然后根据进程类型调用对应的BrowserMain,RendererMain,PluginMain,GpuMain等等。 在BrowserMain中,有个BrowserMainRunner,跟ContentMainRunner类似。BrowserMainRunner::Initialize中根据MainFunctionParams创建BrowserMainLoop。BrowserMainLoop::Init中调用ChromeContentBrowserClient::CreateBrowserMainParts创建BrowserMainParts*。同时还在这里Initialize创建其他线程消息循环。 最后BrowserMainRunnerImpl::Run调用BrowserMainLoop::RunMainMessageLoopParts开始了UI线程的循环。 ChromeContentBrowserClient是浏览器browser逻辑的枢纽。ChromeContentBrowserClient::CreateBrowserMainParts里面创建BrowserMainParts。BrowserMainParts又可以添加其他的ChromeBrowserMainExtraPartsViews,ChromeBrowserMainExtraPartsAsh,ChromeBrowserMainExtraPartsAura对象,这些对象封装的逻辑在BrowserMainRunner里面中被调用执行。 ChromeBrowserMainParts继承自BrowserMainParts,它是个非常总要的类。它创建了BrowserProcessImpl、StartupBrowserCreator、ChromeProcessSingleton、Profile、PrefService等对象。BrowserProcessImpl创建了各种Manager,Service,还有IO线程。StartupBrowserCreator,StartupBrowserCreatorImpl则是开始创建一个Browser,并初始化Profile。 Profile,ProfileImpl继承自content::BrowserContext,对应着browser回话上下文信息和用户配置信息。PrefService则是能把Profile里面的状态增删改查并保存到文件中。 OffTheRecordProfileImpl也是继承自Profile,它是用于隐身模式的浏览器上下文和用户配置信息。 WebContents代表着浏览器tab页中渲染出来的网页。WebContentsImpl则进一步继承了更多的网页方面的操控。Browser则是继承自WebContentsDelegate,它会收到来自WebContents的变化并做出响应。 ... Read More | Share it now!