论坛首页 开源情报交流区 阅读主题

[原创]chromium 的启动

295 浏览 2 回复
#1 楼主 2026-06-01 21:09:08
简单串一下浏览器启动的整个流程. 这样可以将 chromium 的框架串起来, 作者志大才疏, 有写的不好地方还请指出.Chromium 的入口文件设计是不同系统有各自的入口文件, 最终都会汇总到统一的核心启动逻辑:这个最短:该文件仅用于 Linux 等类 Unix 系统, 是基于 Aura 界面框架的入口实现, 其核心是直接调用 ChromeMain(argc, argv), 无需中间 DLL 加载层, 与 Windows 需通过 chrome.dll 启动的逻辑完全不同.贴出主要部分:主要是在通过 dlopen 动态加载框架, 从加载的框架中查找并调用 ChromeMain 函数, 传入命令行参数, 最终通过 exit 退出以保证栈回溯完整性只贴出主要的 main 函数:初始化命令行, 设置工作目录, 各种奔溃处理..., 实际上是 loader->Launch 在进一步加载, 进入 chrome\app\main_dll_loader_win.cc:仍然是用进入 ChromeMain 函数.又是各种乱七八糟的不同平台的参数处理, 初始化等等, 值得注意的是在这里处理了无头模式, 然后调用 ContentMain 进一步启动, 来到 content\public\app\content_main.h:在跟入默认实现 content\app\content_main.cc:又是初始化一堆, 接着跟入 content_main_runner->Run, 来到 content\app\content_main_runner_impl.cc:主进程启动时不携带 --type 参数, 则 process_type.empty() 是 true, 所以我们先不管子进程, 也就是 if (!process_type.empty()) 中的逻辑. 注册一下这三种进程的回调类:这段代码, 初始化了 Mojo, 用于进程通信, 然后又初始化一大堆, 可以自己读读. 在跟入 RunBrowserProcessMain:delegate->RunProcess 对一些平台做了些处理, 不太重要, 继续跟入 BrowserMain, 来到 content\browser\browser_main.cc:这个就是生命周期控制函数,
首先看下 main_runner->Initialize, 跟入, 来到 content\browser\browser_main_runner_impl.cc:可以看到这里初始化一大堆, 什么 ui, font, skia..., 再跟入 main_runner->Run:在跟入 RunMainMessageLoop:不管三七二十一, 跟入 main_run_loop->Run, 来到了 base\task\sequence_manager\thread_controller_with_message_pump_impl.cc:在跟入 pump_->Run, 发现不同平台还是有不同的实现:

我们看 base\message_loop\message_pump_default.cc 中的:大体上就是一套任务队列机制, 所有任务(UI 事件, 网络回调, 延迟任务, 空闲任务等)最终都会被放入任务队列中, 消息泵循环的核心就是"从队列取任务→执行→再取"的循环, 这是整套机制的底层基础. 回到最开始 ContentMainRunnerImpl::Run, 还记得有一个主进程子进程的分流吗, 我们从这里开始看, 跟人 RunOtherNamedProcessTypeMain 来到 content\app\content_main_runner_impl.cc:一个个来看. 仍然是启动子进程加入消息队列. 等待主进程派发任务.好了, 到此为止吧.#include "build/build_config.h"

---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-288998.htm
#2 2026-06-01 21:09:08
YYDS,向大佬学习
#3 2026-06-01 21:09:08
TQL

请登录后参与讨论

立即登录 注册账号