首先看系统架构框架图如下:

android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层(包含系统库和Android运行库)和linux核心层。
  • Applications
  • Application Framework
  • Libraries
  • Android Runtime
  • Linux Kernel
Android本身是一套软件堆叠(Software Stack),主要分为三层:操作系统、中间件、应用程序。
Android的中间件可以再细分出两层,底层是函数库(Library)和虚拟机(Virtual Machine; VM),上层为应用程序框架(Application Framework)。上面架构图中蓝色部分为Java语言开发,绿色部分为C/C++开发,红色的Kernel层为C开发,黄色部分为Dalvik VM部分。 以下分别介绍每一层的作用
  • 应用程序层(Applications)
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
  • 应用程序框架层(Application Framework)
开发人员也可以完全访问核心应用程序所使用的API框架。该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其 它的应用程序都可以使用其所发布的功能块(不过得遵循框架的安全性限制)。同样,该应用程序重用机制也使用户可以方便的替换程序组件。 隐藏在每个应用后面的是一系列的服务和系统, 其中包括; Views System:丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(lists),网格(grids),文本框(text boxes),按钮(buttons), 甚至可嵌入的web浏览器。 Content Providers(内容提供器):使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据。 Resource Manager(资源管理器):提供非代码资源的访问,如本地字符串,图形,和布局文件( layout files ) Notification Manager(通知管理器):使得应用程序可以在状态栏中显示自定义的提示信息。。通知列设定在手机的顶部,像短信(short Message),Voice mail都会在此进行提示。 Activity Manager(Activity管理):用来管理应用程序生命周期并提供常用的导航回退功能。
  • 函数库层(Libraries)
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:
System C library �C 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。 Media Libraries �C 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。 Surface Manager �C 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。 LibWebCore �C 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。 SGL -底层的2D图形引擎。 3D Libraries -基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。 Free Type - 位图(bitmap)和矢量(vector)字体显示。 SQLite �C SQLite是一套开放源码的关系数据库,一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。 SSL �C Secure Socket Layer用于保护网页通讯的协议。
  • Android运行时库层(Android Runtime)
Android虽然使用Java程序语言来开发应用程序,但是却不使用一般大家目前在用的J2ME版本来执行Java程序,而是采用Android自有的Android Runtime来执行。 Android Runtime包含下面两个核心。 Core Libraries Android 包括了一个核心库,该核心库提供了JAVA编程语言核心库的大多数功能。 Dalvik Virtual Machine 每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。Dalvik被设计成一个设备可以同时高效地运行 多个虚拟系统。 Dalvik虚拟机执行(.dex)的Dalvik可执行文件,该格式文件针对小内存使用做了优化。同时虚拟机是基于寄存器的,所有的类都经由JAVA编 译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。 Dalvik虚拟机有许多地方是参考Java虚拟机的设计,Dalvik虚拟机所执行的中间代码并非是Java虚拟机所执行的Java Bytecode,同时也不直接执行Java类(Java Class File),而是依靠转换工具将Java bytecode转为Dalvik VM执行时特有的dex(Dalvik Executable) 格式,成为.dex。Dalvik VM与Java VM最大的不同在于Java VM是Stack-based,而Dalvik VM是(register-based)。以技术层面来看Register-based VM的特性有个很大的好处,那就是对于目前主流的硬件架构,很容易与现有系统整合且达到最优化,而所需要的资源也相对较少。甚至在硬件实现VM上会比较容 易实现。最重要的是Dalvik并不是由J2ME实现,而不存在J2ME授权相关的问题。 通常来说,Java比较慢不单单只是因为Virtual Machine的关系,Java的程序编译成Bytecode也是关键因素之一,因为Java VM采用了Stack-based的方式来产生指令,所以所有的变量都需要push, pop操作,所以就会多出不少指令,而Dalvik VM则采用Register-based方式,变量都存储在寄存器中,相比较而言,Dalvik VM的指令就会少一点,速度也就会更加快一点。
  • 操作系统层(Linux Kernel)
