Android系统架构
Android系统架构分为4层,从上到下依次是应用层、应用框架层、系统运行库层、Linux内核层。
Java应用程序层:
Android会同一系列核心应用程序包一起发布,该应用程序包包括客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等。所有的应用程序都是使用JAVA语言编写的。
显然你自己也可以使用Java通过Java原生接口JNI(Java Native Interface)的方式,配合Android NDK来开发原生程序,它允许Java代码和其他语言写的代码(通常为 C和C++ ,形成的代码称为本地代码)进行交互.使用Java与本地已编译的代码交互,通常会丧失平台可移植性.但有些情况下这样做是可以接受的,甚至是必须的。
Java应用程序框架层
应用框架层为应用开发者提供了用以访问核心功能的API框架.应用框架层提供了各种服务和管理工具,包括了应用开发所需的界面管理、数据访问、应用层的消息传递、应用包的管理、电话管理、定位管理等功能。
它主要包括以下几部分:
丰富而又可扩展的视图(Views),可以用来构建应用程序, 它包括列表(Lists),网格(Grids),文本框(Text boxes),按钮(Buttons), 甚至可嵌入的web浏览器。
内容提供器(Content Providers)使得应用程序可以访问另一个应用程序的数据(如联系人数据库), 或者共享它们自己的数据。
资源管理器(Resource Manager)提供 非代码资源的访问,如本地字符串,图形,和布局文件(Layout files )。
通知管理器 (Notification Manager) 使得应用程序可以在状态栏中显示自定义的提示信息。
活动管理器( Activity Manager) 用来管理应用程序生命周期并提供常用的导航回退功能。
请往下看:
我们在开发应用时都是通过框架来与Android底层进行交互,接触最多的就是应用框架层了。
Android系统提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则。我们在开发应用时就是在这个框架上进行扩展。Android应用框架功能如下。
*android.app:提供高层的程序模型和基本的运行环境。
*android.content:包含对各种设备上的数据进行访问和发布。
*android.database:通过内容提供者浏览和操作数据库。
*android.graphics:底层的图形库,包含画布、颜色过滤、点、矩形,可以将它们直接绘制到屏幕上。
*android.location:定位和相关服务的类。
*android.media:提供一些类管理多种音频、视频的媒体接口。
android.net:提供帮助网络访问的类,超过通常的java.net.接口。
*android.os:提供了系统服务、消息传输和IPC机制。
*android.opengl:提供OpenGL的工具。
*android.provider:提供访问Android内容提供者的类。
*android.telephony:提供与拨打电话相关的API交互。
*android.view:提供基础的用户界面接口框架。
*android.util:涉及工具性的方法,例如时间日期的操作。
*android.webkit:默认浏览器操作接口。
*android.widget:包含各种UI元素(大部分是可见的)在应用程序的布局中。
如果觉得不够清晰,可以自己查阅Android API文档。
C、C++本地库和Android运行时环境
开发者可以在自己的应用中使用C、C++本地库中的接口来方便地实现官方 API未实现的功能 . 例如,Facebook提供了一个开源的Java库,开发者可以在自己的 应 用 中 嵌 入 Facebook的 部 分 社 交 功 能, 第三 方类库独立于 Android系统架构实现,但与系统架构处于相同的地位,都是使用内核层来提供服务,实现、封装功能模块,供应用层调用.
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。以下是一些核心库:
系统 C 库 - 一个从BSD (Berkeley Software Distribution,伯克利软件套件),Unix的衍生系统继承来的标准C系统函数库 Libc ), 它是专门为基于Embedded linux的设备定制的。
媒体库 - 基于PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
Surface Manager - 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。
LibWebCore - 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。
Android运行时环境( Android Runtime)提供了核心链接库(Core Libraries)和 Dalvik VM虚拟系统(Dalvik Virtual Machine),采用 Java开发的应用程序编译成 apk程序代码后,交给 Android操作环境来执行。
Android采用 Dalvik VM来代替 Java VM,熟悉 Java SE开发环境的开发人员可以很快地学会开发 Android应用程序。将写好的 Java程序“.java”先编译成“.class”程序,这个过程和开发 Java SE是相同的;接下来再次编译成可以在 Dalvik VM执行的“.dex”程序,最后要包装成 Android可以执行的文件“.apk”
每个Android 应用都运行在自己的进程上, Dalvik 虚拟机为它分配自有的实例。 Dalvik 使一台设备能运行多个虚拟机程序但消耗较少的资源。
Linux内核与驱动层
Android是基于不同版本的 Linux内核开发出来的, Linux内核层包括系统层安全机制、内存管理、进程管理、网络堆栈及一系列的驱动模块,位于硬件与其他的软件层之间,提供与硬件的交互.
Android 内核与标准 Linux 内核在文件系统、进程间通信机制、内存管理等方面存在不同:
Android内核中增加了标准 Linux 内核中没有采纳的 YAFFS2文件系统。 YAFFS2 ( Yet Another Flash File Sy-stem,2nd edition ) 是专用于 Flash 的文件系统, 对 NAND-Flash 芯片有着良好的支持。 YAFFS2 是日志结构的文件系统,提供了损耗平衡和掉电保护,可以有效地避免意外断电对文件系统一致性和完整性的影响。
Android 增加了一种进程间的通信机制 IPC Binder , 在内核源代码中, 驱动程序文件为 coredroid/include/linux/binder.h 和 coredroid/drivers/android/binder.c 。 Binder 通过守护进程 Service Manager 管理系统中的服务,负责进程间的数据交换。 各进程通过 Binder 访问同一块共享内存,以达到数据通信的机制。
Android 内核采用了一种不用于标准 Linux 内核的低内存管理策略。 在标准 Linux内核当中,使用一种叫做 OOM( Out of Memory) 的低内存管理策略;当内存不足时,系统检查所有的进程,并对进程进行限制评分, 获得最高分的进程将被关闭(内核进程除外)。 Android 系统采用的则是一种叫作LMK ( Low Memory Killer )的机制,这种机制将进程按照重要性进行分级、分组。内存不足时,将处于最低级别组的进程关闭。 例如,在移动设备当中, UI 界面处于最高级别,所以该进程永远不会被中止,这样,在终端用户看来,系统是稳定运行的。 在 Andorid 内核源码 中 , LMK 的 位 置 coredroid/drivers/misc/lowme -morykiller.c