Webkit研究报告(转)
http://blog.csdn.net/hou_jiong/archive/2009/01/18/3831022.aspx
原创WebKit研究报告收藏
目录
一.Webkit介绍..3
二.Webkit编译详解..5
1.依赖库及介绍..5
2.X11+Gtk+WebKit交叉编译详解..7
3.编译出错Q&A:..12
三.WebKit分析..14
1.体系结构..14
2.解析流程..16
3.浏览器系统结构..17
四.各种浏览器比较分析..18
1.网页浏览器列表..18
2.浏览参数性能比较..20
3.浏览器使用率分析..25
4.WebKit的SWOT分析..26
五.浏览器的未来..26
1.微软的梦魇..27
2.云端技术的发展..28
3.浏览器的未来..28
一.Webkit介绍
WebKit的前身是KDE小组的KHTML。Apple将KHTML发扬光大,推出了装备KHTML改进型的WebKit引擎的浏览器Safari,获得了非常好的反响。
WebKit内核在手机上的应用十分广泛,例如Google的手机Gphone、Apple的iPhone,Nokia’sSeries60browser等所使用的Browser内核引擎,都是基于WebKit。
现在浏览器的内核引擎,基本上是三分天下:
Trident:IE以Trident作为内核引擎。
Gecko:Firefox是基于Gecko开发。
WebKit:Safari,GoogleChrome基于Webkit开发。
WebKit支持功能:
HTML4.0/5.0
CSS1&2
Dom1&2
ECMA262
JS1-6
HTTP/FILE
GIF/JPEG/PNG
XML
SSL3
JVM
FTP
SVG可缩放矢量图形(ScalableVectorGraphics)
RSS2.0(RDFSiteSummary)
浏览器的选型:
1。Geocko功能强,但太庞大
2。Opera功能强,但要钱
3。Ipanel功能一般,也要钱
4。Ants功能一般,还是要钱
5。WebKit功能强,不要钱,呵呵就这个(有nokia,apple,google为例),它属于LGPLandBSDlicenses.
二.Webkit编译详解
1.依赖库及介绍
libicu-dev
ICU是一个成熟,广泛使用的一套为C/C++和Java库提供Unicode的全球化支持软件。ICU广泛的应用在便携式设备上,并给出相同的结果在所有平台之间的C/C++和Java软件。
libxslt-dev
XSLT的英文标准名称为eXtensibleStylesheetLanguageTransformation。根据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认证,HTTPPOST方法,HTTPPUT方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道(proxytunneling),甚至它还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
libsqlite3-dev
SQLite是实现了SQL92标准的一个大子集的嵌入式数据库.其以在一个库中组合了数据库引擎和接口,能将所有数据存储于单个文件中而著名.功能一定程度上居于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'普遍用于为多个商业编译器,研究型编译器,语言处理工具的词法分析器生成一个关键字识别器.这些编译器包括GNUC,GNUC++,GNUPascal,GNUModula3,和GNUindent.完整的'gperf'C++源代码可以通过匿名ftp`ics.uci.edu'和`ftp.santafe.edu'得到.'gperf'已经随GNUlibg++一起发布好几年了
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
Thecrosssource:
exportARCH=arm
exportCC=iwmmxt_le-gcc
exportCXX=iwmmxt_le-gcc
exportBUILD_ROOT=/uplatform
exportPATH=/opt/montavista/cee/devkit/arm/iwmmxt_le/bin/:/opt/montavista/cee/host/bin/:$BUILD_ROOT/usr/bin:$PATH
exportPKG_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
ethoac_cv_fnuc_malloc_O_nonull=yes>>$ARCH-linux.cache
./configure--prefix=/$BUILD_ROOT/usr--host=$ARCH-linux
make&&makeinstall
pkg-config
./configure
make&&makeinstall
应为需要较高级的版本的pkg-config才能编译glib和gtk,如果编译机上的版本够高就不需要在升级pkg-config了
Gperf
./configure
make&&makeinstall
企业版的/usr/bin下有,可以直接使用,如果没有需要编译一个
Tiff
./configure--prefix=/$BUILD_ROOT/usr--host=$ARCH-linux
make&&makeinstall
字体读取文件库
Libjpeg
./configure--prefix=/$BUILD_ROOT/usr--host=$ARCH-linux
make&&makeinstall
freetype
./configure--prefix=/$BUILD_ROOT/usr--host=$ARCH-linux
make&&makeinstall
libxml2
./configure--prefix=/$BUILD_ROOT/usr--host=$ARCH-linux
make&&makeinstall
fontconfig
./configure--prefix=/$BUILD_ROOT/usr--host=$ARCH-linux
make&&makeinstall
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&&makeinstall
以上选项加入到configure里再configure,应为我们arm上裁剪的是2.4内核,所以有些是不支持的,需要屏蔽
Atk
exportCFLAGS="`pkg-config--cflagsglib-2.0`-I$BUILD_ROOT/usr/include"
exportLDFLAGS="-L$BUILD_ROOT/usr/lib,-rpath=$BUILD_ROOT/usr/lib"
./configure--host=arm-linux--prefix=$BUILD_ROOT/usr
make&&makeinstall
因为atk是依赖glib的,所以需要指定glib
Cairo
ExportCFLAGS="-I$BUILD_ROOT/usr/include-I$BUILD_ROOT/usr/X11R6/include"
ExportLDFLAGS="-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&&makeinstall
由于我们编译的是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--cflagsglib-2.0cairo`-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&&makeinstall
因为pango依赖GLib,freetype,cairo,x11,所以要指明其连接
gtk+
首先屏蔽config.h里面的
HAVE_XFIXES0
HAVE_CUPS_API_1_2
再configure
CFLAGS="`pkg-config--cflagspangopangoft2pangocairo`-I$BUILD_ROOT/usr/include-I$BUILD_ROOT/usr/include/freetype2-I$BUILD_ROOT/usr/X11R6/include/"
LDFLAGS="`pkg-config--libspangopangoft2pangocairo`-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&&makeinstall
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&&makeinstall
WebKit
首先执行
shautogen.sh
执行autogen脚本,会生成configure,再执行configure
CFLAGS=-I$BUILD_ROOT/usr/includeLDFLAGS=-L$BUILD_ROOT/usr/lib./configure--prefix=$BUILD_ROOT/usr--host=$ARCH-linuxCFLAGS=-I$BUILD_ROOT/usr/includeCPPFLAGS=-I$BUILD_ROOT/usr/includeicu_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:其他问题
A:请google一下。哈哈!
三.WebKit分析
1.体系结构
WebKit上层组织应用
WebCore
¨Page与外框相关的内容(Frame,Page,History,Focus,Window)
¨Loader加载资源及Cache
¨HTML-DOMHTML内容及解析
¨DOM-DOMCORE内容
¨XML-XML内容及解析
¨Render-排版功能
¨CSS-DOMCSS内容
¨Binding-DOM与JavascriptCore绑定的功能
¨Editing-所有与编辑相关的功能
JavascriptCore-javascript引擎
¨API-基本javascript功能
¨Binding与其它功能绑定的功能,如:DOM,C,JNI
¨DerviedSource自动产生的代码
¨ForwordHeads头文件,无实际意义
¨PCRE-Perl-CompatibleRegularExpressions
¨KJS-JavascriptKernel
¨WTF-KDE的C++模板库
Unicodeunicode库
Toolstools库
CURL-url客户端传输库
PlatForm-与平台相关的功能,如图形图像,字体,Unicode,IO,输入法等.
2.解析流程
1.CURL获得网站的stream
2.解析划分字符串
3.通过DomBuilder按合法的html规范生成Dom树
4.如果有javascript,JSEngine就通过ECMA-262标准完善Dom树
5.把Dom传给LayoutEngine,进行布局,如果有CSS样式,就通过CSSParser解析。
6.最后Renderingout出来
3.浏览器系统结构
浏览器系统结构图分为四层
第一层为业务应用层,用户可在webkit基础上构建各种应用。
第二层为插件及第三方库。
第三层为webkit平台Porting所需的接口层。
第四层为平台和操作系统支持层,提供webkit平台所需的软硬件资源。
四.各种浏览器比较分析
1.网页浏览器列表
引擎
网页浏览器
Trident
InternetExplorer,傲游,世界之窗浏览器,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,GoogleChrome,iCab,OmniWeb,Midori,Shiira
Presto
Opera,任天堂DS浏览器
Java
HotJava,OperaMini,UCWEB
Tasman
InternetExplorerforMac,MSNforMacOSX
文字界面
Lynx,Links,w3m
嵌入式系统
InternetExplorerMobile,Minimo,OperaMobile,PSP浏览器
其它
Amaya,Dillo,Mosaic
Trident
又称为MSHTML,是微软的视窗操作系统(Windows)搭载的网页浏览器—InternetExplorer的排版引擎的名称,它的第一个版本随着1997年10月InternetExplorer第四版释出,之后不断的加入新的技术并随着新版本的InternetExplorer释出。在最新的InternetExplorer第七版中,微软将对Trident排版引擎做了的重大的变动,除了加入新的技术之外,并增加对网页标准的支持。尽管这些变动已经在相当大的程度上落后了其它的排版引擎,如Gecko、WebCore、KHTML及Presto。
Gecko
是套开放源代码的、以C++编写的网页排版引擎。目前为Mozilla家族网页浏览器以及Netscape6以后版本浏览器所使用。这软件原本是由网景通讯公司开发的,现在则由Mozilla基金会维护。这套排版引擎提供了一个丰富的程序界面以供互联网相关的应用程式使用,例如网页浏览器、HTML编辑器、客户端/服务器等等。虽然最初的主要对象是Mozilla的衍生产品,如Netscape和MozillaFirefox,现在已有很多其他软件现在利用这个排版引擎。Gecko是跨平台的,能在MicrosoftWindows、Linux和MacOSX等主要操作系统上运行。
KHTML
KDE系统自KDE2版起,在KDE的新程式Konqueror的网页浏览器使用了KHTML引擎。该引擎以C++编程语言所写,并以LGPL授权,支援大多数网页浏览标准。由于微软的InternetExplorer的占有率相当高,不少以FrontPage制作的网页均包含只有IE才能读取的非标准语法,为了使KHTML引擎可呈现的网页达到最多,部分IE专属的语法也一并支援。KHTML拥有速度快捷的优点,但对错误语法的容忍度则比Mozilla产品所使用的Gecko引擎小。
Presto
是一个由OperaSoftware开发的浏览器排版引擎,供Opera7.0~9.60版使用。Presto取代了旧版Opera4至6版本使用的Elektra排版引擎,包括加入动态功能,例如网页或其部分可随着DOM及Script语法的事件而重新排版。Presto在推出后不断有更新版本推出,使不少错误得以修正,以及阅读Javascript效能得以最佳化。
Tasman
是微软的InternetExplorerforMac浏览器所使用的排版引擎,也是为尝试支援W3C所制定的网页标准而设计的。在Tasman推出时,一度是最切合HTML及CSS等标准的排版引擎。现时微软方面也停止为InternetExplorerforMac提供支援,但新版本的Tasman引擎仍被应用在一些微软产品上
2.浏览参数性能比较
2008年ZDnet用了7页的报告比较了世界上最流行的4个浏览器:IE,Firefox,Opera,Safari。它使用了iBench和SunSpider作性能基准测试软件。这里我们摘取其部分有用数据,进行比较。
iBench
是一款应用广泛、跨平台基准测试程序,它能够检测各种Web客户端应用网络新技术时的所表现出来的性能数据。这里的Web客户端是指任何用于从网上获取信息的硬件和软件,不论使用T1连接互联网Macintosh电脑、无线掌上设备、运行Linux接收WebTV的台式机都在其中。程序将对这些设备进行一系列测试,得出易用特性和网速对应用的影响程度。
SunSpider
一个JavaScript的基准。这个基准测试核心的JavaScript语言,并非测试DOM或其他浏览器的API的。它的目的是比较不同版本的同一浏览器,以及不同的浏览器之间的比较。是广泛使用的JavaScript的基准。
iBench5.0的XML/CSS和HTML的下载结果可以看出Safari和Firefox表现都不错,IE和Opera表现其次。
iBench5.0的JavaScript的测试性能上看,Safari,opera和Firefox都表现不错,IE明显落后。
以上为SunSpider测试出的综合指标,越小越好。明显可以看出,Firefox和Safari表现比较好,Opera其实,IE比较落后。一下是SunSpider测试个参数详细列表:
3.浏览器使用率分析
全球浏览器使用分布
日期
InternetExplorer
Firefox
Opera
Safari
Q42008
70.53%
20.35%
0.73%
6.84%
Q32008
72.22%
19.48%
0.71%
6.39%
Q22008
73.81%
18.43%
0.71%
6.14%
Q12008
75.06%
17.35%
0.67%
5.78%
Q42007
77.37%
15.84%
0.62%
5.24%
Q32007
78.85%
14.69%
0.51%
4.80%
Q22007
78.76%
14.92%
0.46%
4.66%
Q12007
79.38%
14.35%
0.50%
4.70%
Q42006
80.69%
13.50%
0.56%
4.06%
Q32006
82.88%
11.89%
0.62%
3.30%
Q22006
84.03%
10.67%
0.57%
3.25%
Q12006
85.01%
9.77%
0.53%
3.10%
Q42005
85.88%
9.00%
0.54%
2.80%
Q32005
86.74%
7.97%
0.55%
2.24%
Q22005
87.24%
8.08%
0.52%
1.89%
Q12005
89.02%
6.17%
0.49%
1.70%
Q42004
91.35%
3.66%
0.51%
1.50%
增长率:
-27.91%
229.82%
43.13%
356%
(由TheCounter.comGlobalStatistics所提供的资料)
4.WebKit的SWOT分析
优势(Strengths)
通过测试结果WebKit的性能优越是其最大的优势,再加上其开源项目。性能优越加开源这两大优势,是目前很多嵌入式产品选择他的原因。
劣势(Weaknesses)
因为开源,代码并不是最新的,都是Apple和KDE的更新产品。代码有滞后性。开发周期较长和人力投入比较大,毕竟代码量大,复杂度高。
机会(Opportunities)
随着通讯技术的发展,以后的手持设备基本都配有上网功能。但目前嵌入式设备上的浏览器还是只有竞争时期,这是一个很好的机遇。如果在做出优秀的适应嵌入式的浏览器,将能成为这一浪潮的弄潮儿。
威胁(Threats)
大蛋糕大家都想要,腾讯,google等都开始推出自己的浏览器。
嵌入式方面Opera,Access等公司都在努力扩张直接的市场,一些大公司也直接晚上WebKit推到直接的平台上,Apple,Android,NOKI等都在自己的手机上推出WebKit的浏览器,可见其竞争是非常激烈度。
五.浏览器的未来
1.微软的梦魇
基于WebKit引擎的SafariforWin已经推出,我们可以发现Safari除了推广WebKit引擎之外,实际上有着大得多的野心。
Safari,如果只是为了推广WebKit引擎的话,Win平台上已经有了Swift可用,Safari只能说是加强推广力度罢了,顶多算是让Windows用户尝尝正宗的苹果味。可我们看看Safari安装文件将近30M的夸张身材,就会意识到Apple肯定搞了小动作。打开Safari,我们很快就能发现它实现了很多非Win的UI特性:动画卷轴菜单,Mac风格的次像素字体渲染,网页对象或标签拖动时显示的半透明缩略图等等。再进入它的安装目录,一切真相大白!
原来Safari不仅引入了WebKit引擎,更是一举捆绑了CoreFoundation(OSX的系统级C语言API),CFnetwork(OSX的网络接口API),CoreGraphics(就是Quartz2D,一个矢量构图框架,OSX图形界面的基石),当然还不忘对于Bonjour更完善的应用支持。
可以这样说,如果在iTunes上Apple还有所保留的话,在Safari上它就表现得相当咄咄逼人了,它几乎把OSX一半的重要Framework都照搬到了Windows上!!!目的我想应该是再明显不过了吧。你可以想象将来的Wintel机器看起来跑的是Vista但实际上OSXAPI一个不缺吗?你可以想象将来程序员只需要使用Xcode编程就可以让程序原生运行在OSX/Linux/Windows上吗?我们说的不是Java虚拟机或者什么Sandbox,我们说的是性能无损的Objective-CBinary!
Safari下一版即将引入本地SQLite支持,不难想象iTunes也开始采用WebKit引擎并将目前是XML格式的Library转用更强大的SQLite存储,再下一步呢?CoreAnimation库取代Direct3D来支援CoverFlow?再下一步呢?CocoaUniversalforWindows?Maybe?Whynot?这种环环相扣的应用带来了巨大的压迫感。渗透,渗透,再渗透!Apple将会已浏览器为跳板,取代Windows成为真正的平台。
2.云端技术的发展
云计算(cloudcomputing),是分布式计算技术的一种,其最基本的概念,是透过网络将庞大的计算处理程序自动分拆成无数个较小的子程序,再交由多部服务器所组成的庞大系统经搜寻、计算分析之后将处理结果回传给用户。透过这项技术,网络服务提供者可以在数秒之内,达成处理数以千万计甚至亿计的信息,达到和“超级计算机”同样强大效能的网络服务。
最简单的云计算技术在网络服务中已经随处可见,例如搜寻引擎、网络信箱等,使用者只要输入简单指令即能得到大量信息。未来如手机、GPS等行动装置都可以透过云计算技术,发展出更多的应用服务。
云端储存(cloudstorage)是一种将数据保存在虚拟服务器上的数据类型,通常意义上,数据存储在第三方媒介,而非特定单一服务器上。
3.浏览器的未来
浏览器未来可望取代目前的操作平台将成为趋势。随着计算机、手机及连网装置也普及,未来终端运算都会在云端执行。目前计算机用户有9成的行为是在网络或靠着浏览器就可以完成,未来可能会再进一步提升到95%或更高。人们拥有一个强大功能的浏览器,就能满足平时工作生活的需要。在此情况下,浏览器就是未来的操作平台系统。
参考:
1.基维百科