Chromium开发实践:优势、挑战与最佳实践 #
引言 #
Chromium作为一个大型开源项目,其架构设计和工程实践对于开发者来说具有重要的参考价值。本文基于半年的实际开发经验,深入探讨Chromium的优势与局限性,为开发者提供实用的参考建议。
前一段参与了一个项目,项目内部使用了 chromium 作为基础库,这也是我第一次接触 chromium,到现在差不多半年时间,这里说说使用心得。
优点 #
先进的多线程任务处理理念:少用共享内存,少用锁,多用任务分发,特定的 task 放在固定的 sequence 中。具体可以看这篇文章:多线程开发中,多用消息传递,少用锁
跨平台,且功能强大:比如网络通信、进程间通信、如何启动进程并传递参数等,都有比较好用的封装。
有自己的一套编译构建规则 GN:这貌似不能算作一个优点,毕竟学习成本高,但是它和 bazel 类似,你会感觉很熟悉。配置了很严格的编译参数,确保代码的健壮性。很多在其它地方(-Wall -Werror 等)可以编译通过的代码,在 chromium 里都编译不通过,具体为啥我还没来得及深入研究。
内部集成了很多检测机制:编译时检查和运行时检查,可以检查某个操作是否在特定的 sequence 中,如果不在的话,debug 模式时会触发断言。这样可以确保很多操作是线程安全的,进一步增强代码的健壮性。具体可以看看这篇文章:https://aijishu.com/a/1060000000091082#item-2-1
缺点 #
整个 chromium 太大了:我自己本地看了下,除去.git,大概有 60G 左右,配置它的环境非常麻烦,需要翻墙,拉取它所有的依赖库也特别耗时。
编译时间特别长:特别是全量编译。
项目大,其实不适合做普通项目的基础库:普通项目用不到 chromium 的大多数功能,还要忍受它占用空间大,配置环境麻烦,编译时间长的缺点。而且编出来的可执行文件体积很大,特别是做 SDK,如果对体积有要求的话,估计不能满足要求。
不能引用其他的第三方 C++ 动态链接库或者静态链接库:因为它内部集成了一套自己魔改的 C++ 源码,使用的这套 C++ 源码做的编译,和外部的三方库不兼容。比如一个 std::string,正常库中的符号应该是 std::basic_string,而在 chromium 中,它却是 std::__1::basic_string,导致和其他库不兼容,集成时候会报找不到相关符号。
裁剪不方便:虽然其中的 base、sql 等模块裁剪还挺容易,但有些模块需要强依赖这套内部的 C++ 源码才能编译成功,无法裁剪,最近我也是在裁剪这块踩了好多坑。
google 提供的 mini-chromium project 功能太少:就是给那些想用 base 作为基础库的项目使用的,但是这个 project 功能太少,用处不大。
遇到问题在网上找答案不是很方便:毕竟用的人少。
建议 #
edge 浏览器就是在 chromium 的基础上开发的,但小项目建议就别用它了,太麻烦,个人看法,单纯从基础库的角度来说,不如 boost 方便。