fmddlmyy的专栏
本文将基于Linux内核的智能手机应用处理器软件简称作Linux手机软件。
1 概述
1.1 为什么要选择Linux平台?
简单说:选择Linux平台的好处就是资金投入少;因为基本上不需要授权费,产品的软件成本也比较低。选择Linux平台的不利之处也是很明显的:
需要很大的研发投入。
北京的一家公司有30多人的研发队伍用QT做智能手机,做了快两年,还没有上市。QT是Linux平台上的一种商用图形用户界面(GUI)开发包,也有GPL版本。深圳一家公司用Linux+GTK做智能手机,完成度比较高了,但还没有推向市场。GTK是与QT齐名的GUI开发包,GTK是以LGPL发布的自由软件。虽然产品没有上市可能有多方面的考虑,但将Linux手机做到产品化的难度也可见一斑。
Linux手机没有统一的应用软件开发平台
Windows Mobile和Symbian都是一家公司主导的,有统一、开放的应用软件开发平台。有很多公司、个人为它们开发应用软件。但是Linux手机没有统一的应用软件开发平台,因此没有大量的第三方应用。这可能是Linux手机最难克服的缺点了。因为这个缺点是Linux作为开源软件所固有的。尽管不少公司或联盟都想统一Linux平台,但至少目前还没有明显的效果。而且统一的Linux应用平台,即使是开源的,似乎也不符合Linux的自由精神。这是自由和集中、开源和商业的一个很难调和的矛盾。
从2007年开始出现的OpenMoko、Android、GPE Phone Edition等开源Linux手机方案开放了自己的参考设计,在一定程度上降低Linux手机软件的研发难度。但这些方案本身还存在各种问题。即使有比较成熟的参考设计,也需要资深工程师才有应用、定制这些方案的能力。即使作出样机,没有充分的测试,也不敢投入量产。
Linux手机没有品牌优势
Linux手机没有统一的品牌,在品牌优势上远低于Windows Mobile或Nokia主导的Symbian,在市场竞争中处于不利态势。
1.2 开源软件的许可证
Linux方案能够降低软件成本的主要原因就是使用了包括Linux内核在内的大量开源软件。 开源软件总是按照某个软件许可证发布的,必须遵守开源软件的许可证,才能合法地使用开源软件。有很多种开源软件许可证。最常见的许可证就是GPL和LGPL。许可证有不同的版本。例如Linux内核使用的许可证就是GPLv2。
GPL和LGPL都是GNU组织开发的许可证,可以见:http://www.gnu.org/licenses/licenses.html。GNU是倡导自由软件的非盈利组织,GNU组织为世界提供了大量优秀的自由软件。GPL代表The GNU General Public License。LGPL代表The GNU Lesser General Public License。尽管这些文本有中文翻译,但法律上生效的还是英文文本。
1.2.1 GPL
我们可以自由地运行GPL软件,例如使用gcc编译器编译商用软件。但如果我们在自己的程序中引用了GPL软件(不管是静态链接还是动态链接),并发布这个程序,我们就必须给获得该程序的人提供相同的权利,通常是也按GPL发布。指责GPL的人根据这个特性将GPL称作病毒。
Linux内核是以GPL许可证发布的。不过,Linus Torvalds(Linux的原作者)在GPL许可证前加了说明:它规定在内核上执行的应用程序不受GPL的制约。所以在Linux上运行的应用软件可以是私有的。但是如果我们修改了Linux内核,就必须以GPL发布修改过的内核。例如Google的Android平台需要修改内核,它在发布二进制映像时就必须发布所修改内核的源代码。当然,Google发布的内核代码只是基于模拟器(QEMU)的内核版本,没有什么参考价值。
关于Linux上的驱动程序模块(需要装载到内核运行)是否要遵守GPL,以前有争议,现在的说法是只要该模块仅使用公开的内核接口,就可以不按照GPL发布。一般而言,GPL不适合于商业软件。除非厂家在用GPL发布软件的同时还能找到盈利模式。确实有不少公司做到了,软件不收费,但服务是收费的。
1.2.2 LGPL
LGPL比GPL友好。我们可以在自己的程序不加修改地引用LGPL程序,只要保留版权声明,还可以将该程序作为私有软件发布。但如果我们修改并引用LGPL程序,我们就不能按照私有软件发布程序,必须遵守LGPL的规定。
除了GPL、LGPL外,常用的许可证还有BSD、MIT、Apache许可证。例如:Google的Android使用Apache许可证。BSD、MIT、Apache许可证都是对商业应用友好的许可证。
1.3 Linux手机软件开发要做什么?
Linux手机软件开发要做的事情主要包括:
根据硬件平台移植、调试引导程序。例如:u-boot、vivi等。
内核移植。选择合适的内核,在自己的硬件平台上跑起来。开发各种外设的驱动程序。
选择GUI开发包,选择组件通信包,选择其它需要的开源软件包,搭建应用软件开发框架。
基于应用软件开发框架开发应用程序。除手机界面之外,至少还要开发与基带处理器通信的程序,也就是AP端的AT命令程序。
开发的输出是引导区映像、内核映像、包含完整手机应用软件的根文件系统。手机软件方案还要包括系统升级方案和应用程序更新方案。手机软件通常包含软件包管理功能,例如OpenMoko就使用了iPKG软件包管理器(http://handhelds.org/moin/moin.cgi/Ipkg),可以从手机的图形界面更新应用程序。图1是一个应用软件开发平台的例子:
图1 GNOME Mobile平台
这是基于GTK的方案,组件通信选择了D-Bus。上图也列出了一些最常用的开源软件包。事实上,在手机软件的发布版本中可能要使用几十个开源软件包。其中GUI开发包的选择是一个很关键的选择,因为GUI开发包的选择会影响大部分其它组件的选择。
Android的做法比较特殊,它没有使用Linux平台的GUI开发包。Android系统中包含一个Java虚拟机,它的GUI开发包、应用开发框架(framework)都用java语言实现,然后由Java虚拟机解释运行。下面还会讨论。
1.3.1 GUI开发包的选择
Linux平台的GUI开发包主要有QT和GTK两个主流产品。KDE是基于QT开发的PC窗口系统,GNOME是基于GTK开发的PC窗口系统。很多Linux发行版的窗口系统都是在KDE或GNOME基础上开发的。图1的GNOME Mobile是GNOME项目组计划开发的移动应用开发平台,目标是规范基于GTK的移动应用开发,这个项目目前还没有完成。
QT是使用广泛的跨平台GUI开发包。QT的嵌入式版本主要有两个部分:Qtopia Core(原来叫QT/Embedded)和Qtopia。Qtopia Phone Edition是在Qtopia和Qtopia Core基础上定制的手机版本。图2是Qtopia Phone Edition的架构。QCop是该平台的组件通信方式,类似于KDE平台的DCop。
图2 Qtopia Phone Edition架构
Qtopia Phone Edition原来是商业软件,从4.3版本开始发布开源软件,使用GPL许可证。从上图可以看到,Qtopia Phone Edition的完成度也不高,从Qtopia Phone Edition出发到完成一个商用手机还需要做大量的工作,例如选择基于QT的浏览器、邮件、即时通讯程序等。
GTK和QT有两个明显的区别:
QT完全采用面向对象方式设计,提供C++开发接口。而且QT对C++的语法进行了扩充,有自己的元对象系统。在QT中,对象通信(进程内通信)所采用的信号/槽机制、运行时类型信息、动态属性等功能都是C++语法不支持的,必须先用QT的moc工具处理成正常的C++源文件,再用C++编译器编译。GTK提供C接口。
GTK采用LGPL许可证,比Qtopia更友好。QT是由商业公司,挪威的Trolltech(奇趣)维护的(http://trolltech.com/products/qtopia)。GTK是由开源组织(http://www.gtk.org/)维护的。
最近,Nokia宣布要收购Trolltech公司,QT的未来有较多未知因素。目前的开源手机方案通常选择GTK。
国内还有一个叫作minigui(http://www.minigui.com/index.php?id=home&L=1)的GUI开发包。原来是开源软件,现在是一家叫作飞漫软件的公司在推广。他们有手机开发平台、浏览器、手写输入的方案,当然都是收费的,也没有GPL版本。minigui目前的应用主要是一些需要简单图形界面的工业控制设备。据飞漫介绍:大唐有一款TD-SCDMA样机采用了ThreadX操作系统和minigui。
从前面的讨论可以看到:Linux手机软件开发尽管可以使用大量开源程序,但要做出手机产品还有很大的工作量。每家公司做一套手机开发平台,各平台的应用程序也不兼容。不少公司和组织通过各种行动以求统一Linux手机开发平台,让第三方应用程序有较好的兼容性。虽然目前还没有什么统一的平台,但确实有一些开源的Linux手机方案。
2 参考设计
前几年网上没有什么开源手机方案,有一些PDA的开源方案,其中比较著名的是Familiar项目(http://familiar.handhelds.org/),这个项目是用Linux实现PDA的操作系统。Familiar项目的目标平台是惠普的iPAQ系列掌上电脑。基于Familiar项目,有两个主要的GUI项目:基于GTK的GPE(http://gpe.handhelds.org/)和基于Qtopia的Opie(http://opie.handhelds.org/cgi-bin/moin.cgi/)。GPE和Opie都是独立的项目,可以应用到使用Linux的其它嵌入式平台。
最近一两年,不断有组织和个人提出“统一”的Linux手机平台方案,主要有:LiMo、OpenMoko、LiPS、Android。下面会分别讨论。此外,还有一些公司有商用Linux手机开发平台:例如前面提到的Trolltech公司的Qtopia。爱可信(ACCESS)的ALP(ACCESS Linux Platform,http://www.access-company.com/products/linux/alp.html)平台。
2.1 平台简介
2.1.1 LiMo
LiMo(http://www.limofoundation.org/)是 Linux + Mobile 的简写。这是一个产业联盟。他们可能会发布一个应用软件平台,不过现在还没有发布任何东西。LiMo的发起会员是:美国摩托罗拉,日本NEC,日本NTT DoCoMo,日本松下移动通信,韩国三星电子,英国沃达丰。
图3 LiMo的方案架构(左边是大框架,右边要细化一些)
图3是LiMo的系统框架。LiMo把开发工作分配给各个成员,图4是他们的工作分配图。
图4 LiMo的开发工作分工
可以看到LiMo计划采用GTK和D-Bus。
2.1.2 OpenMoko
OpenMoko(http://www.openmoko.org/)是台湾大众电脑(First International Computer,FIC) 发起的开源手机项目。网上有一篇关于OepnMoko的详细介绍,可以见http://gb-www.digitimes.com.tw/gate/gb/tech.digitimes.com.tw/ShowNews.aspx?zCatId=A2O&zNotesDocId=0000079427_A6OLFT3HUX3IY4B646C0Z。
图6 OpenMoko的系统架构
图6是OpenMoko的系统架构。其中Finger application指用手指控制的应用程序,Stylus application指用笔控制的应用程序。图7列出了OpenMoko使用的开源组件以及组件间的依赖关系。
图7 OpenMoko使用的开源组件及组件的依赖关系
OpenMoko的GUI选择了GTK,组件通信选择了D-Bus。在OpenMoko平台中,应用框架(包括libmokocore、libmokoui、libmokopim、libmokonet)、应用程序部分是OpenMoko组织开发的,其它部分使用开源软件。
OpenMoko是目前最开放的开源手机方案。OpenMoko项目还作了样机。第一版样机Neo1973是为开发者做的,可以从网络(https://direct.openmoko.com/)购买。第二版样机Neo FreeRunner计划在3月份投入量产,这版样机是针对最终消费者的。OpenMoko已于2007年10月23日成立公司(我本墨客股份有限公司),研发总部在台北的内湖科学园区。
OpenMoko的软件虽然很接近产品,但还不算成熟。目前存在有时漏接电话,有时打不出去的问题。估计这应该是AT命令部分的问题(gsmd模块)。Trolltech 公司的Lorn Potter 将Qtopia 4.3.1移植到OpenMoko机器上,可以正常运行,通话功能也比较稳定。
除了前面提到的代码(暂时)还不成熟,OpenMoko还有以下缺点:
文档太少。当然这也是开源软件的一个特点。开源软件的开发者通常比较少,他们更愿意把时间花在代码上而不是文档。因为代码发展很快,即使有文档,也很难与代码同步。
OpenMoko把主要精力放在了整机软硬件设计上,对统一的API接口没有给予充分的重视。这一点与LiPS、Android、Nokia的Maemo等有很大区别。其实开源手机方案应该将统一应用软件开发平台作为一个主要目标。虽然很难实现,但Linux手机确实需要一个统一的应用软件开发平台。即使是三国鼎立,也比诸子百家要好。
2.1.3 LiPS
LiPS(http://www.lipsforum.org/)代表Linux Phone Standards Forum。LiPS论坛是法国电信主导的一个行业联盟,目前有33个成员。LiPS论坛的目标也是规范Linux手机软件的开发,它的思路是制定Linux电话终端标准。目前在法国电信北京研发中心任职的黄思源是LiSP论坛的发起者,他在自己的Blog上介绍了论坛的来由(http://blog.sina.com.cn/s/blog_4a09ed6f01000420.html)。
图8 LiPS的任务
如图8所示,LiPS的目标就是指定一套开放、统一的Linux手机API,上图中橘黄色部分就是LiPS希望规范的部分。LiPS把这部分中间件称作LiPS Services Sets。LiPS Services Sets的架构如图9所示:
图9 LiPS的Services Set
其实就我看来,LiPS以标准规范Linux手机的想法是很难成功的。一个优秀的、开放的参考设计比文档更能吸引人,更有可能成为事实标准。不过,LiPS的文档写得不错,如果既有规范的文档,又有开放、完善的参考设计,就更容易胜出。
LiPS确实有一个参考设计,叫作GPE Phone Edition(http://gpephone.linuxtogo.org/),记作G(PE)²。但G(PE)²的设计目标不是一个完整的产品,它只提供符合LiPS的部分参考设计。所以,G(PE)²的完成度要低于OpenMoko。图10是G(PE)²的架构:
图10 GPE Phone Edition的架构
G(PE)²的GUI开发包用的也是GTK,组件通信用D-Bus。G(PE)²项目的公开资料更新较慢。
2.1.4 Android
Android(http://code.google.com/android/)是OHA(Open Handset Alliance)组织发布的一个手机软件栈,包括操作系统、中间件和主要的应用。OHA是Google主导的一个行业联盟。图11是Android的架构。
图11 Android的架构
前面也介绍过,Android的一个重要特点就是它的应用框架和GUI库都用Java语言实现。Android内部有一个叫作Dalvik的Java虚拟机,Java程序由这个虚拟机解释运行。Android平台的应用程序也必须用Java语言开发。网上有评论说Android的虚拟机使用Apache的Harmony类库。Harmony类库是Apache组织开发的开源Java类库,用Apache许可证发布。
Android应用框架采用了Mash-up的组件模型:组件(Activity)向系统注册自己的功能,每个组件要使用其它组件的服务时提出自己的要求(intent),系统根据intent在已登记的组件中确定合适的组件。Android平台的API文档很完善。在我看来,基于Android平台开发应用软件应该是一件轻松、愉快的事情。但是,选择Android平台存在以下问题:
Google目前只开放了SDK,即应用软件的开发接口,没有开放中间件的源代码。
在没有源代码的情况下,也可以把Android移植到兼容的开发板(CPU核采用ARMv5指令集)上,但因为不能定制而无法将其用于实际产品。Google现在没有明确什么时候发布中间件的源代码。其实Google也没有明确说过将发布中间件的源代码。
Google说Android是“the first complete, open, and free mobile platform”。在英文中“free”既可以解释成“自由”,也可以解释成“免费”。如何解释完全在于Google。我觉得Google最想抓住的是应用软件的开发者,即希望公司和个人都学习它的SDK,为它的平台开发应用软件。Google肯定会和厂家合作,开发支持Android平台的手机。但Google是否会在网络上完全开放中间件代码,还是个未知数。
如果Google完全开放这个平台,那么与J2ME类似,各公司肯定会在这个平台上添加自己的扩展,使各平台不能完全兼容。所以,Google很可能用商业手段来保证Android平台的一致性。
Android的设计很漂亮,但是否实用还有待实践检验。
Android使用Java既可以利用Java的平台无关性,又可以降低应用软件的开发难度。但无论怎么优化,Java程序的速度是肯定不如原生代码的。Google的Mash-up的思想虽然不算新颖,但在嵌入式环境中投入实用,也是一个新的尝试。设计总有取舍,Google的选择是否合理,还需要实践检验。
2.1.5 其它平台
除了上述平台,还有一些移动应用开发平台。
2.1.5.1 Nokia的Maemo
Maemo(http://maemo.org/intro/)是Nokia推出的基于Linux的移动应用开发平台。目前用于Nokia的N800、N810等终端设备。N800、N810不是手机,它们被称作互联网设备(Internet Tablet)。不过相信Nokia随时可以将Maemo方案用于手机。目前没有做只是出于商业考虑。
图12 使用Maemo的N810和Maemo平台架构
Maemo也提供了完善的SDK、详尽的文档,组织了Maemo社区,以图吸引个人和公司为Maemo平台开发应用软件。Hildon是Nokia为Maemo平台设计的应用框架。Maemo的浏览器是在Mozilla基础上开发的嵌入式版本,做得比较完善。这是一个开源项目(http://browser.garage.maemo.org/)。
2.1.5.2 Poky
Poky(http://www.pokylinux.org/)是基于OpenEmbedded的一个Linux编译、发布和开发环境,原来是OpenedHand组织内部用来做设备软件开发、配置、调试和性能分析的工具。Poky环境包含了一个实验性的项目Sato,Sato是一个基于GTK+/Macthbox的PDA/智能手机的UI方案。
图13 Poky包含的Sato是一个试验性的PDA/智能手机的UI方案
Poky的blinky版本包含了Sato 0.1版。Sato还处于开发的早期阶段。Poky是采用MIT许可证的开源软件,对商业应用友好。
没有评论:
发表评论