chromium ⑤

时间:2022-09-07 08:32:09
我们都知道chromium是用webkit完成页面显示的,
 
那么chromium是怎样集成和封装webkit的呢?
 
是怎样将webkit整合到自己的框架中,并将一个页面渲染出来的?
 
这篇我们主要研究这些问题。
 
    从源码看,chromium将webkit作为第三方库引用(src/third_party/WebKit下)。从框架和实现上,chromium实际上做了两件事情:webkit port和webkit glue。
 
    webkit port
 
    webkit port是在某种OS上运行webkit引擎的打包和实现,比如QtWebkit、Gtk+ port、Chromium port、Adobe AIR port等。webkit主要包括三部分:webcore、javascript core和ports。webcore和jscore处理DOM解析、页面渲染、js解析等浏览器核心功能,而ports则提供了一系列抽象接口,不同平台上可以完成各自的实现,这些接口包括网络访问、UI绘制、线程和文件操作等,同时还可以port一些接口给外部程序调用或由外部程序给webkit提供支持。换句话说,webkit将核心部分与外部应用(OS相关)之间定义了一个接口协议组,port对这些接口进行部分或全部的支持,达到核心部分与应用环境的整合。
    webkit port需要做哪些工作呢?基本都是OS相关的:
    1,线程(thread);
    2,网络访问(network access);
    3,时钟(timer),时间日期(date/time);
    4,图形渲染系统(graphics and rendering);
    5,widgets与OS绘图的对接;
    6,Unicode(chromium用icu库);
    7,定义API层(外部与内核之间的交互接口)。
    对chromium来说,这部分源码都直接提交到了webkit的源码库中。
    
    webkit glue
    webkit port之上,还有一层glue,顾名思义就是chromium对webkit的抽象接口层,目的是将chromium和webkit解耦,最重要的一点是数据类型的解耦。这样做的好处是,webkit内部的变化都不会影响到chromium对其的调用。
 
    chromium是怎么做的?来仔细研究这篇官方文档:How Chromium Displays Web Pages
    第一个图:
 
chromium  ⑤
 
  
  首先最底层是webkit及其port,提供核心引擎;其上紧接着就是glue层;这两层已经将webkit封装完毕。
 
Renderer和Renderer host两层构成chromium的“多进程嵌入层”,从图中看两层之间就是进程边界,可见其主要作用就是在进程间代理传递消息和命令。WebContents是一个内容层,对于chromium来说,一个html页面首先要被解释成content(src/content),然后由上层的Browser输出到窗口成为最终的视图。
 
简单来说,Renderer通过多进程架构,将webkit解释html的结果转为content,再输出显示视图。层次结构最重要的特点是底层的模块从不依赖和访问上层模块(DEPS rules)。关于content层更详细的信息参考:Content module,还是用图来帮助理解:
chromium  ⑤
    对于外部浏览器应用程序来说,有两个API可以直接调用:webkit API和content API。chromium设计content API的目的一是封装content内部负责的逻辑,二是划清browser和content的层次概念。content API的接口定义在src/content/public。关于content API的理解还可以参考这篇文章:理解WebKit和Chromium: Content API和CEF3,其中提到的CEF是个不错的开源,其致力于将chromium独立封装,使浏览器程序能方便地嵌入调用:chromiumembedded
 
    在此框架下,webkit的port尽量做到跨平台支持,比较重要的port设计:
    1,多进程的网络访问系统,与渲染进程分离;(后面具体研究chromium的进程和线程体系)
    2,图形系统采用了为Android系统开发的跨平台的skia库。
 
    关于Renderer部分,我们在后面研究chromium多进程架构时讨论。
 
    在网上找到一个chromium和webkit的类关系图,可以好好研究一下,引用自类图:WebKit WebCore到Chrome Browser
chromium  ⑤
    了解了chromium对webkit封装的框架层次,对后面理解chromium的多进程架构至关重要!
分享: