1.2 Android系统架构与特性

Android是什么?就像Android开源和兼容性技术负责人Dan Morrill在Android开发手册兼容性部分所解释的,“Android并不是传统的Linux风格的一个规范或分发版本,也不是一系列可重用的组件集成,Android是一个用于连接设备的软件块。”Android是一个软件系统,用于连接设备,并不是大家平时所说的操作系统。

1.2.1 Android系统架构

Android的系统架构和其他操作系统一样,采用了分层的架构。从图1-1所示的架构图看,Android分为4层,从高层到低层分别是应用程序层(Application)、应用程序框架层(Application Framework)、系统运行库层(Libraries)和Linux内核层(Linux Kernel)。Android操作系统可以在4个主要层面上分为5部分。

图1-1 系统架构图

1.应用程序层

Android系统包含了一系列核心应用程序,包括电子邮件、短信SMS、日历、拨号器、地图、浏览器、联系人等。这些应用程序都是用Java语言编写的。本书重点讲解如何编写Android系统上运行的应用程序,在程序分层上,与系统核心应用程序平级。

2.应用程序框架层

Android应用程序框架提供了大量的API,以供开发人员使用。Android应用程序的开发就是调用这些API,根据需求实现功能。

应用程序框架是应用程序的基础。为了软件的复用,任何一个应用程序都可以开发Android系统的功能模块,只要发布的时候遵循应用程序框架的规范,其他应用程序也可以使用这个功能模块。

3.系统运行库层

Android系统运行库是用C/C++语言编写的,是一套被不同组件所使用的函数库组成的集合。一般来说,Android应用开发者无法直接调用这套函数库,都是通过上层的应用程序框架提供的API来对这些函数库进行调用。

下面对一些核心库进行简单的介绍。

• Libc:从BSD系统派生出来的标准C系统库,在标准C系统库基础之上为便携式Linux系统专门进行了调整。

• Medio Framework:基于PacketView的OpenCORE,这套媒体库支持播放与录制硬盘及视频格式的文件,并能查看静态图片。

• Surface Manager:在执行多个应用程序时,负责管理显示与存取操作间的互动,同时负责2D绘图与3D绘图进行显示合成。

• WebKit:Web浏览器引擎,为Android浏览器提供支持。

• SGL:底层的2D图像引擎。

• 3D libraries:基于OpenGL ES 1.0 API,提供使用软硬件实现3D加速的功能。

• FreeType:提供位图和向量字体的支持。

• SQLite:轻量级的关系型数据库。

4.Android运行时

Android运行时由两部分完成:Android核心库和Dalvik虚拟机。其中核心库集提供了Java语言核心库所能使用的绝大部分功能,Dalvik虚拟机负责运行Android应用程序。

虽然Android应用程序通过Java语言编写,并且每个Java程序都会在Java虚拟机JVM内运行,但是Android系统毕竟是运行在移动设备上的,由于硬件的限制,Android应用程序并不使用Java的虚拟机JVM来运行,而是使用自己独立的虚拟机Dalvik VM(针对多个同时高效运行的虚拟机进行了优化)。每个Android应用程序都运行在单独的一个Dalvik虚拟机内,因此Android系统可以方便地对应用程序进行隔离。

5.Linux内核

Android系统是基于Linux 2.6之上建立的操作系统。Linux内核为Android系统提供了安全性、内存管理、进程管理、网络协议栈、驱动模型等核心系统服务。Linux内核帮助Android系统实现了底层硬件与上层软件之间的抽象。

1.2.2 Dalvik VM和JVM的区别

JVM(Java虚拟机)是一个虚构出来的运行Java程序的运行时,是通过在实际的计算机上仿真模拟各种计算机功能的实现。它具有完善的硬件架构(如处理器、堆栈、寄存器等),还具有相应的指令系统,使用JVM就是使Java程序支持与操作系统无关。理论上在任何操作系统中,只要有对应的JVM,即可运行Java程序。

