用了半年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,导致和其他库不兼容,集成时候会报找不到相关符号。
因为它内部集成了一套自己魔改的C++源码,所以裁剪时也不太方便,其中的base、sql等模块裁剪还挺容易。
而有些模块需要强依赖这套内部的C++源码才能编译成功,无法裁剪,最近我也是在裁剪这块踩了好多坑。
google还提供了一个mini-chromium project,其实就是base的子集,就是给那些想用base作为基础库的项目使用的,但是这个project功能太少,用处不大。
遇到了问题在网上找答案不是很方便,毕竟用的人少。
建议
貌似edge浏览器就是在chromium的基础上开发的,但小项目建议就别用它了,太麻烦,个人看法,单纯从基础库的角度来说,不如boost方便。
不知道大家对chromium怎么看,可以留言聊聊。