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里根本没法用。