Android平台的操作系统用的是Linux,内核版本为2.6版,包含的主要功能有安全(Security)、内存管理(Memory Management)、进程管理(Process Managemen)、网络协议栈(Network Stack)、硬件驱动(Driver Model)等,Linux内核也同时作为硬件和软件栈之间的抽象层。 关于 Android kernel 的修改, Google 的简报还提供了两个重点:
Binder (IPC):提供有效率的程序间沟通管道(Inter-Process Communication)Android 系统中有很多服务,而上层的应用程序经常要取用这些服务,一般的 Linux 系统已经提供了不少 IPC 的方式,不过 Android 还是搞了套自己的。虽说文件中解释原因为「一般 IPC 会造成额外资源花费,以及安全问题」,但其实这些都是可以基于原有架构在 kernel 外头解决的,为何要改在 kernel 里头,笔者对此存疑,也只能等找时间去研究程序代码才知了。
Power Management
:与桌上型计算机或笔记型计算机不同,手持装置的电源一向相当有限,必须无所不用其极的去想办法省电,但又不损及顺畅的使用经验。Android 在此采取了颇为积极的作法:「没有人说要用,就关掉」。例如某程序在放 MP3 音乐,于是此程序会需要 CPU 的计算能力,那就得开口要。如果与此同时没其它程序在执行,那么 LCD 显示器就可能被关掉,藉以省电。另一特别处,是在于 Linux kernel 一般考虑的都是在计算机上的作法,所以多半只有进入暂停、休眠等等的选择,而不会如此细致的去控制到各个小装置的电源供应。
系统函式库

这里说的系统函式库是指 native libraries”,是跑在系统里头的函式库,采用的语言不是 Java,提供一些基础建设。里头有几个值得一提的组件:

Bionic
:这是 Android 版的 libclibc GNU/Linux 以及其它类似 Unix 系统上最基础的函式库,一般最常用的是 glibc,就是 GNU 做的 libc。不然在比较小型的装置上也可以用 uclibc。不论是 glibc or uclibc,版权都是LGPL (GPL 的略为弱化版)。看到这大概可以猜到了吧,又是 Copyleft 问题。官方的说法是,除了版权问题以外,还考虑必须轻量以及快速,所以才做了自己的 libc。不过轻量、快速,本来就是小型装置用的 uclibc 一开始的目标,因此,最主要的恐怕还是版权问题。
Webkit
:鼎鼎大名的 Apple Safari 浏览器背后的引擎就是 WebkitAndroid 也包含进去了。离线使用的 html 配上 html 5 的一些新发展,产生了各种有趣的可能,这部分值得另文介绍,这里就不再赘述。
Surface Flinger
:提供把各种”surface”组合在一起的能力。在这里 surface 解释为程序想要显示在屏幕的东西,可能同一屏幕上有来自不同程序的内容,而这些内容有可能是 2D 显示或是 3D 显示等等之类。Surface flinger 就是把这些东西结合起来,一起送到屏幕上。目前程序代码还没公布,不过 2D 3D 的混合显示一直都是问题,根本原因是我们通常告诉 3D 显示卡的东西都是一些「我要在哪里哪里画上什么形状,贴上某某材质然后旋转多少度」之类的事情,也就是说,我们并不知道最后显示出来会长什么样子,那是显示卡上头的 GPU 去算出来的。一般这些东西是显示在一个有装饰的窗口里头,这装饰通常是 2D 效果。接下来假定我们想要旋转这整个窗口,而且里头的东西还要继续动,那等于要随时把握 3D 窗口里的东西长什么样子,然后把它跟 2D 的窗口框框结合,然后再开始转动。目前在一般 GNU/Linux 上这件事情还没有处理的非常好,Android 怎么做,值得在程序代码公布之后注意。
硬件抽象层 (Hardware Abstraction Libraries):这就是前文所述的 userspace 驱动程序,如果想要将 Android 在某硬件平台上执行,基本上完成这些驱动程序就行了。其内定义了 Android 对各硬件装置例如显示芯片、声音、数字相机、GPSGSM 等等的需求。

更多相关文章

  1. android基础知识15:获得android系统信息01—info类
  2. Android平板电脑上的APP应用程序设计须知
  3. android获取系统标准时区的时间
  4. Android 系统framework 概述
  5. 深入理解 Android消息处理系统的原理
  6. 使用html,javascript,css,phonegap创建开发android应用程序
  7. android系统定制从听说到入门二
  8. 最封闭的开源系统:Android
  9. Android主题和系统样式篇(下)

随机推荐

  1. android framework 输入事件分析
  2. Android已有项目接入Flutter及互相通信
  3. 【EditText】Android 中设置 EditText 光
  4. 【Android(安卓)Linux内存及性能优化】(
  5. Android中关于SQLite数据库的一些知识
  6. 36个Android开发常用经典代码大全
  7. Android 应用开发中国大学生挑战赛 & 大
  8. Android MTP之服务端UsbService启动
  9. Android(安卓)WebView总结
  10. Android UI Material Design交互设计(一)