日期:2014-05-16 浏览次数:20726 次
? ??对于android的开发者来说,最初学习android的时候一定有一个疑问,就是android和java到底有什么不同,这个问题不是今天讨论的范围,咱们暂且不表。待逐渐深入,尤其是了解了android的内核后会有另外一个疑问,它的内核跟linux有什么区别?
?
Greg Kroah-Hartman用最简单的话这样总结“它只用了kernel,别的东西没用”,这句话的意思是,跟传统linux相比,android只有系统底层结构是一样的,其他东西都不一样,尤其是程序员的编程接口。因此,现存的Linux程序无法移植到android上去。所以,从某种意义上说,Android是一种全新的系统。恐怕这也是2010年,Android 代码被从 Linux kernel 代码库中删除的原因之一,而且是很重要的原因。
?
上面所说的这个区别,也就是《Android系统源代码情景分析》试读章节中所提到的android对硬件支持划分为两层,在具体说之前,我们先来看看它是如何划分的。
? ? ? ? ? ? ? ? ? ? ?
<!--[endif]-->
图中的HAL就是android特有的硬件抽象层,简单说,它就是对linux驱动程序的封装,向上提供接口,屏蔽底层的实现细节。也就是说,把其对硬件的支持分为User Space(用户空间)和Kernel Space(内核空间)两层,其中硬件抽象层运行在用户空间,内核驱动程序运行在内核空间。
?
那么为什么要这么安排?整合起来都放在内核空间里不行么?从技术实现当然没问题,毕竟linux就是这样的。但是android不是linux,他需要有自己商业化的一部分。我们都知道,linux内核源代码是要遵循GPL的。其在发布时,必须要公开源代码。那么如果你是硬件商,想要你的硬件能在kernel下运作,就必须要有驱动,如果你将驱动程序放在内核空间里开源,那么就跟公开你的所有硬件配置一样了,所有厂商都不愿意这么做。所以android实现的等方式是把大部分的商业秘密都放到硬件抽象层里,不进行公开,而在内核驱动层只提供简单的访问逻辑和接口。
?
尽管存在着如此的争议,但是android解决了长期令手机制造商头痛不已的问题:业界缺乏一个开源的Java虚拟机,以及统一的应用程序接口。现在,程序员只要写一次程序,就能在各种手机硬件平台之上使用。对于android内核,我也只了解了一点点,也希望能通读《Android系统源代码情景分析》,了解更多更深的内容。