本身动手实现浏览器,21天自制chromium:起手篇

转:https://zhuanlan.zhihu.com/p/29101613?utm_medium=social&utm_source=qqjavascript

你们好,我又来了。这篇是21天自制原子弹的姐妹篇。css

开个玩笑……从这篇开始, 咱们来点干货,如何从blink打造一个能够实用的浏览器组件。java

 

chromium从零几年搞到如今,已经彻底变成一个无所不包的庞然大物。node

若是你只是想要一个能浏览网页的组件,方便嵌入到本身的程序里,或者想用网页来作界面--例如QQ音乐,网易云音乐那样,c++

那么chromium的那堆多进程、mojo通讯、Chrome Apps 框架、Aura Shell、增量升级系统、Chrome Extensions 、headless模式、P2P 通讯库,native_client、pdf、ppapi、沙盒机制等等一堆乱七八糟你听都没听过的东西都不会须要。程序员

然而只要用了chromium的内核(例如cef,elecTron,nwjs之类),这堆东西除了占用系统资源外,你还不得不都打包带上。web

这时候你就会有个强烈的想法,我不须要这堆乱七八糟的功能,只要能浏览大部分网页的排版渲染组件能够么。api

答案是确定的。浏览器

webkit内核就是为此而生。但这里有个问题,chromium虽然当年是使用webkit内核,但自从和苹果分道扬镳后,把webkit更名成blink不说,代码和结构彻底是面目全非,并且最重要的是blink已经不是像webkit那样是一个独立的组件了,而是chromium那堆几百个第三方库里一个小小的组件,全部外部设施都依赖于chromium的其余组件了。网络

咱们来看看blink目前须要依赖哪些组件:

  1. cc层(chromium 合成层,实现网页绘制并贴到屏幕上等操做。这个是最麻烦的,之后专门开一篇来说如何自制)
  2. base库(chromium基础库,相似字符串操做等一系列c++基础库)
  3. 各类和操做系统打交道的接口,例如菜单、文件读写、窗口操做等。这堆东西能够认为是要实现third_party/WebKit/public/platform/Platform.h里的一系列虚函数(又叫Blink Public或者WebKit Glue)。
  4. 若是你不是打算卖到清真地区,一般icu你也不会想要。这是个占用体积很大的毒瘤,一个数据文件就10几M,做为轻量级内核,你确定不想带。
  5. 网络层。
  6. v8(js引擎)
  7. skia(底层绘图库)

 

 

 

那咱们如何在尽可能少的使用chromium代码基础上,实现上诉一堆功能和组件呢?

这是目前个人解决方案:

  1. cc层:我放弃了原版chromium cc层,本身彻底重写了一遍。这个工做量至关巨大,若是你不是和我同样这么闲,建议直接使用原版cc。
  2. base库:在chromium四十几版的时候,blink几乎不依赖base。然而高版本把wtf库里的大量实现,直接使用base库。因此若是你是从高版本blink开始撸,能够直接扣取低版本blink里的wtf来实现base相关依赖。此处工做量也甚大。
  3. 各类和操做系统打交道的接口:这块其实没有难度,就是有着巨大的工做量。一个个补齐就好。
  4. icu:直接使用系统相关的接口。例如文字编码转换之类的,windouws就有现成的api。其余高级icu api例如断行断句,若是你只打算运行在中英文地区,那本身实现也很简单。只有阿拉伯文、天成文、藏文这些小众语言那须要那么复杂的规则。
  5. 网络层:直接用webkit里的现成代码吧。
  6. v8:直接使用chromium原始代码便可。毕竟这玩意不依赖其余任何组件。
  7. skia:直接使用chromium原始代码便可。毕竟这玩意不依赖其余任何组件。

说到这里,你们确定有个疑问:既然这么多都用webkit,那为啥咱们直接拿webkit过来不就好了。

实际上是能够的。webkit发展到今天,已经彻底和chromium分开发展了(当年有一阵子谷歌的人也一直在给webkit提代码,后面苹果把他们都踢走了)。并且webkit就是个完整内核,你用来作轻量级组件正合适。但我有几个缘由仍是放弃了:

  1. webkit对标准的支持仍是有点误差。例如web组件标准,css gird等等。
  2. webkit的web inspect作的很烂,彻底没blink好用。
  3. webkit如今也很大了,我编译出来不算icu,也有26M多。做为一个有追求的程序员,我但愿这个大小是10M左右。
  4. 最重要的,webkit的js引擎是javascriptcore。这样实现的组件就没法兼容市面上那堆v8造出来的轮子。例如electron、nwjs、nodejs都是用v8。
  5. 还有个小点就是chromium更新很是快,跟着谷歌大佬走感受更有保障些,尤为是碰到各类莫名其妙的bug,还能够查chromium的更新记录。

既然放弃了webkit,从chomium开始撸,那必然会遇到吨的伤害。欲知后事如何,且听下回分解

相关文章
相关标签/搜索