chromium的更新真是够疯狂的,一不小心开发版本就到16了。今天在看chromium源码时,无意中看到有关android的代码了,看来chromium android版本离我们不远了。
首先是build下多了install-build-deps-android.sh脚本,这个脚本是用来安装android SDK r13和android ndk r6b。难道不考虑android3.2以下版本?
build下还有一个all_android.gyp文件,里面只有一个target: android_builder_tests.
build下android文件夹只有一个文件envsetup.sh,在编译android版本前必须执行该脚本设置环境变量。
看了看源码树,只有base和net目录下有少量的android平台代码。
从现存的代码来看,似乎android移植才开了个头,不过最近有媒体爆料说即将发布的android 4.0中即将包含chromium浏览器。莫非chromium也会学习android,只进行有限的开放。
chromium浏览器融合了众多开源软件,自身拥有一套复杂的framework。如果一头扎进chromium的代码,首先需要了解chrome的多进程模型、sandbox原理,这对理解webkit移植带来很大的难度。好在chromium中包含了一个测试程序test_shell,用来验证webkit chromium移植工作。test_shell代码位于:src/webkit/tools/test_shell下,test_shell具备浏览器的雏形,有前进/后退/刷新/停止/输入网址等功能,如果仅仅是做一个简单嵌入式的浏览器,使用这部分的代码就足够了。从test_shell入手,更有助于分析webkit chromium移植。
test_shell运行界面如下:
linux版本的绘制过程
下面的图描述了linux下gtk/skia/cairo之间的关系
简单说,页面绘制过程就是先由Webkit渲染到skia的canvas上,然后在bitblt到Cairo surface上,最后到X server后端。
在webkit的chromium移植中,有一个重要的类:WebView(在Qt/android等移植中也有这样一个类),它运用了Facade设计模式,封装了webkit内部复杂的接口,对外提供一个一致/简单的接口,浏览器UI主要和这个WebView打交道。下面看看这个WebView是如何创建的?trace信息如下:
#0 WebKit::WebView::create (client=0x7ffff7f50000) at third_party/WebKit/Source/WebKit/chromium/src/WebViewImpl.cpp:235
#1 0x00000000004387c0 in WebViewHost::Create (parent_view=0x7fffed278830, delegate=0x7ffff7f50000, dev_tools_client=0×0, prefs=…)
at webkit/tools/test_shell/webview_host_gtk.cc:30
#2 0x000000000042c576 in TestShell::Initialize (this=0x7ffff7e74f20, starting_url=…) at webkit/tools/test_shell/test_shell_gtk.cc:349
#3 0x00000000004245b1 in TestShell::CreateNewWindow (starting_url=…, result=0x7fffffffdc20) at webkit/tools/test_shell/test_shell.cc:203
#4 0x0000000000421e61 in main (argc=1, argv=0x7fffffffdfe8) at webkit/tools/test_shell/test_shell_main.cc:303
UML序列图如下:
Webkit chromium port中,图形后端是采用的skia,在SkCanvas上排版渲染,但最终呈现给用户的却是一个GtkFixed widget。skia canvas中的图像又是如何显示到GtkFixed widget上的呢?答案就在WebWidgetHost::Paint()方法中:
1)根据webkit排版的高度和宽度创建PlatformCanvas
2)webview将内容渲染到canvas
3)BitBlt到GtkFixed的gdk window上
这样webkit就将排版后的内容在gtk窗口中显示出来了。