全面认识 Android OS [复制链接]

2019-10-10 10:34
水刀八木 阅读:179 评论:0 赞:1
Tag:  Android

本篇就是一篇非常简单的对 Android OS 的介绍。在 Android 刚起步的那几年(2011 年前及左右),我们同时下注了 Android、Intel 联合几个厂商开发的 Meego、还有基于 Linux 的嵌入式 OS。彼时,中移动的 OMS 也很火,甚至 OMS 带出了一个叫播思的公司。播思里边有非常多的人才,其中很多人来自中国手机界的黄埔军校——摩托罗拉。从这个角度看,Android OS 在早期也是看不准,没人觉得它一定会成。

Android 最终还是成功了,我个人感觉这个不全是技术的因素,但有几个关键因素还是和技术有关:

  1. 使用 Java 作为开发语言绝对是很关键的因素之一——毕竟,迎合开发者非常重要。Java 终归是比 C++/C 要简单,容易上手。
  2. 另外,Android 底层是 Linux,这一块就把绝大部分做外设的厂商吸引过来了。它们本来就为 Linux 开发驱动或者相关模块,迁移到 Android 没太大工作量。
  3. 最后,还有关键的芯片厂商——高通的支持。如果当时只有 Intel 一家做芯片的话,Meego 保不齐还能多蹦跶几年。

以前有一位投稿作者,他的个人介绍中,有一句很有意思——要为 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 转换而来的视频:

上面视频里介绍了四个部分,分别是:

  1. Android 系统架构——垂直角度来看;
  2. Android Framework——没有层次关系;
  3. Android OS 是微内核的 OS;
  4. Android 手机发布和更新的过程示意。

每个部分都不长。大家可以先看下面的内容,等整体看完后,再来看上面的 PPT 视频。


Android 系统架构——垂直角度来看

下图是 Android OS 的整体架构。99.999% 搞 Android 的人都知道:

从垂直角度来看,Android OS 分为四个层次(这是我的划分,别家的说法大同小异,其中有些内容比较老了,比如 Dalvik 虚拟机已经换成了 ART,但不影响我们对这个架构的认识):

  • 最底层是 Linux Kernel 层。请各位开发者特别注意这一点,它再强调一万次也不为过——Android OS 的基石是 Linux Kernel。除了 Kernel 层,User Space 中围绕 Linux Kernel 相关的东西也被 Android OS 照搬了过来,比如 ueventd、wpa_supplicant 等。
  • 中间两层由下到上是 Native Framework 层和 Java Framework 层。这两个是 Android 独有的。我们统称这两层为 Android Framework
  • 最上层是应用层。正是基于 Android Framework,才使得 Android 上的应用如此与众不同——作为对比,如果写个无界面的比如 ls、find这样的程序,它们在所有基于 Linux/Unix 的系统上都是一样的运行。这样的程序我们一般认为是 Linux 应用程序——肯定不会把 ls 当做 Android 应用。

上述四个层次中,Kernel 历史最悠久,到今天就剩下大概 Windows,Linux、macOS 三个巨头了(Unix 和 Linux、macOS 有亲缘关系,在消费类电子产品中见得少,所以不讨论 Unix):

  • Windows 归微软所有,搞了几十年,参与一起玩的设备厂商,软件开发商几十万家。
  • Linux:和 Unix 有亲缘关系,开源的 Kernel,上面有好多发行版,比如 Ubuntu、CentOS 等,国产的优麒麟也是。
  • macOS:也和 Unix 有一定亲缘关系,苹果独有。参与一起玩的设备厂商,软件开发商也有几十万家。

以上唯有 Linux 不归某个公司独有。所以,Android 使用 Linux 是必然的选择。如果我们要搞国产自主 OS 的话,最大可能性也是基于 Linux,比如现在的优麒麟,以前的红旗都是这样。

这并非技术牛不牛的问题,而是 Linux Kernel 可看做是全人类共有的软件财富。遵守它的要求,不要搞独立王国,一起用好它即可。再说,Linux Kernel 发展了几十年下来,很多国人(包括国内很多公司)为它做出过许多大大小小甚至卓越的贡献。俗话说,前人栽好树,后人好乘凉。如果从头到尾,从上到下都要“自主”,那么我们也要为计算机编程语言的使用而担忧了。

继续我们的讨论。


Android Framework——没有层次关系

