1.2 开源还是不开源的问题
本节将简单谈一谈开源和不开源的问题。我们都知道Android是基于Linux的,因为Linux是开源的,Android也号称开源,所以一经推出后就受到了广大程序员和手机厂商的青睐。但是本节的题目为什么是“开源还是不开源的问题”呢?这需要从Android的发展历史谈起。
1.2.1 雾里看花的开源
在Android刚被推出的时候,只能用Java语言开发应用程序,这就需要所有的应用程序都运行在一个巨大的虚拟机上。2009年6月,Android发布了NDK工具包,这样就可以支持C/C++语言编程,但是性能不如SKD工具包中的Java语言。
2010年2月,在开源界发生了一件大事。Linux Kernel的维护者Greg Kroah-Hartman宣布,将Android代码从Linux Kernel代码库中删除。此事对于普通用户可能并没有什么影响,但对于开发者来说,尤其是对于开源社区的开发者来说,算是一颗重磅炸弹。消息公布以后,外界普遍觉得惊讶和可惜。好不容易才有了一个如此受欢迎的开源手机系统,应该齐心协力、共同开发才对,为什么要“窝里斗”呢?到底是什么矛盾,使得Linux Kernel小组剔除Android代码呢?
从Linux 2.6.33版本开始,Google智能手机操作系统Android核心代码全部被删除。这是因为提倡开源的Android在Linux面前使用了雾里看花的把戏,它修改了Kernel内核,但是又不提供修改的细节,这相当于自己搞了一个封闭的系统。尽管Android取得了空前的成功,但是Google也放弃了构建一个真正开源的手机系统的机会,从而不能获得由全世界程序员提供智慧、分享代码和推动创新的好处。由此可见,是因为Android不真正开源,所以才被从Linux体系中删除。
Android与Ubuntu、Debian、Red Hat等传统的Linux发行版相比,只有系统的底层结构是一样的,而其他东西在Android中都不一样,尤其是程序员的编程接口是完全不同的。所以必须重新写Android应用程序后才能使用,现存的Linux程序无法移植上去。由此可见,Android是一种全新的系统,它与Linux距离很远。
1.2.2 从为什么选择Java谈为什么不开源驱动程序
1.Java的好处
Android很好地解决了长期令手机制造商头痛不已的问题:在业界缺乏一个开源的Java虚拟机和统一的应用程序接口。使用Android后,程序员只要编写一次程序就可以用在各种手机硬件平台之上。这就是Android应用程序使用Java语言开发的原因,因为如果不这样做,就无法让程序实现和硬件无关。
可能很多熟知Linux的读者会反问:传统的Linux系统也不依赖特定的硬件,只要把源代码根据不同的平台分别编译,同一个程序就可以在不同的硬件架构、不同的Linux发行版中使用。那么Android只采用Kernel、只允许用Java编程的真正原因到底是什么呢?
2.为什么驱动不开源
Linux Kernel的版权是GPL。在此版本下,硬件厂商都希望自己的硬件能在Linux Kernel下运行,此时就必须使用驱动程序。但是如果把驱动程序的源代码公开,就等于公开硬件规格,这是广大硬件厂商所不能接受的。所以硬件厂商只提供编好的驱动程序,而不提供原始代码。
Android的重点是商业应用,为了解决上述驱动开源的问题,Google采用了自己的方法来绕过这个问题。Google把驱动程序移到“userspace”中,即让驱动程序在Linux Kernel上面运行,而不是一起运行,这样就可以避过GPL规则。然后在Kernel上开一个小门,让本来不能直接控制到硬件的“userspace”程序也可以碰得到,此时只需公布这个开的“小门”程序源代码即可。由此可见,Google在Kernel和应用程序之间设计了一个中间层,这样既不违反GPL许可,又能不让外界看到厂商的硬件驱动和应用程序的源代码。
3.带来的问题
但是Google的上述做法随之带来了一个问题,Kernel和Android采取不同的许可证,Kernel采用GPL许可证,而Android采用Apache Software License(简称ASL)许可证。在GPL许可证中规定,对源代码的任何修改都必须开源,所以Android需要开源,因为它修改了Kernel。而在ASL许可证中规定,用户可以随意使用源代码而不必开源,所以建立在Android之上的硬件驱动和应用程序都可以保持封闭。这种封闭得到了更多硬件厂商的支持,Google特意修改了Kernel,使得原本应该包括在Kernel中的某些功能都被转移到“userspace”中,所以就避开了开源。
4.影响
Google的上述行为有利于推广Android,并且可以吸引更多厂商和软件开发商的加入,但是同时也宣布放弃了构建一个真正开源的手机系统的机会。所有为Android写的硬件驱动都不能合并到Kernel中,因为它们只在Google的代码里才有效,而在Kernel里根本没法用。
1.2.3 对驱动开发者来说是一把双刃剑
正因为所有为Android写的硬件驱动都不能合并到Kernel中,这些驱动程序只能在Google代码中有效,而在Kernel中根本没法用,所以Google从不向Kernel提交大量的硬件驱动程序和平台源代码。
硬件厂商都不开源驱动代码,为生存在Android底层的开发人员,特别是从事驱动开发的成员,带来了巨大的就业机会。开发人员可以为硬件厂商开发不开源的驱动程序从而获得报酬。随着Android的异常火爆,市面上有很多企业在招聘Android驱动开发人员。由此可见,驱动的不开源既为我们的学习带来了难题,也为就业机会增加了砝码,是一把双刃剑!