安卓开发(一) 历史和安卓系统构成

历史

谈到操作系统,就不得不提到Linux内核,时至今日,它已经成为全球被最广泛移植的操作系统内核,当然Linux内核的老爹类Unix内核则更是如此了,不仅在嵌入式、个人计算机平台取得了成功,就连ps4或是Xbox等家用机方面也得到了广泛应用,不过暂不谈。作为一个成熟的内核解决方案,Android与2003年末创建时,自然也选择了它作为自家的内核。虽然当初这个项目旨在创建数字相机的操作系统,但由于智能机的发展以及相机业务市场需求实在堪忧,于是Android成为一款面向智能手机的操作系统。于2005年7月11日Android Inc.被美国科技企业Google收购,也就有了后来我们熟知的安卓。当然时至今日,安卓不仅只是手机的操作系统,它也进军了智能电视、平板、等,或是被某些国产山寨游戏机和所谓国产主机所采用。

虽然安卓采用了Linux内核,但并不代表它就是Linux系统的变种,相反,它并不支持也不支持标准的GNU库,而且为了在移动设备上取得优越的可移植性,对Linux内核做了定制,采用在内核上跑虚拟机的方式,这里谷歌又采用了聪明的一招——JAVA,现在,有了JAVA成熟的虚拟机机制和理论(需要注意Google单独写了Android的JAVA虚拟机——Dalvik Virtual Machine)、以及Linux内核的加持,Android系统的开发就少做了很多工作。理解了上述这点,就可以理解安卓系统中可能稍显“怪异”的机制。

构成

粗略了解了历史,有助于理解安卓看似舍近求远的系统设计,毕竟对于熟悉的Windows系统而言,它并没有经过一层虚拟机。

安卓开发(一) 历史和安卓系统构成_第1张图片 安卓系统组成​​​​

上图是安卓系统的典型构成。从上到下依次是:

 其中与Android虚拟机并列的C/C++库可以直接和内核、抽象硬件层沟通,不用经过虚拟机,但也因此需要更多的知识。

而对于Windows而言,在内核之上,便是动态链接库和应用程序了,看起来舍近求远?上文便是笔者的理解。

对于一个app来说,如果仅包含java代码,对于它来说,它调用java api,然后再安卓虚拟机中运行,虚拟机负责翻译为Linux内核代码,最终内核翻译为010001的二进制代码执行,这便是一个最简单、最典型的安卓应用程序的执行了。

更细致点说,如下图给出的,安卓系统的详细结构。

  • 应用程序
  • 安卓应用程序框架,也即JavaAPI
  • C/C++库和Android虚拟机
  • 抽象硬件层
  • Linux内核
安卓开发(一) 历史和安卓系统构成_第2张图片 详细的安卓系统组成

上文一直在提Linux内核,稍微懂点操作系统的朋友都知道,Linux内核也是有抽象硬件层HAL的,为什么安卓又多了一层呢?笔者也不懂Google的黑科技,Google把这部分怎么“独立”出来的并不懂,从目前查询到的资料来看,对于Android来说,HAL和Linux内核有些纠缠不清,因为HAL本是Linux内核的一部分,但是由于一些商业原因,安卓和Linux遵循不同的开源标准,所以HAL不得不被拆成两半,一半在内核中,一半在安卓中,但为了避免混淆,只讨论安卓的HAL层。 

现在我们细看我们需要了解的部分,

  • 应用程序
    • 电话、相机、浏览器等
  • 安卓应用程序框架,也即JavaAPI
  • C/C++库和Android虚拟机
    • C/C++库:主要是一些比较需要优化的部分,或是基础的部分,网络通信、多媒体、或是手机3d游戏的API
  • 抽象硬件层
  • Linux内核
    • 满是各种驱动,用于对设备的适配,图中并没有提及Linux内核的内存管理、文件系统等等部分,因为也不需要了解。

可以看出Android对于系统的优化还是比较上心的,对于一些对硬件要求比较大的应用可以直接调用C++库来实现,因此对于一部分应用程序来说,比如手机游戏、mp4播放器浏览器,它们和阅读器等app的侧重点应当是不同的,可能更注重对于C++库的使用(这部分需要一个叫JNI(java native API)的东西),而不是仅和java虚拟机打交道。

以上大概就是对Android的历史和构成的基本了解

参考:Wikipedia

https://zh.wikipedia.org/wiki/Android#Linux核心

https://zh.wikipedia.org/wiki/类Unix系统

https://en.wikipedia.org/wiki/PlayStation_4_system_software

注:本文日后可能有勘误,如有将在下面贴出

你可能感兴趣的:(Android)