大部人眼里,Android OS 的架构都是上面那样的垂直关系——这个认识没有错,但是并不完全准确。如果我们以功能模块为单位来观察其中的 Android Framework(Native Framework 和 Java Framework 的统称)的话,你会得到大概下面这样的图:

全面认识 Android OS

以功能为单位来观察 Android Framework 的话:

  • Java Framework 包含几大类的服务,比如和应用中四大组件调度功能有关的组件,专门管理窗口的组件,应用程序安装有关的功能组件。还有和网络有关,蓝牙功能有关的组件等等。我在《深入理解 Android 卷2》里将它们大概分了七大类。现在的最新版本里这个类别有所增加,比如对 Android Auto(针对车载系统)里增加了几个和车载有关的功能模块。另外,请注意,上述划分纯属我个人的分类,并不存在什么标准。
  • Native Framework 也可以像这样按功能来进行划分,比如和音频相关的 AudioFlinger、AudioPolicyService 等。

通过这一节,你知道了:

  • Android Framework 里其实是有很多功能模块的。
  • 这些功能模块有可能是放在 Java Framework 里,也有可能是 Native Framework 里。
  • 更有甚者,这些功能模块可以分布在多个进程中,彼此之间,或对应用层以 Binder 方式进行进程间交互。

知道上面这些东西有什么用呢?接着看。


Android OS 是微内核的 OS

关于内核,一直有微内核宏内核之分。使用微内核的有 Windows 和Mac、使用宏内核的是 Linux。那么,什么微内核,什么是宏内核?下图简单解释了微内核:

全面认识 Android OS

我简单描述下微内核和宏内核的差异(点到即止,非技术严格):

  • 微内核就是内核只做一些基本的服务(比如操作 CPU,进程调度,内存管理、设备管理等)。然后将其它功能独立为除内核之外的多个进程。微内核最大的诟病就是其它进程和内核之间的交互属于进程间通信,开销比较大。
  • 宏内核就是把上图中的所有东西都塞到内核里。这样大家都运行在一个进程里(主要是指共享同一个内存空间——内核地址空间),如此可极大减少模块间交互的开销,但问题就是一旦有一个模块出问题,整个 kernel 都可能挂掉。

了解微内核和宏内核的差异后,我们再来看 Android。如果我们认为 Android 是一个 OS 的话(后面会讲为什么可以将 Android 看成是一个 OS),它是微内核还是宏内核呢?接着看下图:

全面认识 Android OS

上面这个图展示了 Android 四个层级间的交互:

  • Native Framework、Java Framework 均有和 Linux 交互。
  • Java Framework 中的部分模块和 Native Framework 中的部分模块有交互。
  • App 和 Java Framework 有交互。某些情况下也可以和 Native Framework 模块交互(图中并未画出相关的箭头线)。

结合我们上文提到的,Android Framework 中的功能模块并非都挤在一个进程里,而是分散在不同进程中,功能模块之间通过进程间通信的手段交互。所以,从应用的角度看,Android OS 肯定是一个微内核。

现在,我们再看看为什么可以把 Android 称之为一个 OS——这个问题的答案其实在上面已经隐含得回答过了,就是上面说的那句话“正是基于 Android Framework,才使得 Android 上的应用如此与众不同。

是的,Android 之所以可以说自己是个 OS,在于它新搞了一套应用开发及交互规则。

关于这个规则,下面举两个非常简单的例子。一个是启动应用时,源 Activity 和 Android Framework 的交互过程:

全面认识 Android OS

对于这个图,我并不是让大家去了解具体交互的细节。一看这个图,你就发现这玩意为 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 OS

Android 上,一个应用要播放视音频的话,依赖 MediaPlayerService、SurfaceFlinger、AudioFlinger、硬件编解码模块等。这套东西也不是 Linux 带过来的,而是 Android 搞出来的。

我记得以前在 Windows 上做播放器的时候,应用程序需要自己加上编解码和播放的功能,使用 DirectX。这就是每个应用的独家秘籍,谁家支持得格式多,谁就厉害了。

放到 Android 上来,编解码,播放功能均由系统提供了,应用程序再也不用操心这些东西。这无疑是一个很大的进步。

上面举了两个非常简单的例子,想必现在我们确实可以大大方方将 Android 称之为 OS 了。因为它在 Linux Kernel 之上做了大量的非同一般,独立自主的功能。说实话,对 Android 应用来说,它是不是与运行在 Linux 上都不重要,只要有 Android Framework 就足够了。


Android 手机发布和更新的过程示意

