http://blog.csdn.net/hou_jiong/archive/2009/01/18/3831022.aspx#_Toc218056043
目 录
WebKit 的前身是 KDE 小组的 KHTML。Apple将 KHTML 发扬光大,推出了装备 KHTML 改进型的 WebKit 引擎的浏览器 Safari,获得了非常好的反响。
WebKit 内核在手机上的应用十分广泛,例如 Google 的手机 Gphone、 Apple 的iPhone, Nokia’s Series 60 browser 等所使用的 Browser 内核引擎,都是基于 WebKit。
现在浏览器的内核引擎,基本上是三分天下:
Trident: IE 以Trident 作为内核引擎。
Gecko: Firefox 是基于 Gecko 开发。
WebKit: Safari, Google Chrome 基于 Webkit 开发。
WebKit支持功能:
HTML4.0/5.0
CSS1&2
Dom1&2
ECMA262
JS1-6
HTTP/FILE
GIF/JPEG/PNG
XML
SSL3
JVM
FTP
SVG可缩放矢量图形(Scalable Vector Graphics)
RSS2.0(RDF Site Summary )
浏览器的选型:
1。Geocko 功能强,但太庞大
2。Opera 功能强,但要钱
3。Ipanel 功能一般,也要钱
4。Ants 功能一般,还是要钱
5。WebKit 功能强,不要钱,呵呵就这个(有nokia,apple,google为例), 它属于 LGPL and BSD licenses.
二.Webkit编译详解
1.依赖库及介绍
libicu-dev
ICU是一个成熟,广泛使用的一套为C / C + +和Java库提供Unicode的全球化支持软件。ICU广泛的应用在便携式设备上,并给出相同的结果在所有平台之间的C / C + +和Java软件。
libxslt-dev
XSLT的英文标准名称为eXtensible Stylesheet Language Transformation。根据W3C的规范说明书(http://www.w3.org/TR/xslt),最早设计XSLT的用意是帮助XML文档(document)转换为其它文档。但是随着发展,XSLT已不仅仅用于将XML转换为HTML或其它文本格式,更全面的定义应该是: XSLT是一种用来转换XML文档结构的语言。
libcurl-dev
cURL是一个利用URL语法的文件传输工具,是基于libcurl的前端命令行工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。 它同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
libsqlite3-dev
SQLite 是实现了SQL 92标准的一个大子集的嵌入式数据库.其以在一个库中组合了数据库引擎和接口,能将所有数据存储于单个文件中而著名.功能一定程度上居于MySQL 和PostgreSQL之间.尽管如此,在性能上面,SQLite常常快2-3倍 (甚至更多).这利益于其高度调整了的内部架构,因为它除去了服务器端到客户端和客户端到服务器端的通信.
libjpeg62-dev
libjpeg 软件包包含 jpeg 库. 这些库使图形文件在联合图象专家组的标准上压缩. 它是一种"有损耗"的压缩算法.
libpng12-dev
libpng 软件包包含 libpng 库.这些库被其他程序用于读写png文件
gperf
'gperf'是一个用C++编写的完美的hash函数生成器.它通过一个完美的hash函数F转换一个含有N元素的用户特定关键字集合到集合W. F唯一映射关键字到W的0..K范围,其中K>=N如果K=N那么F就是最小化的完美hash函数.'gperf'生成一个0..K元素的静态查
找表和一对C函数.这些函数决定一个给定的字符串S是否在集合W中,通过只多一次的查找.
'gperf'普遍用于为多个商业编译器,研究型编译器,语言处理工具的词法分析器生成一个关键字识别器.这些编译器包括GNU C, GNU C++, GNU Pascal, GNU Modula 3,和GNU indent.完整的'gperf'C++源代码可以通过匿名ftp`ics.uci.edu' 和 `ftp.santafe.edu'得到.'gperf'已经随GNU libg++一起发布好几年了
flex
快速词法分析器发生器
Bison
GNU项目分析器
GUI
支持多种GUI,包括gtk,qt, mac, win等.linux,windows,Mac都能运行。
2.X11+Gtk+WebKit交叉编译详解
编译列表:
Name |
Version |
libpng |
1.2.10 |
pkg-config |
0.23 |
gperf |
3.0.3 |
Tiff |
3.8.2 |
libjpeg |
6b |
freetype |
2.1.10 |
libxml2 |
2.6.30 |
fontconfig |
2.4.2 |
XFree86 |
4.7.0 |
glib |
2.18.0 |
atk |
1.20.0 |
cairo |
1.2.0 |
pango |
1.20.0 |
gtk+ |
2.14.0 |
ICU |
4c-3_6 |
xslt |
1.1.22 |
curl |
7.19.2 |
sqlite |
3.5.6 |
WebKit |
r29711 |
The cross source:
export ARCH=arm
export CC= iwmmxt_le-gcc
export CXX=iwmmxt_le-gcc
export BUILD_ROOT=/uplatform
export PATH=/opt/montavista/cee/devkit/arm/iwmmxt_le/bin/:/opt/montavista/cee/host/bin/:$BUILD_ROOT/usr/bin:$PATH
export PKG_CONFIG_PATH=$BUILD_ROOT/usr/lib/pkgconfig:$BUILD_ROOT/usr/X11R6/lib/pkgconfig
说明:CC是c的编译器选项,CXX是C++的编译器选项。BUILD_ROOT是要build的路径。PKG_CONFIG_PATH,现在大多数软件,都是通过pkg-config来检查依赖关系的,所以要把两者都加到PKG_CONFIG_PATH环境变量中
Libpng
etho ac_cv_fnuc_malloc_O_nonull=yes>> $ARCH-linux.cache
./configure --prefix=/$BUILD_ROOT/usr --host=$ARCH-linux
make &&make install
pkg-config
./configure
make &&make install
应为需要较高级的版本的pkg-config才能编译glib和gtk,如果编译机上的版本够高就不需要在升级pkg-config了
Gperf
./configure
make &&make install
企业版的/usr/bin下有,可以直接使用,如果没有需要编译一个
Tiff
./configure --prefix=/$BUILD_ROOT/usr --host=$ARCH-linux
make &&make install
字体读取文件库
Libjpeg
./configure --prefix=/$BUILD_ROOT/usr --host=$ARCH-linux
make &&make install
freetype
./configure --prefix=/$BUILD_ROOT/usr --host=$ARCH-linux
make &&make install
libxml2
./configure --prefix=/$BUILD_ROOT/usr --host=$ARCH-linux
make &&make install
fontconfig
./configure --prefix=/$BUILD_ROOT/usr --host=$ARCH-linux
make &&make install
XFree86
./configure --prefix=/$BUILD_ROOT/usr --host=$ARCH-linux
由于x11 的需求不同,在配置选项的时候要加特定的参数。所以需要知己configure –h看所需要的选项
Glib
ac_cv_type_long_long=yes
glib_cv_long_long_format=ll
glib_cv_stack_grows=no
glib_cv_uscore=no
ac_cv_func_posix_getpwuid_r=yes
./configure --host=arm-linux --prefix=$BUILD_ROOT/usr
make &&make install
以上选项加入到configure里再configure,应为我们arm上裁剪的是2.4内核,所以有些是不支持的,需要屏蔽
Atk
export CFLAGS="`pkg-config --cflags glib-2.0` -I$BUILD_ROOT/usr/include"
export LDFLAGS="-L$BUILD_ROOT/usr/lib,-rpath=$BUILD_ROOT/usr/lib"
./configure --host=arm-linux --prefix=$BUILD_ROOT/usr
make &&make install
因为atk是依赖glib的,所以需要指定glib
Cairo
Export CFLAGS="-I$BUILD_ROOT/usr/include -I$BUILD_ROOT/usr/X11R6/include"
Export LDFLAGS="-L$BUILD_ROOT/usr/lib -L$BUILD_ROOT/usr/X11R6/lib -lXft -lfreetype -lfontconfig -lXrender -lexpat -lXext -lX11"
./configure --host=arm-linux --disable-nls --with-x --prefix=$BUILD_ROOT/usr --x-includes=$BUILD_ROOT/usr/X11R6/include --x-libraries=$BUILD_ROOT/usr/X11R6/lib
make &&make install
由于我们编译的是1.2.0所有不需要编译pixman
Pango
export
FREETYPE_CONFIG=$BUILD_ROOT/usr/bin/freetype-config
Export
LDFLAGS="-L$BUILD_ROOT/usr/lib -Wl,-rpath=$BUILD_ROOT/usr/lib"
export
CFLAGS="`pkg-config --cflags glib-2.0 cairo` -I$BUILD_ROOT/usr/include/freetype2"
./configure --host=arm-linux --disable-nls --with-x --prefix=$BUILD_ROOT/usr --x-includes=$BUILD_ROOT/usr/X11R6/include --x-libraries=$BUILD_ROOT/usr/X11R6/lib
make &&make install
因为pango依赖GLib, freetype,cairo,x11,所以要指明其连接
gtk+
首先屏蔽config.h里面的
HAVE_XFIXES 0
HAVE_CUPS_API_1_2
再configure
CFLAGS="`pkg-config --cflags pango pangoft2 pangocairo` -I$BUILD_ROOT/usr/include -I$BUILD_ROOT/usr/include/freetype2 -I$BUILD_ROOT/usr/X11R6/include/"
LDFLAGS="`pkg-config --libs pango pangoft2 pangocairo` -L$BUILD_ROOT/usr/lib -lintl -L$BUILD_ROOT/usr/X11R6/lib -lXft -lfreetype -lfontconfig -lXrender -lexpat -lXext -lX11" CC=iwmmxt_le-gcc
./configure --disable-cups --disable-nls --enable-xim=no --disable-xim-inst --with-xinput=no
make &&make install
ICU
./configure --enable-static --enable-shared --host=arm-linux --prefix=$BUILD_ROOT/usr/
Xslt
./configure --host=arm-linux --with-x --prefix=$BUILD_ROOT/usr --x-includes=$BUILD_ROOT/usr/X11R6/include --x-libraries=$BUILD_ROOT/usr/X11R6/lib
Curl
ac_cv_file___dev_urandom_=yes
./configure --host=arm-linux --prefix=$BUILD_ROOT/usr/ -without-ssl --without-ca-path --without-ca-bundle
在configure文件里加ac_cv_file___dev_urandom_=yes,再configure
Sqlite
./configure --host=arm-linux --prefix=$BUILD_ROOT/usr
make &&make install
WebKit
首先执行
sh autogen.sh
执行autogen脚本,会生成configure,再执行configure
CFLAGS=-I$BUILD_ROOT/usr/include LDFLAGS=-L$BUILD_ROOT/usr/lib ./configure --prefix=$BUILD_ROOT/usr --host=$ARCH-linux CFLAGS=-I$BUILD_ROOT/usr/include CPPFLAGS=-I$BUILD_ROOT/usr/include icu_config=$BUILD_ROOT/usr/
3.编译出错Q&A:
Q:在configure中报找不到某个库,或某个库的版本太低。
A:1确认是否有该库,版本是否太低。如果没有请编译该库
2有该库文件,证明没有正确的连接到在CFLAGS和LDFLAGS两个环境变量中指明连接的头文件和库。
3只明了路径为什么还不行?有些要通过pkg-config读取.pc文件的形式才能正确。
Q:在configure中什么找不到,或一些莫名奇妙的错误。
A:直接打开configure文件,找到报错的地方,找到其判断语句并将起屏蔽。如2.4的内核不支持stack_grows,在编译glib的时候就要加glib_cv_stack_grows=no,让其屏蔽过去。
Q:在make的时候包语法错误
A:找到该文件,直接修改其语法错误。应为是开源软件,有语法错误很正常。
Q:在make的时候出现找不到某库文件
A:直接在Makefile的LDFLAGS加其库连接选项,如果本来就不要该库就直接删除。
Q:在make的时候找不到某函数。
A:在config.h里屏蔽其函数对应的宏。一般来宏来控制某个编译选项,有些函数是通过宏来判断是否执行的。
Q:其他问题
1.体系结构
WebKit上层组织应用
WebCore
¨Page与外框相关的内容(Frame,Page,History,Focus,Window)
¨Loader加载资源及Cache
¨HTML-DOM HTML内容及解析
¨DOM- DOM CORE内容
¨XML- XML内容及解析
¨Render-排版功能
¨CSS-DOM CSS内容
¨Binding-DOM与JavascriptCore绑定的功能
¨Editing-所有与编辑相关的功能
JavascriptCore-javascript引擎
¨API-基本javascript功能
¨Binding与其它功能绑定的功能,如:DOM,C,JNI
¨DerviedSource自动产生的代码
¨ForwordHeads头文件,无实际意义
¨PCRE-Perl-Compatible Regular Expressions
¨KJS-Javascript Kernel
¨WTF-KDE的C++模板库
Unicode unicode 库
Tools tools库
CURL-url 客户端传输库
PlatForm- 与平台相关的功能,如图形图像,字体,Unicode, IO,输入法等.
2.解析流程
1. CURL获得网站的stream
2. 解析划分字符串
3. 通过Dom Builder按合法的html规范生成Dom树
4. 如果有javascript,JSEngine就通过ECMA-262标准完善Dom树
5. 把Dom传给LayoutEngine,进行布局,如果有CSS样式,就通过CSSParser解析。
6. 最后Rendering out出来
3.浏览器系统结构
浏览器系统结构图分为四层
第一层为业务应用层,用户可在webkit基础上构建各种应用。
第二层为插件及第三方库。
第三层为webkit平台Porting所需的接口层。
第四层为平台和操作系统支持层,提供webkit平台所需的软硬件资源。
四.各种浏览器比较分析
1.网页浏览器列表
引擎 |
网页浏览器 |
||
Trident |
Internet Explorer,傲游,世界之窗浏览器,Avant,腾讯TT, Netscape,NetCaptor,Sleipnir,GOSURF,GreenBrowser,KKman |
||
Gecko |
Fennec,Firefox,网景(6至9), SeaMonkey,Camino,Flock, Galeon,K-Meleon,Minimo,Mozilla,Sleipnir,Songbird , XeroBank |
||
KHTML或WebKit框架 |
Safari,Konqueror,Epiphany,Google Chrome,iCab,OmniWeb,Midori,Shiira |
||
Presto |
Opera,任天堂DS浏览器 |
||
Java |
HotJava,Opera Mini,UCWEB |
||
Tasman |
Internet Explorer for Mac,MSN for Mac OS X |
||
文字界面 |
|