安卓开源还是封闭之我见

来源:互联网 发布:西门子plc解密软件 编辑:程序博客网 时间:2024/04/28 08:33
进入正题前先声明,本人非苹果粉,更非谷歌粉,写这篇文章只是为了从一个理性的角度总结一下。

Android是一款时下热门的流行的同时不得不说又是保守争议的手机操作系统,在这篇文章里,我们主要简单阐述以下几点问题:
1、Android一词的含义
2、Android诞生的背景
3、Android的系统架构
4、Android与JAVA的关系
5、Android开源还是封闭

Android一词的含义:

Android是Google公司的推出的一款手机操作系统的名称,同时也是相关手机业务的总称。更准确的来讲,Android是Google公司推出的一个适用于移动终端的软件平台,也可以说是一套完整的软件解决方案。

这里有两点需要注意:
第一,Android针对的是广泛的移动终端,就目前来说主要是平板电脑和手机甚至是智能MP4,所以如果仅仅是从某一个方面来说Android是一款手机操作系统。
第二,Android是一个平台,因为Android不仅仅意味着驱动移动硬件设备的操作系统,还包括了各种第三方库、建立在Android操作系统基础之上的应用程序、应用商店以及市场和业务,所以说Android提供了一套关于移动设备的完整的软件解决方案。

另外,android这个英文单词的本意是机器人,这也是为什么Android的logo是一个机器人的模样了。

Android诞生的相关背景:
Android操作系统早期由本名为Android的一家手机软件公司开发,2005年Google收购了这家公司,并继续对Android操作系统进行开发运营。Google的这一收购行为可以说是自身进军移动平台领域的重大举措。同时,这一收购得到了Motorola公司的大力支持,在Android后来的发展中,Motorola公司付出了很多。直至2010年,Motorola公司已经放弃对其他所有手机操作系统的支持转而只支持Android。而最近,Google和Motorola Mobile宣布,两家公司已经达成一致协议,Google将以40美元现金每股的价格收购Motorola Mobile。

这里不得不提的是OHA(Open Handset Alliance),也就是开放手机联盟,这一联盟是由Google和几十个手机相关企业建立的,用于推广Android。联盟成员包括Motorola、HTC、SAMSUNG、LG、Intel、NVIDIA、SiRF、Skype、KUPA Map、MTK以及中国移动在内的34家技术和无线应用的领军企业。其实可以说这个联盟也是用来在无线通信领域对抗Nokia(Symbian)、Apple(iPhone)甚至是RIM(Blackberry)的。

Android的系统架构

如图所示,Android平台采用了软件堆(Software Stack)的形式,而这里不再详细讨论这种堆式分层架构的好处,如果了解OSI模型便能很好的理解这种分层的思想。

大体上可以把整个Android软件堆划分为三个大层,即操作系统、中间件以及应用程序。其中中间件又可以分为两层,下面一层是有Libraries与Android Runtime组成,上面一层是图示的Application Framework。下面我们简单由下至上介绍一下图示的各个层。

首先注意到,所谓真正的操作系统,实际上就是Linux Kernel这一层,Android是基于Linux 2.6提供核心系统服务的,包括安全、内存管理、进程管理、网络堆栈、驱动模型等等。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。

其次是Libraries层,主要是C/C++库的集合,供Android系统的各个组件使用,其功能向上通过Application Framework层暴露给开发者。

然后,Android Runtime部分的Core Library是指一些核心的Java类,比如android.*,java.*,javax.*,junit.*等等等等,与标准的Java SDK类有所差异。而DVM(Dalvik Virtual Machine)是类似于JVM(Java Virtual Machine)的虚拟机,不过这两个虚拟机有着一些本质上的差异,比如说JVM都是基于栈的,而DVM则是基于寄存器,在此并不详述,只作了解。在这个架构图示中,Android Runtime与Libraries层的关系有点与众不同,并不是严格的上下两层,我们将在稍后的部分进一步解释。

Application Framework上面已经提到过,Libraries层得库就是通过这一层封装并暴露功能性的API给开发者。