很多人不了解 Android 手机系统发布和更新的过程,总吐槽 AOSP 新版本发布后还要过好久自己的手机才能更新到新版本。这个问题的解释见下图:

全面认识 Android OS

上图是 Android 手机系统的发布和更新过程,图比较久了,现在情况会好点,但大致如此:

  • Google首先发布版本,我们称之为AOSP原生代码。AOSP原生代码只支持极少数几款手机。
  • 然后是芯片厂商在 AOSP 基础上发布自己的版本。比如高通、华为、MTK。①和②的过程有重叠,主要还是为了加快发版速度。在这个阶段,每个芯片厂商会在 AOSP 原生代码上叠加自己的功能,比如以前 AOSP 没有双卡双待功能,这些功能有一些是芯片厂商自己加的。另外,芯片厂商还要针对自己发的版本做大量稳定性测试。
  • 华米 OV 等终端厂商并不直接使用谷歌的原生代码,它们其实使用的是所用芯片厂商提供的 Android 代码。然后,设备厂商还得魔改一下,加上终端厂商自己的特性。这就是 MIUI、EMUI、ColorOS 等的功能。
  • 现在大部分终端厂商使用芯片厂商的 Turnkey 方案,主要是 CPU+通讯模组,芯片+软件打包卖给终端厂商。少数公司比如魅族使用的 CPU 是三星,而通信模组不知道哪一家,那么魅族就需要把三星的 CPU 和别家的通讯模组整合到一起,难度比使用 Turnkey 方案得大一些。
  • 终端厂商集成完后,还需要考虑运营商定制的情况,然后加上对应的运营商定制功能,并做对应的测试。

了解上面的情况后,光从测试角度看,源码从 Google 发布到最终的手机上,测试的工作量都非常大——所以到终端消费者手里的速度会慢多了。厂商的解决办法就是在新款手机上直接使用新版系统,老款手机往往要等一段时间才会发布新版升级包。

总之,在 Android 手机世界里,谷歌、芯片厂商、终端厂商,运营商都是生态链里的关键玩家,四者互相影响。从终端厂商角度看,我觉得芯片厂商对终端厂商的影响力更关键和致命。最简单来说,高通要是不更新更好的芯片,很多手机商的产品也就停滞不前了。

对比苹果,它从芯片到 OS 都自己的,也不太拿运营商当回事。所以苹果发版和覆盖速度都相对较快,碎片化问题绝对是比 Android 低好几个数量级。当然,通信芯片是苹果的大问题,所以老有人吐槽 iPhone 的信号不好。这个问题能靠苹果自己开发通信芯片来解决吗?理论上可以,但是不现实,因为其中有很多专利问题不好搞。


国产自主 OS 的未来

再说下我对国产自主 OS 的一些看法和判断。

  • 不出意外的,中长期(十几年之内,如果量子计算机还没有普及的话)看,依然会以 Linux Kernel 为核心(这里不考虑那些特殊场景的 OS,比如工控机用的实时 OS 等)。只要使用 Linux Kernel,绝大部分硬件厂商都能适应。否则来个新 OS,硬件厂商又得开发驱动,还要做大量测试,这个所需的时间和金钱成本都非常巨大。
  • 如果国产自主 OS 兼容 Android 的话,说明原有 Android 的功能等大概率会保留。这是从应用角度来看的。当然,也可以魔改 Android Framework,把内部实现都换成自己写的代码。但是要做到兼容的话,就必须对应用没有影响——这就回到软件界的一句老话,如果一个东西叫起来、走起路来都像鸭子的话,那它就是鸭子。从这个角度看,自主实现只是为了开发一套看起来和之前系统类似的话,意义并不重大,这种自主也很难被认可。当然,如果能提升原有系统的性能则另当别论,这属于优化和改善,和我们讨论的不是同一个东西。
  • 所以,国产自主 OS 要么像 Android 一样基于 Linux 开发,但是套路和 Android 完全不一样的,比如像 Meego、Tizen 这样的。要么就是拓展 Android OS,开发出类似一个 H5 OS 之类的。
  • 最后,如果抛弃 Linux 的话,可参考 Google 的 Fuchsia 了。Fuchsia 据说是一个微内核的新 OS 架构。不过,目前 OS 的前途并不明朗。OS 从来就不是一个纯软件的事情,还涉及到海量硬件厂商。它们甚至是一个 OS 生死存亡的决定者。

我来说两句
您需要登录后才可以评论 登录 | 立即注册
facelist
所有评论(0)
领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )