作者 | 邓凡平
责编 | 屠敏
缘起
前几天,CSDN 曾发过一篇有关
鸿蒙 OS
的文章,我觉得它是最近讨论自主开发 OS 的文章里很中肯的一篇了。我曾经在 2012 年介绍过 Android OS 的情况,现在来看依然不过时。作为一个技术人,我们探讨某个东西的前景的时候总该对它有一些了解。本篇就是一篇非常简单的对 Android OS 的介绍。在 Android 刚起步的那几年(2011 年前及左右),我们同时下注了 Android、Intel 联合几个厂商开发的 Meego、还有基于 Linux 的嵌入式 OS。彼时,中移动的 OMS 也很火,甚至 OMS 带出了一个叫播思的公司。播思里边有非常多的人才,其中很多人来自中国手机界的黄埔军校——摩托罗拉。从这个角度看,Android OS 在早期也是看不准,没人觉得它一定会成。
Android 最终还是成功了,我个人感觉这个不全是技术的因素,但有几个关键因素还是和技术有关:
以前 CSDN《程序员》杂志里有一位投稿作者,他的个人介绍中,有一句很有意思——要为 Linux 摇旗呐喊。所以,Android 之所以成功,就在于太多人为它摇旗呐喊了。软硬件开发、搞培训.....真是人心齐泰山移!
Android 彻底占据市场之后,基于 H5 的 OS 又来了一波小高潮。
2013-2014 年左右有个 Firefox OS,还在国外装了不少机器。FireFox OS 是全兼容 Android 的。所谓的兼容,就是原来归属 Android OS 的功能都保留,然后再对 H5 的 App 提供了一些功能扩展而已。
相比 Android,给 Firefox OS 摇旗呐喊的人就少多了。而且还要兼容 Android OS——那么,每次 Android OS 更新,Firefox 都要去适配,更改。这工作量就非常非常大了。最后 Firefox OS 就消亡了。
以上是历史情况——它说明了一个事实:没有哪个 OS 天生就是赢家,形势是变化的。另外,我们很多人要感谢 Android,可以亲历一个 OS 从零到如此强大的过程,时间跨度非常短,七八年就搞起来了。
现在开始我们关于对 Android OS 的一些科普性介绍。
整体视频
由 PPT 转换而来的视频:
上面视频里介绍了四个部分,分别是:
每个部分都不长。大家可以先看下面的内容,等整体看完后,再来看上面的 PPT 视频。
Android 系统架构——垂直角度来看
下图是 Android OS 的整体架构。99.999% 搞 Android 的人都知道:
从垂直角度来看,Android OS 分为四个层次(这是我的划分,别家的说法大同小异,其中有些内容比较老了,比如 Dalvik 虚拟机已经换成了 ART,但不影响我们对这个架构的认识):
上述四个层次中,Kernel 历史最悠久,到今天就剩下大概 Windows,Linux、macOS 三个巨头了(Unix 和 Linux、macOS 有亲缘关系,在消费类电子产品中见得少,所以不讨论 Unix):
以上唯有 Linux 不归某个公司独有。所以,Android 使用 Linux 是必然的选择。如果我们要搞国产自主 OS 的话,最大可能性也是基于 Linux,比如现在的优麒麟,以前的红旗都是这样。
这并非技术牛不牛的问题,而是 Linux Kernel 可看做是全人类共有的软件财富。遵守它的要求,不要搞独立王国,一起用好它即可。再说,Linux Kernel 发展了几十年下来,很多国人(包括国内很多公司)为它做出过许多大大小小甚至卓越的贡献。俗话说,前人栽好树,后人好乘凉。如果从头到尾,从上到下都要“自主”,那么我们也要为计算机编程语言的使用而担忧了。
继续我们的讨论。
Android Framework——没有层次关系
大部人眼里,Android OS 的架构都是上面那样的垂直关系——这个认识没有错,但是并不完全准确。如果我们以功能模块为单位来观察其中的 Android Framework(Native Framework 和 Java Framework 的统称)的话,你会得到大概下面这样的图:
以功能为单位来观察 Android Framework 的话:
通过这一节,你知道了:
知道上面这些东西有什么用呢?接着看。
Android OS 是微内核的 OS
关于内核,一直有微内核和宏内核之分。使用微内核的有 Windows 和Mac、使用宏内核的是 Linux。那么,什么微内核,什么是宏内核?下图简单解释了微内核:
我简单描述下微内核和宏内核的差异(点到即止,非技术严格):
了解微内核和宏内核的差异后,我们再来看 Android。如果我们认为 Android 是一个 OS 的话(后面会讲为什么可以将 Android 看成是一个 OS),它是微内核还是宏内核呢?接着看下图:
上面这个图展示了 Android 四个层级间的交互:
结合我们上文提到的,Android Framework 中的功能模块并非都挤在一个进程里,而是分散在不同进程中,功能模块之间通过进程间通信的手段交互。所以,从应用的角度看,Android OS 肯定是一个微内核。
现在,我们再看看为什么可以把 Android 称之为一个 OS——这个问题的答案其实在上面已经隐含得回答过了,就是上面说的那句话“正是基于 Android Framework,才使得 Android 上的应用如此与众不同。”
是的,Android 之所以可以说自己是个 OS,在于它新搞了一套应用开发及交互规则。
关于这个规则,下面举两个非常简单的例子。一个是启动应用时,源 Activity 和 Android Framework 的交互过程:
对于这个图,我并不是让大家去了解具体交互的细节。一看这个图,你就发现这玩意为 Android 独有。
当然,在 Android 中你也可以做一个不遵守这样的应用程序。比如手机中的开机动画,就是 Linux 应用程序——程序名叫 bootanimation,它就没有什么四大组件,也不需要 Manifest,纯纯得一个播放动画/图片的 Linux 程序。
我曾经在 2010 年左右实践过直接使用 libskia 来做 UI 控件相关的应用—— Android 中的那些控件其内部就是使用 libskia 为二维图形库(3 维绘制则使用 OpenGLES)。libskia 也就是现在的 Flutter 底层绘制引擎。
我当时想法很简单,就是想对一些使用 Android 系统的非手机设备(用在场景比较简单的设备上,比如刷卡买个汽水之类的。那个时候,这些设备的性能都非常简陋,跑不动全套 Android,必须裁剪),完全可以使用自定义的基于 libskia 图像库的控件来画 UI。因为大部分情况下,只要把 UI 画出来就好,剩下的调用驱动就行了。什么四大组件,统统都不需要。
拜 Flutter 所赐,libSkia 现在有一些知名度了,但它的价值依然被大部分人低估。目前我知道还没有哪本专业书籍是介绍这个的。车载系统(对时延要求很高,使用全套 Android 对速度影响很大,往往需要裁减)或者哪个公司想搞 OS,开发一套二维绘制引擎非常关键——说白了,应用开发中很大部分比例都是 UI。我记得还有好几个 Linux 发行版让界面看起来和 Windows 一样。BTW、3D 绘制引擎反而不用在意,因为太难,怕各家瞎搞,所以早就有 OpenGL 标准.....
接着来看另外一个例子——播放视音频:
Android 上,一个应用要播放视音频的话,依赖 MediaPlayerService、SurfaceFlinger、AudioFlinger、硬件编解码模块等。这套东西也不是 Linux 带过来的,而是 Android 搞出来的。
我记得以前在 Windows 上做播放器的时候,应用程序需要自己加上编解码和播放的功能,使用 DirectX。这就是每个应用的独家秘籍,谁家支持得格式多,谁就厉害了。
放到 Android 上来,编解码,播放功能均由系统提供了,应用程序再也不用操心这些东西。这无疑是一个很大的进步。
上面举了两个非常简单的例子,想必现在我们确实可以大大方方将 Android 称之为 OS 了。因为它在 Linux Kernel 之上做了大量的非同一般,独立自主的功能。说实话,对 Android 应用来说,它是不是与运行在 Linux 上都不重要,只要有 Android Framework 就足够了——早在 2011 年,我的CSDN博客文章“移植之乱谈”(
https://blog.csdn.net/Innost/article/details/6954556)中,有人把 Android Framework 整个移植到了 Windows 上。注意,并不是现在模拟器那样的使用虚拟机喔!(文章中的视频好像还可以看,大家可以看一下。)
Android 手机发布和更新的过程示意
很多人不了解 Android 手机系统发布和更新的过程,总吐槽 AOSP 新版本发布后还要过好久自己的手机才能更新到新版本。这个问题的解释见下图:
上图是 Android 手机系统的发布和更新过程,图比较久了,现在情况会好点,但大致如此:
了解上面的情况后,光从测试角度看,源码从 Google 发布到最终的手机上,测试的工作量都非常大——所以到终端消费者手里的速度会慢多了。厂商的解决办法就是在新款手机上直接使用新版系统,老款手机往往要等一段时间才会发布新版升级包。
总之,在 Android 手机世界里,谷歌、芯片厂商、终端厂商,运营商都是生态链里的关键玩家,四者互相影响。从终端厂商角度看,我觉得芯片厂商对终端厂商的影响力更关键和致命。最简单来说,高通要是不更新更好的芯片,很多手机商的产品也就停滞不前了。
对比苹果,它从芯片到 OS 都自己的,也不太拿运营商当回事。所以苹果发版和覆盖速度都相对较快,碎片化问题绝对是比 Android 低好几个数量级。当然,通信芯片是苹果的大问题,所以老有人吐槽 iPhone 的信号不好。这个问题能靠苹果自己开发通信芯片来解决吗?理论上可以,但是不现实,因为其中有很多专利问题不好搞。
国产自主 OS 的未来
再说下我对国产自主 OS 的一些看法和判断。
作者简介:邓凡平,资深 Android 技术专家,国内早期从事 Android 技术研究和开发的工程师之一。运营个人公众号「神农和朋友们的杂文集」(ID:alashennong_gh)。
目前就职于民生银行总行科技部创新技术研究院,钻研和探索物联网等新技术在金融领域中的应用。从底层的虚拟机,到中间的系统层和框架层,再到上层的各种应用,他对整个 Android 系统的源代码有非常深入的研究和理解。策划并撰写了“深入理解Android”系列图书(目前已出版 8 本),累计销量超过 10 万册,是广大 Android 工程师系统、深入了解 Android 系统源代码。