而最后剩下的Application层就是各种各样的应用程序了。而Android装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置,也就是所谓的机子内置的程序了。所有的应用包括内置的都是用JAVA语言编写的。



Android与JAVA的关系

上面关于Android的系统构架我们只是简单地介绍了各层以及它们之间的关系,所以在说Android与JAVA的关系前,有几点概念我们需要补充一下:
首先Android架构图中蓝色的部分都是JAVA语言编写的,黄色的部分是指DVM虚拟机,绿色部分是指C/C++编写的,而红色部分的操作系统是C语言编写的。
其次是关于虚拟机的概念,这里的虚拟机DVM是用来解释执行JAVA语言编写的东西,而实际上虚拟机本身我们并不知道是什么编写的,因为DVM是Google公司自己编写的虚拟机,是不开源的。但是我们需要知道的是虚拟机依赖于底层操作系统,而它本身有可能是C/C++/汇编或者是几者混合编写的。

前面提到Libraries层通过Application Frmaework层暴露给开发者,换言之,Libraries的东西是Application层无法直接调用的,需要通过Application Framework来使用。但是Application Framework实际上是Java实现的规范,也就是说实际真正在执行上Applicaion Framework的东西都要拿到DVM这里来编译执行,并且调用一些Libraries层的东西,而已经提过DVM是依赖于最底层Linux操作系统的,这也是为什么Android Runtime部分与Libraries层之间的图示关系并不是严格的上下层,至此前面遗留的小小问题算是得到了解释。

补充完毕,我们继续Android与JAVA关系的话题。很多朋友总在说Android的东西都是用JAVA开发,因此必须要懂JAVA,不然没有办法进行Android的相关开发,这种说法显然是错误的。
因为就广义的Android开发而言,当然包括了架构图中各个层的开发,显然直观上除去Application与Application Framework的开发,都是和JAVA没有什么关系的。

这里要多说一句就是很多人认为Android的JAVA和IBM/Sun的JAVA没什么关系,这也是不无道理的。到目前为止我们已经很清楚了Android的软件堆结构。所以我们会猛然发现除了Core Library里面的java.*,javax.*等等东西是正统的JAVA以外,其他的一切都是Google自己定义的包括虚拟机,所以,说Android里的东西只是形似JAVA语法和JAVA差不多而与传统意义上的J2EE没有任何关系是很有道理的。

其次就Application即应用开发来说,虽然Google提供的Android SDK是JAVA的(因为Application Framework是Google已经编写好的),我们也还是可以结合其他语言的方式来进行开发。引用文章《Android NDK带来什么》里的话就是
“其实,Android平台从诞生起,就已经支持C、C++开发。众所周知,Android的SDK基于Java实现,这意味着基于Android SDK进行开发的第三方应用都必须使用Java语言。但这并不等同于“第三方应用只能使用Java”。在Android SDK首次发布时,Google就宣称其虚拟机Dalvik支持JNI编程方式,也就是第三方应用完全可以通过JNI调用自己的C动态库,即在Android平台上,“Java+C”的编程方式是一直都可以实现的。”
至于具体NDK是什么,感兴趣的朋友可以去阅读这篇文章,这里不再赘述。

Android开源还是封闭
有了前面四个问题的铺垫,这部分的阐述就变得容易多了。Android的整个软件堆中,DVM是不开源的这一点毫无疑问,而我们所谓的开源与封闭的探讨问题主要是针对于最底层的操作系统。
首先,引述台湾网志MMDAYS的一段话:
“Linux kernel 的版权是 GPL。
这下问题来了:如果你是硬件厂商,希望你的硬件能在 Linux kernel下运作,那么就必须要有驱动程序。如果驱动程序的程序代码公开,等于硬件规格也公开的差不多了。许多厂商不愿意这么做,所以就提供编好的驱动程序,但不提供原始码。
Android 的重点就是商业应用,Google采用了一些手法来绕过这问题。他们把驱动程序移到 "userspace",也就是说,把驱动程序变成在 Linux kernel上头跑,而不是一起跑的东西,这样就可以避过GPL。然后,在 kernel这边开个小门,让本来不能直接控制到硬件的 "userspace" 程序也可以碰得到,这样只要把"开个小门"的程序代码公布就行啦。”
简单来讲,传统上的操作系统一般都会分kernel space和user space,前者用来跑操作系统最核心的东西并且内存空间得到严格保障,而后者跑一些和用户应用相关的东西而内存空间没有严格保障,这里的kernel space就是指Linux kernel,本来应该涵盖了操作系统最核心的东西包括硬件驱动程序。

而Linux kernel是遵循GPL的,也就是遵循了开源一种许可证,意味着源码的修改更新都必须发布出来,也就是所谓的开源。当然,也就意味着硬件驱动程序的源码也必须公开。

然而硬件驱动程序的源码实际上与硬件规格息息相关,如果硬件驱动源码公开了,那么硬件细节几乎就没有秘密可言了,先不谈各种山寨的问题,从商业竞争上来说,硬件设备商是绝对不同意的。

所以Google采取的办法就是把硬件驱动这部分内容移到了user space,并且在Linux kernel里来调用user space里的这些硬件驱动。这样由于硬件驱动不属于Linux kernel,也就不需要遵循GPL,也就不必开源,开源的只是Linux kernel里“开的那个小门”,就是调用user space的那部分代码。而Google也将一些关键功能移到了user space,从而避开了开源。但Linux kernel的东西又的的确确的是遵循GPL,是开源的。也可以说是Google将Linux kernel里的关键东西提取出来单独写了一层,然后把Linux kernel与这单独的一层联系起来,从而避开了开源的协议而又使核心的功能没有得到任何损失。


而正是由于这种改变,导致Android与正统的Linux kernel开源社区发生了很多的矛盾与冲突,从而被Linux内核除名,意味着不承认Android是Linux的一个子版本。具体的一些细节这里就不再废话了。


另外Android也是有很多版本的,针对平板电脑的系列也就是代号为Honeycomb的操作系统,Google已经宣布暂时不开源了,给出的理由是“因为Honeycomb是专门针对平板操作系统开发的,所以他们还没有做好准备把代码公布,以免第三方开发者会把Honeycomb移植到非平板设备上,比如手机。”对此,作者在表示感到有点莫名其妙的同时并不发表意见,大家可以去查阅相关资料。当然了,Google也做出了一定的解释,暂时不开源与封闭完全是不搭边的事情,可以比较肯定的是,不管这个暂时是多久,Honeycomb还会重新迎来开源的时候,Google表示其自身一直是旨在推进开放移动平台的发展。


到这里,我们已经很明白Android的开源与封闭与否是一个相对的问题,我们可以从不同的角度去寻找开源或者封闭的理由,所以是不能简单地讲Android就是完全开源的或者Android就是完全封闭的,这也许也是将来的一个发展趋势。而从某种意义上说,Google目前对于Android的开源力度和措施也是值得认可的。既保证了商家的利益,也使得不同厂家可以定制属于自己Android。这和iOS只能跑在苹果自己的机器上,和Symbian是有天壤之别的。

这里的系统定制和系统权限当然又是牛马不相及的两个话题,系统权限是指应用程序能做什么不能做什么。显然前面也已经提到,对Android应用开发者而言开放了所有的API包括核心应用程序所使用的部分。应用程序也可以轻而易举地获取Root权限。苹果方面的情况想必我就不用在果粉面前废话了。而苹果越狱是和开机签名验证相关的问题,又是另外的话题了。

诚然,这个事情也告诉我们想问题永远不要太极端,那样会显得很愚蠢。


因为本文只是大概阐述一些概念,细节上并没有准确而全面的展开,所以感兴趣的朋友,我推荐阅读更多的相关文章:
阮一峰的《Android,开源还是封闭》,当然个人认为比较有GPL情结。
针对上面这篇的评论《关于 Linux “踢出” Android》
分析问题比较全面的《大家要全面的理性的看待 Linux “踢出” Android!》

本人第一次写CSDN博文,欢迎指正。