对于android的开发者来说,最初学习android的时候一定有一个疑问,就是androidjava到底有什么不同,这个问题不是今天讨论的范围,咱们暂且不表。待逐渐深入,尤其是了解了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系统源代码情景分析》,了解更多更深的内容。

更多相关文章

  1. Android内核开发:源码的版本与分支详解
  2. 深入解读Linux与Android的相互关系
  3. Android与linux的区别与联系
  4. android socket通信
  5. 深入解读Linux与Android的相互关系
  6. 经典Android系统源代码
  7. Android系统体系结构
  8. Linux和Android的区别和联系
  9. 利用BLCR加快android的启动过程

随机推荐

  1. Get list of photo galleries on Android
  2. android里的ViewGroup
  3. Android(安卓)fragment的数据绑定databin
  4. Android(安卓)程序实时监听网络变化状态
  5. Android(安卓)实现数据的列表显示
  6. Android上实现TCP&UDP的客户端和服务端
  7. android ActionBar的使用
  8. android ndk log使用demo
  9. Android系统时间
  10. android 在标题栏加上按钮