嵌入式浏览器Konqueror/E的实现,
1 Konqueror/E概述
随着网络科技的进步,因特网与无线网络的融合将成为必然趋势。要在嵌入式设备上访问因特网,浏览器是必不可少的。目前,嵌入式浏览器已经逐渐成为高端手机和PDA的标准配置。嵌入式浏览器的另一大作用就是在网页中利用CGI(CommonGateway Interface:公用网关接口)来调用其他可执行程序。这样控制页面可以做的很美观,而且可扩展性好。
现在已经面市的嵌入式浏览器大多市商业版本的,如Opera、MS Explorer等。而Konqueror/embedded是符合GNU条款的自由软件。Konqueror/embedded是针对嵌入式Linux,由著名的桌面操作环境KDE下的浏览器Konqueror派生出来的。 Konqueror/embedded将Konqueror中关于KHTML,SSL(Security Socket Layer:安全套接层),Javascript等内容继承下来,同时简化了Konqueror中很多类的定义,剔除了原来KDElib部分,以适应在不同的嵌入式平台下能构成功移植和运行。Konqueror/embedded完整地支持HTML4(Hypertext Markup Language:超文本链接标示语言)和CSSL(Cascading Style Sheets:层叠样式表单)部分支持CSS2、 JavaScript(ECMAScript 262)、cookies、SSL、IPv6;支持和管理兼容的XBEL的书签,并且能够很好地支持中文网页浏览。而且还可以将Konqueror/embedded作为一个flashpalyer、pppdialer或文件管理器来使用。
图1 Konqueror/E运行界面
图1为Konqueror/embedded在Embedded-Linux平台上运行界面。
Konqueror/embedded作为嵌入式Linux操作系统的首选浏览器,被广泛的使用。但是由于该浏览器是自由软件,因此向具体嵌入式平台移植时存在一定的难度。本文第三部分详细的介绍了Konqueror/embedded向ARM-Linux平台上的整个移植和汉化过程,以便开发者参考和使用。
2 Konqueror/E的结构
Konqueror/embedded是由底层网络连接,图形化用户界面和处理HTML绘制的引擎-KHTML构成的。底层的通信协议实现是基于KIO /slave机制来实现的;GUI界面采用可Kparts组建技术和Qt的基本构件;而作为Konqueror/embedded的核心-KHTML则运用了文档对象模型(DOM)所提供的API接口,并在DOM树上挂接javascript引擎,CSS解析器以及渲染引擎。
Konqueror/embedded的层次结构如图2所示。
图2 Konqueror/embedded的层次结构
(1) Kparts及QT构件实现GUI
在KDE中,部件被称为part,这和MS中的OLE组件是一个概念。一个part通常包含三个部分:一个窗口、功能、以及使用该功能的用户接口。应用在浏览器项目中,part 包含了多个窗口(一个页面对应于一个 part,而一个页面有可能包含多个窗口)、part 提供的功能包括:页内、页间的跳转、重定向、窗口的创建和删除、用户的输入处理、剪切、粘贴等,同时为使用这些功能提供了菜单、工具条、状态条等用户接口。其他的应用程序可以使用该 part 把浏览器窗口嵌入自己的应用中。
为了方便地实现将现有应用作为一个控件插入到另外一个应用中去,采用了 part 对象负责管理整个应用和窗口。对于每个窗口又采取了类似 Microsoft MFC 中的 Doc-View 结构。因此在将应用嵌入到另外一个应用中的时候,只需要获得 part 中的接口和数据即可。对窗口的一切操作的响应由被嵌入应用的 part 对象来完成,而类 Doc-View 结构只简单的负责显示和保存显示数据就可以了。
Kpart 定义了一系列简单的类:part、plugin、mainwindow、part manager。其中:
a) Part:是 KDE 中的部件。为了定义一个Part,你需要提供widget,当然还有提供访问Part功能的Actions,还要有一个XML文件来描述在UI中Actions的布局。
b) Plugin:它是一小段功能程序,不通过嵌入一个Widget来实现。但是定义了应用程序用户接口对应的动作。它可以是图形的,比如弹出的对话框、拼写检查等。
c) Mainwindow:它是一个特殊的KTMainWindow,它的具有Action定义的UI是由XML文件来描述的,这样它可以通过弥合XML文件来嵌入Part对象。
d) Part manager:它是一个抽象的类,用来处理激活还是禁止 part。它只有在一个 mainwindow 中包含多个 part 的时候才有用。
由于Konqueror/embedded是基于图形库QT/E,因此也遵循了signal、slot消息机制,Konqueror/embedded作为QT/E的一个标准应用程序进行输入输出及界面消息响应。
(2)执行DOM 模块
DOM 模块对经过解析的标记进行文法检查,并把属性看作节点,按照标记的语义包含关系以及先后顺序组织成DOM树。它给HTML 文档定义了一个与平台无关的程序接口。使用该接口可以控制文档的内容、接口和样式。
在执行DOM模块的过程中,浏览器将所有从语法语义解析模块中获得标记和属性按照一定的层次结构组织成DOM 树。完成构筑DOM 树的功能后,DOM 模块会同时标记和属性以对象的形式传给绑定模块和脚本引擎模块。
(3)执行I/O 模块
浏览器加载有关的I/O文件,对HTTP等协议进行解析。语法语义解析模块的解析功能分为两部分:①对接收到的字节流进行分词,解析为关键字;②调用解析器检验关键字是否合法,若是合法的关键字,则按照规则插入到DOM 树中。
HTML 的标记(tag)和属性(attribute)统称为HTML的关键字。基本上所有HTML 4. 0 规范的标记都在此功能模块中获得支持。从I / O 模块中接收字节流并进行分词,输出标记;再对标记进行判断,如果是HTML 规范中合法的标记,则把标记看作一个节点,并组织成一棵语法树。对属性标记的解析首先在标记处理类中执行,如果解析不成功,则交由基类的属性解析器进行解析。
以上简要介绍了Konqueror/E的几个核心技术,下面结合实际详细介绍Konqueror/E的移植和汉化过程。
3 Konqueror/E的移植
3.1交叉编译工具的安装
[!–empirenews.page–]
准备文件:
当编译器运行在一个为另一系统产生可执行程序的系统上时,就会出现交叉编译。通常,程序是在一台计算机上编译,然后再分布到将要使用的其他计算机上。当主机系统(运行编译器的系统)和目标系统(产生的程序将在其上运行的系统)不兼容时,该过程就叫做交叉编译。
在本文中运用的交叉编译工具是ARM-CrossToolchain,这是专门为ARM处理器设计的交叉编译工具。该工具主要包含:交叉编译器(arm- linux-gcc),编译库(glibc),包含文件(头文件)和一些与ARM处理器相关的其他工具。这些工具都包含在cross- 2.95.3.tar.bz2压缩包文件中,这个交叉编译工具在一般开发板的软件包中都有。
值得一提的是,本文所使用的所有软件包,都能在网上免费下载到。
工具补丁主要是提供一些编译QT/E和Qtopia时需要用到的库,其中包含了uuid库,Jpeg库在Qtopia和Konqueror/E编译时将要用到。有了这些工具就可以进行交叉编译环境的建立了,如图3所示。
注意2.95.3版本的交叉编译工具只能解压到/usr/local/arm/2.95.3目录下,否则在QT/E编译时会出错。接下来如图4所示,编译和安装Jpeg库。
图4 编译和安装Jpeg库
为了之后在任何目录下面都能够使用工具链,必须要对路径进行设置。用VI编辑器打开/etc/profile文件并添加下述的路径:
PATH=/usr/local/arm/2.95.3/bin:$PATH
3.2 QT/E的编译
准备文件:
Qt 是一个跨平台的 C++ 图形用户界面库,由挪威 TrollTech 公司出品,目前包括QT/X11(基于 Framebuffer)和QT /E(Qt Embedded)。Konqueror/E就是基于QT/E图形用户界面库的,因此在编译Konqueror/E之前必须先编译QT/E。
编译QT/X11的唯一目的就是为编译QT/E提供uic(用户接口编译器),uic用来把.ui文件转成.h和.cpp文件。
如图5所示将QT/X11编译完毕生成uic拷贝到QT/E的bin目录下面。接下来编译QT/E,在编译QT/E之前先要将Qtopia的一个配置文件拷贝到QT/E中,表示QT/E的配置是按照Qtopia要求的。
cp qtopia-free-1.7.0/src/qt/qconfig-qpe.h qt-embedded-2.3.7/src/tools/
之后就可以设置环境变量,编译QT/E了。
图6所示编译QT/E完成后,在QT/E的lib目录下会生成libqte.so.2.3.7库文件。
3.3 图形界面Qtopia的编译
准备文件:
Qtopia 是基于QT/E的图形界面应用程序集,通过Qtopia真正地将图形界面展现在用户的眼前。如果说QT/E是灵魂,那么Qtopia就是肉体。而Konqueror/E在一般情况时是在Qtopia环境下运行的,所以要用到Qtopia库。也有少数情况时用不到,也就是说系统启动的时候只运行Konqueror/E。那么只要在编译Konqueror/E的时候配置稍作修改即可,本文只介绍前者。
在编译QT/E的时候已经将Qtopia的配置传递给了QT/E,因此编译Qtopia时就非常容易了:
cd qtopia-free-1.7.0/src
./configure -xplatform linux-arm-g++
make
这样在bin目录下会生成一组应用程序集,在lib目录下产生了一系列的Qtopia库,给Konqueror/E的编译做准备。
3.4 Konqueror/E的编译和安装
准备文件:
经过实践证明上面版本的Konqueror/E比较稳定,因此我们选择了该版本的源文件进行编译。
3.4.1 Konqueror/E的编译
在编译Konqueror/E之前,必须将QT/E和Qtopia的路径指定给编译器。这样编译器才能找到相应的库,从而为Konqueror/E提供相应的库文件。
图7.1 设置环境变量
如图7.1所示,先要设置一些必要的环境变量,然后再按照图7.2配置和编译Konqueror/E。当然在编译配置时,这些配置选项都是有各种含义的。有些配置选项不能搞错,不然就会编译不通过,甚至有时候连配置都不能完成。比如QT/E路径指定不对就会在配置时出错,这些都需要在实际的移植过程中才能体验到的。
图7.2 配置和编译Konqueror/E
3.4.2 Konqueror/E的安装
在Konqueror/E编译完成之后,目录下会生成相应的可执行文件。因此Konqueror/E的安装主要是指将可执行文件和一些其他的配置文件拷贝到嵌入式系统的文件系统中去就行了。一般来说,Konqueror/E运行需要五个文件,图8描绘了这五个文件的原来所在路径和安装到目标板的路径,这些都要手动去拷贝。[!–empirenews.page–]
图8 文件的原来所在路径和安装到目标板的路径
当然在目标板上运行Konqueror/E之前,必须指定几个环境变量,否则Konqueror/E会找不到库文件而终止运行。图9设置了这些环境变量,并运行Konqueror/E。
至此,Konqueror/E已经安装完毕。但是Konqueror/E缺省情况下是不支持中文网页的,而且界面是英文的。某些情况下为了满足特定的需要,这两者是非常必要的。因此在下一小节里边介绍了Konqueror/E的汉化和支持中文。
3.5 Konqueror/E的中文化
Konqueror/E的中文化可分为两个部分: 一个是Konqueror/E本身控制界面的汉化;另一个是Konqueror/E对中文网站的访问支持。和其他基于Qt 的应用程序一样, Konqueror/E中对所有用户可见的文本使用tr()将文本标识出来。这样利用Qt 提供的翻译工具将很容易把这些文本转化成所需要的语言,同时Qt 提供了两个宏:QT_ TR_NOOP ( ) 和QT_ TRANSLATE_ NOOP ( ) 。
用它们标示出文本,以便于被lupdate 工具提取。具体操作步骤如下:
(1)在需要翻译源码的XXX. pro 中加入一项: TRANSLATIONS = XXX. t s。
(2)运行lupdate XXX. pro ,生成XXX. t s 文件。该工具识别出t r () 结构和上面描述的QT_ * _NOOP 宏,产生. t s 文件(通常每种语言一个) 。
(3)运行lrelease XXX. pro 将生成XXX. qm。这是一个没有翻译成其他语言的. qm 文件(也可以用Qt Linguist生成) ,可以把它改名为XXX_en. qm。
(4)启动Qt Linguist 将XXX. t s 文件导入,将需要翻译的内容翻译成中文。翻译完成之后, 点击File →Re2lease ,将文件保存为XXX_zh. qm。
(5)翻译文件保存之后, 在程序源码中需要构建Qt ranslator 实例,利用Qt ranslator 将翻译文件加载到图形界面上。
图10 Konqueror/E的中文化
在Konqueror/ embedded 中可以通过修改main. c 中的这段代码来实现UI 的汉化:
由于QT/E是可以支持Unicode编码的,因此Konqueror/E也可以支持中文。但是在编译QT/E的缺省配置中是不支持Unicode的,因此我们要手动修改qconfig-qpe.h文件的配置:
注释掉38行,#define QT_NO_CODECS。
这样修改完毕以后,重新开始编译QT/E以及Qtopia和Konuqueror/E,Konqueror/E就能接受Unicode编码的汉字了。但是要在Konqueror页面上显示,就必须要有相应的字体,因此对Konqueror/E源代码中/konq-embed/dropin / kglobalsettings.cpp文件进行修改:
将”helvetica”改为”unifont”后重新编译Konqueror/E,这样Konqueror/E中就能显示中文字体的页面了。
4 小结
本文对嵌入式浏览器Konqueror/embedded技术核心做了简要分析,阐明了该浏览器的先进性与可扩展性,而且该浏览器是开源的符合GNU条款的自由软件。因此对Embedded-Linux下嵌入式浏览器的使用者来说,Konqueror/embedded无疑是一个最佳选择。但是在 Konqueror/embedded移植到实际使用系统中,存在一系列的问题。如果说没有移植经验的人就会觉得完全无从下手,本文除了移植 Konqueror/E以外还完成了Qtopia的移植。因为本文最终达到了在图形界面Qtopia上运行Konqueror/E。
笔者结合了实际的移植经验,详细地说明了整个移植步骤。将理论与实际结合起来,而不是纸上谈兵。因此本文对嵌入式浏览器的移植有着非常重要的实际意义,同时也希望能给浏览器开发者和使用者们带来参考价值。