# 新时代新潮流WebOS 【3】关于手机OS的疯话

- 作者：邓侃
- 发布时间：2009-03-04 10:26
- 分类：公司
- 原文：https://www.ifanr.com/16878

Kernel是OS的核心，Android没有自力更生开发自己的Kernel，而是借用了Liinux作为Kernel。但是很多技术文献仍然用Android OS这个词，把Android视为一套OS。

有趣的是，Google的官方定义是，“The Android platform is a software stack for mobile devices including an operating system, middleware and key applications”。注意，Google视Android为一个平台，支撑这个平台的，是层层叠叠一摞软件砖头，其中包括OS，但是 Android本身不是OS。

如果platforrm与OS，仅仅是名称的差别，自然无关痛痒，但是如果事情涉及到手机软件体系，就值得仔细审视一番。

关于这个问题，我请教了W兄，以下文字是基于俩人的讨论，加上我个人的进一步发挥而成。其中不仅掺杂着强烈的个人偏见，而且弥漫着不知天高地厚的狂妄。对此有不良生理反应者，请及时回避。持批评意见者，恳请畅所欲言大力斧正。

假惺惺的免责声明结束，下面开始说疯话。疯话分五个部分，

1\. 基于Linux Kernel，Android的额外贡献有哪些？  
2\. 为什么Android需要Dalvik？  
3\. 为什么Dalvik不遵循J2ME规范，不参与Java Community Process（JCP）？  
4\. JVM，Dalvik与CLI/.NET，谁更可能最终胜出？  
5\. Android是platform，还是OS？![File](https://s3.ifanr.com/wp-content/uploads/2010/08/File_thumb1.jpg "File")

Figure 1. Android architecture  
Courtesy http://purefire.bokee.com/inc/android.jpg

基于Linux Kernel，Android的额外贡献有哪些？主要是两条，

1\. 梳理了Linux Kernel，尤其是统一了中间件（Middleware）。

Linux 是开源项目，开源项目的优点是集思广益，但是优点同时也是缺点，缺点是七嘴八舌。功能相似的模块，不仅版本多，而且APIs也不统一。所以有一些企业致力于把无序变为有序，在众多版本中筛选出性能最好的版本，统一APIs，然后把各个不同功能的模块整合成完整的系统。譬如Redhat和Ubuntu，它们主要致力于梳理供PC和Server使用的Linux。

但是在嵌入式领域，各种版本的Linux模块还处在混战之中。Google Android充当了嵌入式Linux领域Redhat和Ubuntu的角色。Android的成就之一，是梳理了Linux Kernel。图一中的最低层Linux Kernel，显示的是Android的梳理结果。

梳理这个工作表面上看起来是力气活，没有太多技术含量。这个观点是错误的，实际上，如果没有雄厚的技术实力，没有长期积累的业界声望，是不敢担当这份重任的。

Android 不仅梳理了Linux Kernel，更重要的是梳理了MiddleWare，其成就显示在图一中倒数第二层“Libraries”。之所以说MiddleWare的梳理工作更重要，是因为这里的局面更混乱。譬如2D/3D图像处理，多媒体，安全控制，嵌入式数据库等等，都是潜在的利润回报很丰厚的功能模块，所以竞争也非常激烈。

Android的成就不仅在于筛选，而且也体现在优化。譬如说libc，老生常谈的东西，有哪段稍微复杂一点的C程序离得开libc 呢？GNU版本的libc大概是400K左右，而Android对libc做了大规模精简，最后结果只有200K，Android把精简后的libc称为 bionic。尺寸缩小是一方面，另一方面是提高了运行速度，尤其体现在pthread的处理上。

梳理和优化的工作，既耗时又费 力，Google Android大方地把自己的成果一揽子公开，一方面深得人心，扮演着圣骑士的角色（paladin），另一方面，如果能把嵌入式Linux Kernel和MiddleWare掌控在自己手里，从长远来看，Google就成为嵌入式Linux的庄家，到那时，其它公司想挑战Google的地位就难了。

2\. Dalvik虚拟机。

图一中的倒数第二层，靠右边的方框中，显示的是Android Runtime，包括Dalvik虚拟机和Core library两部分。有人说，Dalvik是Java虚拟机，这是不正确的。的确，从使用者角度看，Dalvik的语言和Java高度一致，但是形式相同并不等于实现方式相同。又有人说，Dalvik是把Java语言，通过JNI，翻译成C/C++语言的翻译器。这种说法也不准确。

“Inside Java Virtual Machine”（http://www.amazon.com/Inside-Java-Virtual-Machine-Venners/dp /0071350934）是一本介绍Java虚拟机内部实现的书，书写得深入浅出，非常值得一读。花几个星期读此书，你会惊艳于Java和JVM设计之精巧。如此精巧的系统，还有没有改进的余地？Dalvik是一个成功的尝试。Google Android的Dan Bornstein有一个演讲，介绍了Dalvik内部的实现原理。

【video】Dalvik Virtual Machine internal，by Dan Bornstein，Google I/O conference，2008  
Courtesy http://www.youtube.com/watch?v=ptjedOZEXPM

Dalvik和Java虚拟机的区别在哪里？主要是两条，

a. Dalvik的bytecode是.dex，而JVM的是.class。两者的区别在于.dex比.class更紧凑。同样一段Java源代码，分别编译成.class和.dex bytecodes，很多情况，.dex的尺寸比对应的.class小25%以上。  
b. 对比Dalvik执行.dex和JVM执行.class的效率，Dalvik占用的CPU时间以及内存空间比JVM更少。至于快到什么地步少到什么地步，目前还没有广为接受的benchmark对比结果。据传，Dalvik比JVM快5-6倍。

有人戏言，在计算机领域想出人头地，有个投机取巧的捷径，要么做大，要么做小。Google的云计算平台走的是“做大”的路线，让百万台机器同时工作，相互协调。Google的Android走的是“做小”的路线。大和小两个极端中，能在一端做出突出成就，已经出人头地，而Google两头冒尖，不服不行。