Dalvik VM是在Android系统上运行Android程序的虚拟机,其指令集是基于寄存器架构的,执行特有的文件格式-dex字节码来完成对象生命周期管理、堆栈管理、线程管理、安全异常管理、垃圾回收等重要功能。

由于Android应用程序的开发编程语言是Java,而Java程序运行在JVM(Java虚拟机)上,因此有些人会混淆Android的虚拟机Dalvik VM和JVM,但是实际上Dalvik并未遵守JVM规范,而且两者也是互不兼容。

Dalvik VM和JVM的编译过程如下:

• JVM:.java→.class→.jar

• Dalvik VM:.java→.class→.dex

从它们的编译过程可以看出,JVM运行的是.class文件的Java字节码,但是Dalvik VM运行的是其转换后的dex(Dalvik Executable)文件。JVM字节从.class文件或者JAR包中加载字节码然后运行,而Dalvik VM无法直接从.class文件或JAR包中加载字节码,需要通过DX工具将应用程序所有的.class文件编译成一个.dex文件后再运行。

如图1-2显示了Dalvik VM与JVM编译过程的区别。

图1-2 Dalvik VM与JVM编译过程的区别

从图1-2中可以看出,Dalvik VM把.java文件编译成.class后会对.class进行重构,整合基本元素(常量池、类定义、数据段),最后压缩写进一个.dex文件中。其中,常量池描述了所有的常量,包括引用、方法名、数值常量等;类定义包括访问标识、类名等基本信息;数据段中包含各种被VM指定的方法代码以及类和方法的相关信息和实例变量。这种把多个.class文件进行整合的方法大大提高了Android程序的运行速度,例如应用程序中多个类定义了字符串常量TAG,而在JVM中会编译成多个.class文件,每个.class文件的常量池中均包含这个TAG常量,但是Dalvik VM在编译成.dex文件之后,其常量池里只有一个TAG常量。

JVM和Dalvik VM还有一点非常重要的差异,就是基于的架构不同。JVM是基于栈的架构,而Dalvik VM是基于寄存器的架构。相对于基于栈的JVM而言,基于寄存器的Dalvik VM实现虽然牺牲了一些硬件上的通用性,但是在代码的执行效率上要更胜一筹。一般来讲,VM中指令的解释执行时间主要花费在以下3个方面:

• 分发指令。

• 访问运算数。

• 执行运算。

其中,分发指令这个环节对性能的影响最大。在基于寄存器的Dalvik VM中可以更有效地减少冗余指令的分发,减少内存的读写访问。

从JVM和Dalvik VM的区别上来说,Dalvik VM主要是针对Android这个嵌入式操作系统的特点进行各种优化,使其更省电、更省内存、运行效率更高,但是牺牲了一些JVM与平台无关的特性。实际上,Dalvik VM本身就是为Android设计的,无须考虑其他平台的问题。这里只介绍JVM和Dalvik VM的两个重要区别,因为本书并不是讲解Android内核的,所以只点明了Dalvik VM的特点。读者对这部分的内容了解即可。

1.2.3 Android系统平台的优势

Android系统相对于其他操作系统,有如下几点优势。

1.开放性

首先就是Android系统的开放性,其开发平台允许任何移动终端厂商加入Android联盟,降低了开发门槛,使其拥有更多的开发者,随着用户和应用的日益丰富,也将推进Android系统的成熟。同时,开放性有利于Android设备的普及以及市场竞争力,有利于消费者买到更低价位的Android设备。

2.丰富的硬件选择

同样由于Android系统的开放性,众多硬件厂商可以推出各种搭载Android系统的设备。现如今,Android系统不仅仅运行在手机上,越来越多的设备开始支持Android系统,如电视、可佩戴设备、数码相机等。

3.便于开发

Google开放了Android的系统源码,给开发者提供了一个自由的开发环境,不必受到各种条条框框的束缚。

4.Google服务的支持

Google公司作为一个做服务的公司,提供了地图、邮件、搜索等服务。Android系统可以对这些服务进行无缝结合。