下面将讨论Android的系统架构,我们先来看看Android的体系结构,如下图所示。
图1-6 Android系统结构图
从图1-6可以看出Android分为4层,从高到底分别是应用层、应用框架层、系统运行库层和Linux内核层。下面将对这4层进行简要的分析和介绍。
1.应用层
应用是用Java语言编写的运行在虚拟机上的程序,如图1-6中最上层部分所示。其实,Google最开始时就在Android系统中捆绑了一些核心应用,比如E-mail客户端、SMS短消息程序、日历、地图、浏览器、联系人管理程序,等等。
2.应用框架层
这一层是编写Google发布的核心应用时所使用的API框架,开发人员同样可以使用这些框架来开发自己的应用,这样便简化了程序开发的架构设计,但是必须遵守其框架的开发原则。
从图1-6中可以看出,Android提供了如下一些组件。
* 丰富而又可扩展的视图(View):可以用来构建应用程序,它包括列表(List)、网格(Grid)、文本框(Text Box)、按钮(Button),以及可嵌入的Web浏览器。
* 内容提供器(Content Providers):它可以让一个应用访问另一个应用的数据(如联系人数据库), 或共享它们自己的数据。
* 资源管理器(Resource Manager):提供非代码资源的访问,如本地字符串、图形和布局文件(Layout file)。
* 通知管理器 (Notification Manager):应用可以在状态栏中显示自定义的提示信息。
* 活动管理器(Activity Manager):用来管理应用程序生命周期并提供常用的导航退回功能。
* 窗口管理器(Window Manager):管理所有的窗口程序。
* 包管理器(Package Manager):Android系统内的程序管理。
后面的章节将进一步介绍这些组件的使用。
3.系统运行库(C/C++库以及Android运行库)层
当使用Android 应用框架时,Android系统会通过一些C/C++库来支持我们使用的各个组件,使其能更好地为我们服务。
* Bionic系统 C 库:C语言标准库,系统最底层的库,C库通过Linux系统来调用。
* 多媒体库(MediaFramework):Android系统多媒体库,基于 PacketVideo OpenCORE,该库支持多种常见格式的音频、视频的回放和录制,以及图片,比如MPEG4、MP3、AAC、AMR、JPG、PNG等。
* SGL:2D图形引擎库。
* SSL:位于TCP/IP协议与各种应用层协议之间,为数据通信提供支持。
* OpenGL ES 1.0:3D效果的支持。
* SQLite:关系数据库。
* Webkit:Web浏览器引擎。
* FreeType:位图(bitmap)及矢量(vector)。
每个Java程序都运行在Dalvik虚拟机之上。与PC一样,每个Android应用程序都有自己的进程,Dalvik虚拟机只执行.dex的可执行文件。当Java程序通过编译,最后还需要通过SDK中的dx工具转化成.dex格式才能正常在虚拟机上执行。
Google于2007年底正式发布了Android SDK, 作为 Android系统的重要特性,Dalvik虚拟机也第一次进入了人们的视野。它对内存的高效使用,以及在低速CPU上表现出的高性能,确实令人刮目相看。Android系统可以简单地完成进程隔离和线程管理。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。
很多人认为Dalvik虚拟机是一个Java虚拟机,因为Android的编程语言恰恰就是Java语言。但是这种说法并不准确,因为Dalvik虚拟机并不是按照Java虚拟机的规范来实现的,两者并不兼容。它们有两个明显的不同:Java虚拟机运行的是Java字节码,而Dalvik虚拟机运行的则是其专有的文件格式为dex(Dalvik Executable)的文件。在Java SE程序中的Java类会被编译成一个或者多个字节码文件(.class)然后打包到jar文件,而后Java虚拟机会从相应的class文件和jar文件中获取相应的字节码;Android应用虽然也是使用Java语言进行编程,但是在编译成class文件后,还会通过一个工具(dx)将应用所有的class文件转换成一个dex文件,而后Dalvik虚拟机会从其中读取指令和数据。
Dalvik虚拟机非常适合在移动终端上使用,相对于在桌面系统和服务器系统运行的虚拟机而言,它不需要很快的CPU计算速度和大量的内存空间。根据Google的测算,64MB的内存已经能够让系统正常运转了。其中24MB被用于底层系统的初始化和启动,另外20MB被用于启动高层服务。当然,随着系统服务的增多和应用功能的扩展,其所消耗的内存也势必越来越大。归纳起来,Dalvik虚拟机有如下几个主要特征:
(1)专有的dex文件格式。dex是Dalvik虚拟机专用的文件格式,而为什么弃用已有的字节码文件(.class文件)而采用新的格式呢?原因如下:
* 每个应用中会定义很多类,编译完成后即会有很多相应的class文件,class文件中会有大量冗余信息,而dex文件格式会把所有的class文件内容整合到一个文件中。这样,除了减少整体的文件尺寸和I/O操作外,也提高了类的查找速度。
* 增加了对新的操作码的支持。
* 文件结构尽量简洁,使用等长的指令,借以提高解析速度。
* 尽量扩大只读结构的大小,借以提高跨进程的数据共享。
(2)dex的优化。dex文件的结构是紧凑的,但是如果还想运行时的性能有进一步提高,就需要对dex文件进一步优化。优化主要针对以下几个方面:
* 调整所有字段的字节序(LITTLE_ENDIAN)和对齐结构中的每一个域。
* 验证DEX文件中的所有类。
* 对一些特定的类和方法里的操作码进行优化。
(3)基于寄存器。相对于基于堆栈实现的虚拟机,基于寄存器实现的虚拟机虽然在硬件、通用性上要差一些,但是它在代码的执行效率上却更胜一筹。
(4)一个应用,一个虚拟机实例,一个进程。每一个Android应用都运行在一个Dalvik虚拟机实例中,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制、内存分配和管理、Mutex等的实现都依赖底层操作系统。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多地依赖操作系统的线程调度和管理机制。不同的应用在不同的进程空间里运行,对不同来源的应用都使用不同的Linux用户来运行,可以最大程度地保护应用的安全和独立运行。
4.Linux内核层
Android 的核心系统服务基于Linux 2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。Linux内核同时也作为硬件和软件栈之间的抽象层。
Android更多的是需要一些与移动设备相关的驱动程序,主要的驱动如下所示。
* 显示驱动(Display Driver):基于Linux的帧缓冲(Frame Buffer)驱动。
* 键盘驱动(KeyBoard Driver):作为输入设备的键盘驱动。
* Flash内存驱动(Flash Memory Driver):基于MTD的Flash驱动程序。
* 照相机驱动(Camera Driver):常用的基于Linux的v4l2(Video for Linux)驱动。
* 音频驱动(Audio Driver):常用的基于ALSA(Advanced Linux Sound Architecture)的高级Linux声音体系驱动。
* 蓝牙驱动(Bluetooth Driver):基于IEEE 802.15.1标准的无线传输技术。
* WiFi驱动:基于IEEE 802.11标准的驱动程序。
* Binder IPC驱动:Android的一个特殊的驱动程序,具有单独的设备节点,提供进程间通信的功能。
* Power Management(电源管理):比如电池电量等。
1.1.3 Android应用程序框架
上一节我们对Android的系统构架进行了详细剖析,Android分为应用层、应用框架层、系统运行库层和Linux内核层。我们在开发应用时都是通过框架来与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元素(大部分是可见的)在应用程序的布局中使用。
1.2 OMS介绍
OMS是Open Mobile System的简称,即面向移动互联网的开放型移动智能终端软件平台,它包括基于Linux 2.6内核的移动终端下层操作系统、上层应用软件、中间件、Java虚拟机、硬件参考设计以及基于WebKit的各类应用。它具有强大的兼容性、扩展性和安全性,以及简单易用、友好的人机界面等,而且具有完全自主的知识产权。在此之上,OMS拥有开放统一的API开发接口、完备的集成开发环境和活跃的在线生态环境,极大地方便了移动应用的开发。
OMS的可移植性将使该软件平台在其他领域具有广泛的应用,如航空航天、军事、制造业等。
1.2.1 OPhone介绍
OPhone是基于Linux的面向移动互联网的终端基础软件及系统解决方案。由于OPhone与Android兼容,都是基于Java开发的,因此可以同时用OMS API和Android API来开发OMS应用。任何用Android API开发的应用都可以在OMS终端上正确地运行。然而,不能在Android终端上运行由扩展的OMS API开发的程序,因为这些OMS API是OMS平台独有的,而且在运行时是必需的。
OPhone是指采用了OMS智能操作系统的手机。为了突破TD终端瓶颈,以及促进手机终端与中国移动的网络和应用服务进行无缝对接,中国移动在Android操作系统基础上自主开发了OMS系统,该系统直接内置了中国移动的服务菜单、音乐随身听、手机导航、号簿管家、139邮箱、飞信、快讯和移动梦网等特色业务,如图1-7所示。
1.2.2 Widget介绍
OMS除了支持基于Java的应用,还支持Widget应用开发。Widget应用是OMS的精华,而Android从1.5版本开始同样支持Widget应用开发,但是所采用的标准则和OMS不同,我们会在后面的章节详细讲解。
Widget应用采用了 JIL (Joint Innovation Lab)Widget标准。JIL Widget是一个采用HTML、JavaScript和CSS等网络技术的应用程序。Widget应用是在Widget引擎上运行的独立的应用程序。Widget已经成为手机上非常流行的技术,可以为用户带来良好的移动互联网体验,随时随地获取有用的资讯,如天气预报、股票信息、头条新闻等。从用户的角度来看,Widget应用和OPhone应用没有什么区别。实际上,Widget应用不同于OPhone应用。OPhone应用是采用Java技术的应用程序,而Widget应用则是采用HTML、JavaScript和CSS等网络技术的应用程序。相比较而言,Widget应用的开发更加方便快捷。此外,JIL Widget还提供了许多JavaScript API来扩展Widget应用的能力,如访问手机电话本、手机文件系统等。Widget应用运行效果如图1-8所示。
图1-7 OPhone系统界面 图1-8 HelloWidget效果预览
我们简单了解目前主流的7个Linux平台手机以及中国移动的OMS操作系统。在介绍Android基本概念时重点介绍了Android系统架构和应用框架,其中应用层即是我们使用Java语言编写的一些运行在虚拟机上的程序,应用框架层是我们开发应用时接触最为紧密的一层,在开发应用程序时必须遵守其规则,才能保证所开发的应用程序能在Android上安全地运行。大家应着重理解这两层,这样才能开发出效率更高的应用程序。
据称今年底将会有18款之多的以Android平台为系统的Linux手机上市, Android将在移动开发中具有更广阔的前景。要想成为一个优秀的Android手机开发者,还需要从基础做起,希望大家好好掌握本章的内容。