2023年12月6日发(作者:綦傲霜)
1 绪论
1.1 智能手机平台
智能手机具有独立的操作系统,像个人电脑一样支持用户自行安装软件、游戏等第三方服务商提供的程序,并通过此类程序不断对手机的功能进行扩充,同时可通过移动通讯网络来实现无线网络接入。目前,全球多数手机厂商都有智能手机产品,而芬兰诺基亚、美国苹果、加拿大RIM(黑莓)、美国摩托罗拉、中国台湾宏达(htc)更是智能机中的佼佼者。
智能手机具有五大特点:1. 具备无线接入互联网的能力,即需要支持GSM网络下的GPRS或者CDMA网络的CDMA 1X或3G网络。 2. 具有PDA的功能,包括PIM(个人信息管理),日程记事,任务安排,多媒体应用,浏览网页。 3. 具有开放性的操作系统,可以安装更多的应用程序,使智能手机的功能可以得到无限扩展。4. 人性化,可以根据个人需要扩展机器功能。5. 功能强大,扩展性能强,第三方软件支持多。
1.1.1 Symbian
Symbian(中文名:塞班)是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少等特点,非常适合手机等移动设备使用,经过不断完善,但是虽然在智能型手机市场取得了无比的成功,并长期居于首位,Symbian S60、Symbian3,UIQ等(尤其是S60)系统近两年亦遭遇到显著的发展瓶颈。最近12个月欧洲手机公司诺基亚(Nokia)在智能手机市场市占率的滑落是不争的事实。需要注意的是,并不是所有的Symbian系统都是智能系统,比如S40系统,就不属于智能手机系统。
1.1.2 Android
Android ( 中文名:安卓) 是基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前在市场上可谓如日中天,越来越受到玩家的青睐,倍受摩托罗拉推崇。在Android发展的过程中, 摩托罗拉付出的是核心代码,Google付出的是公关和品牌效应,当然还有它的google app,但是Google掌握了Android Market以及通过android
google apps获得的大量用户。
1.1.3 OS(Tapas)
点心操作系统(Tapas OS)是一款基于Android操作平台、针对中国用户使用习惯打造的互联网智能手机操作系统,在底层技术架构优化的基础上,为用户提供流畅的操作体验;同时根据本土化需求,提供贴心的功能设计及丰富的移动互联网应用。点心操作系统由北京风灵创景科技有限公司开发。该公司是李开复博士旗下的创新工场投资孵化的第一家公司。此外,点心还推出“均衡云计算”理念,整合网络环境、终端设备等负责状况,智能分配手机端及云端计算量、管理流量分配,为用户提供安全贴心的云计算服务。
1.1.4 Windows Mobile
作为软件巨头微软的掌上版本操作系统,在与桌面PC和Office办公的兼容性方面具有先天的优势,而且WM具有强大的多媒体性能,办公娱乐两不误,让他成为最有潜力的操作系统之一。以商务用机为主,目前市场已显出颓势,最新版本为Windows Phone 7,几乎对旧有的WM系统全盘推翻再造,其应用机型已逐渐上市,不过价格不菲。
1.1.5 iOS
ios是(又称MAC OS)由苹果公司为iPhone开发的操作系统,它主要是给iPhone、iPod touch以及iPad使用。最新版本为iOS4.3.2,该系统的UI设计及人机操作前所未有的优秀,软件极其丰富。苹果完美的工业设计配以iOS系统的优秀操作感受,就靠仅有的几款机型,已经赢得可观的市场份额。
1.1.6 MeeGo
MeeGo是诺基亚和英特尔宣布推出一个免费手机操作系统,中文昵称米狗,该操作系统可在智能手机、笔记本电脑和电视等多种电子设备上 运行,并有助于这些设备实现无缝集成。这种基于Linux的平台被称为MeeGo,融合了诺基亚的Maemo和英特尔的Moblin平台。
1.1.7 Web OS
Web OS(又称Palm os)以其独特的外形,另类的系统吸引了无数人的眼球,但是一个问题,就是目前没有任何正规途径,还有应用软件的问题,配套太少。Web OS系统目前仍有很多的计算机编程爱好者,在努力的专研。目前也Palm公司被惠普收购。希望其在主流系统云集的将来,不被陨殁!
1.1.8 BlackBerry OS
BlackBerry OS是RIM公司独立开发出的与黑莓手机配套的系统,目前在全世界都颇受欢迎,在此系统基础上,黑莓的手机更是独树一帜的在智能手机市场拼搏,目前也已在中国形成了大笔粉丝。望其开发的愈来愈好,道路愈走愈宽!
1.1.9 三星Bada
bada是韩国三星公司自行开发的智能手机平台,支持丰富功能和用户体验的软件应用,于2009年11月10日发布。bada在韩语里是“海洋”的意思。 bada的设计目标是开创人人能用智能手机的时代。它的特点是配置灵活、用户交互性好、面向服务,非常重视SNS集成和地理位置服务应用。 bada系统由操作系统核心层、设备层、服务层和框架层组成。支持设备应用、服务应用和Web与Flash应用。
1.2 Android 平台介绍
Android从诞生到现在也不过3年的时间,但是也就是在这短短的3年内Android创造了一个迅速被人们知晓并追捧的奇迹。2007 年11 月5 日,Google 与其他33 家手机制造商(包含摩托罗拉、宏达电、三星、LG)、手机晶片供应商、软硬体供应商、电信业者所联合组成的开放手持装置联盟 (Open Handset Alliance),发布了名为Android的开放手机软硬体平台。该联盟的成员宣布日后都会在Android平台上开发他们的新的业务。不久之后的2008 年9 月24 日,T-Mobile 公司首度公布第一台Android 手机(G1)的细节,同日Google 也放出了Android SDK 1.0 rc1。这样Android进入了人们的视线。
Android以其特有的开放性优势越来越受到人们和智能手机厂商的关注。
对于第三放软件开发商来说,Android 是一个真正意义上的开放性移动设备综合平台,Android系统是免费向开发人员提供的,这样就避免了开发中专利权的障碍。因此,就能够为第三方软件开发商省下大笔资金。
对于设备制造商来说,Android是一个免费的平台。当设备制造商每制造一台手机时,那些支付给手机系统制造商的费用也省去了,这样也降低了每台手机的生产费用,同时就降低了手机的价格,这样在市场上也提高了竞争力。
对硬体开发厂商来说,Android也是个开放的平台。使用Android平台的厂商可以更具自己的需求以及能力为Android开发具有该厂商特色的功能,但是这样的增加完全不用考虑版权的问题。
同时Android平台支持各种先进的网络、绘图、3D 处理能力,可以用来提供更好的使用者体验。
Google Android 系统作为一个完全开源的操作系统,是由操作系统(Linux)、中间件以及核心应用程序组成的软件栈(software stack)。通过
android SDK 提供的 API 以及相应的开发工具, 程序员可以很方便的开发android平台上的应用程序。其整个系统由应用程序(Application),应用程序框架(Application Framework),应用程序库(Libraries),Android运行库(Android Runtime),Linux内核(Linux Kernel)五个部分组成。Android操作系统内置了一部分应用程序, 包括电子邮件客户端、SMS程序、日历、地图、浏览器、通讯录以及其他的程序,值得一提的是这些所 有的程序都是用java编写的。
因为应用程序框架使得组件更易于重用,所以开发者的应用程序可以很容易的调用API函数实现我们想要的功能。在遵守应用程序框架的安全机制约束的前提下,开发者开发的一个应用程序可以使用其他程序所开发的功能。虽然Android的应用程序是用Java语言开发的,但是Android给应用程序开发者提供了一系列的 C/C++ 程序库,通过Android的一些特殊的设计,我们开发者可以使用这些库,这在后面的叙述中将看到。
现今,Android操作系统已成为许多手机制造商的宠儿,其中包括HTC、索尼爱立信、Samsung、摩托罗拉以及国内的联想、华为、海尔、华禹等。其中值得一提的是摩托罗拉公司,就在2009年11月凭借其一款搭载Android平台的Droid手机,两个月内就突破百万台,击败了苹果的iPhone
3GS,被《时代》杂志评选为“年度最佳科技产品”。因此告别了两年多的低迷态势,走出了泥潭。 2 Android的系统研究
2.1 Android构架
2.1.1 Android的构架综述
Android是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集[1]。作为一个层次结构的软件集,一定有一个层次的系统构架,下图为Android的构架图:
图2-1 Android 系统构架
从图2-1中明显的可以看出该系统从下到上包括Linux内核层、Libraries和运行时环境层、应用程序框架层、应用程序层四层结构。在Android的最下层的操作系统基于Linux2.6内核,往上的中间件包括Libraries和运行时环境层和应用程序框架层两个层次,最上层则是应用程序层。
在Android构架中,可以很明显的看到,底层的Linux内核则采用的是C语言,libraries采用C或者C++,但是应用程序层、应用程序框架层和运行时环境中的Android核心库采用Java语言编写,也就是说Android虽然底层用的是C或者C++但是应用程序的开发则用的是Java。Google采用这样的模式可能是因为相对于C或者C++,Java的开发周期更短的缘故,这样的话就能在短时间内为Android提供大量的应用软件。我们知道,作为一个智能手机平台,只有拥有了大量的源源不断的应用程序作为支持,才能受人们的欢迎,从而才能占领市场。之前Nokia的s60第三版就是一个很好的例子,因此Nokia S60v3的系统才被世人所熟知,并且曾经在智能手机行业占有很大的市场。而另一个例子就是Linux系统,在所有操作系统中,稳定性和性能上能够和Linux抗衡的系统不多吧,但是在智能手机市场上为什么Linux却可以说是一败涂地,其原因也和其第三方应用少是脱不了关系的。
2.1.2 内核层
Google Android 作为一个开源的操作系统其内核采用了同样开源的被业界认为是相当稳定的Linux作为其内核,其中Linux内核包括以下功能模块:安全(Security)、存储器管理(Memory Management)、进程管理(Process Management)、网络堆栈(Network Stack)、驱动程序模型(Driver
Model)等,另外也在给其上层的软件和下层硬件间建立起一个抽象层(Abstraction Layer)。同时Android在Linux 2.6的内核上进行了一些增加和删改,使Linux更加适应ARM平台。
⑴增加了一个基于ARM构架的GoldFish平台作为虚拟机的虚拟CPU。
⑵增加了YAFFS2 FLASH系统文件,因此增加了对NANDFLASH支持。
⑶增加了Android相关的驱动。例如Android的IPC(进程间通信机制)binder,使用这个能使运行的进程为其他进程提供服务;Android的日志系统(Logger)和内存控制台(Ram_console);同时Google还重写了电源管理(Power)
⑷增加了新的共享方式Ashmem(匿名共享内存),多个应用程序可以这种方式共享内存获取信息,为进程间提供大量共享内存,同时为内核提供回收和管理这个内存的机制。
2.1.3 Android Runtime和函数库层
2.1.3.1 函数库
Android 包含一些C/C++库,Android系统中的各种不同组件都能够使用这些库函数。这些库函数通过Android 应用程序框架为开发者提供服务。以下列举了一些库函数[2]:
①系统 C 库-一个专门为Embedded Linux设备定制的从BSD(Berkeley
Software Distribution 伯克利软件套件)继承来的标准C系统函数库。
②媒体库 - 基于 PacketVideo公司的OpenCORE开发设计的。该库支持MPEG4, H.264, MP3, AAC, AMR, JPG, PNG多种常用的音频、视频格式的回放和录制,同时支持静态图像文件。
③Surface Manager - 对显示子系统的管理,并且为多个应用程序提
供了2D和3D图层的无缝融合,提供如同类似iPhone的界面管理功能。
④LibWebCore - 一个支持Android浏览器和一个可嵌入的web视图的最新的web浏览器引擎。
⑤3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件
3D加速(如果可用)或者使用高度优化的3D软加速。
⑥SQLite - 一个功能强劲的轻型关系型数据库引擎,Android中所有应用程序都可以调用它。
⑦FreeType -位图(bitmap)和矢量(vector)字体显示。
⑧SGL - 底层的2D图形引擎。
2.1.3.2 Android Runtime
前面说到Android采用Java作为应用程序的开发语言,但是虽然使用的是Java语言,但是Google却没使用传统的Java Runtime来执行应用程序而是采用Android自己特有的Android Runtime。从Android 的系统构架图中可以清楚的看到,Android Runtime由Android函数库(Android
Libraries)和Dalvik虚拟机组成[3]。
Android函数库中里包含了大部分Java程序语言所需要调用的函数库,如data structure, network, utilities, file system等,其中很多代码是源于2005年的Apache Harmony项目。这样做的话能够使Android的虚拟机的类库与Java SE的类库有非常大的相似性,进而提高了Java SE类库的兼容性,最大限度的降低了一个程序员从Java平台开发到Andorid平台开发的难度,这样就降低了对Android开发的准备时间以及前期培训的费用,从而降低了Android应用程序开发的周期以及开发费用,这样的话短时间内就能让Google Android系统能够拥有大量的可执行的应用程序。另外,使用Apache Harmony 类库还能完全摆脱Sun的束缚而走上完全开源的Java之路,这样也奉行了Google对Android完全开源的原则。
我们知道,对一个应用程序而言,都采用一个属于该应用程序的进程作为执行的载体,同样,对于Android也是,一个应用程序也是有一个属于它的进程。之前说过Android采用Java作为开发语言,在进程执行时应该会有一个Java虚拟机来为进程提供服务。在Android构架图中可以看到,
该系统采用的是一个叫做Dalvik的虚拟机。在前面的研究中我们了解到Dalvik虚拟机是一个Java 虚拟机,但是又和Java虚拟机有所不同。Dalvik虚拟机和传统的Java虚拟机所不同之处的是传统的Java虚拟机是一个虚拟机来为不同应用程序提供服务,而Google自己开发的Dalvik虚拟机则是每一个Android应用程序都拥有一个其自身的Dalvik虚拟机,换句话说就是专属于每一个应用程序对应着一个Dalvik虚拟机而这个Dalvik虚拟机相当于一个执行个体。有关Dalvik虚拟机的内容将在下一个部分详细说明。
Android函数库和Dalvik虚拟机组成了Android的运行时环境。从图 中可以看到,Android Runtime和Libraries在同一层,建立在Linux Kernel
层之上,与Linux Kernel 没有交集,而是直接嵌套到libraries中。我们之前说过,我们开发者可以调用C和C++的一些类库。其实就是这样Android
Runtime与Libraries在同一层的设计并同时让Android Runtime 中的Android Libraries 引用libraries中的函数,而通过Dalvik虚拟机编译以后再调用这些函数做到上面所述的功能。
也就是说其实Android Libraries中的函数只是libraries中的一些引用,当一个上层的应用程序调用Dalvik虚拟机中的核心库函数时,调用的其实只是一个函数名,并不是函数的具体实现,然后Dalvik虚拟机对该函数进行一些处理以后再通过Dalvik虚拟机调用libraries中的相应函数,使之运行。换句话说就是,Android Libraries中的只是一个函数名,而真正代码的实现是libraries中的C或者C++代码。这样的好处就在于那些使用Java语言很难实现但是在C或者C++却能很容易实现的功能也能通过Java很容易等的实现。
Android
调应用程序进程
交给Dalvik虚拟机进行处理
Dalvik虚拟Dalvik虚拟机调用Libraries用Android
图2-2 应用程序调用Android Libraries中函数2.1.4 Dalvik 虚拟机
Dalvik虚拟机是Android Runtime的一个组成部分,之所以要把他拿出来单独进行研究是因为,Dalvik虚拟机作为一个Java虚拟机,但它和普 通的Java虚拟机有着一些不同。Google的工程师结合传统的Java 虚拟机,根据Android使用的平台一般为移动终端设备这样一个特点重新设计的虚拟机,这个虚拟机在移动终端设备上运行效率上明显比传统的Java 虚拟机要高许多。Dalvik虚拟机对内存的高效使用和在低速的CPU上表现出的高性能,确实让人们刮目相看。
Android的上层应用程序虽然是用Java开发的,但是Dalvik虚拟机却和传统的Java虚拟机有着很大的区别,两者是不兼容的。
首先,众所周知在Java 中,所有的程序代码会被编译器编译成字节码(.class)文件,然后再打包成JAR文件,在执行时Java虚拟机就从JAR文件中提取出相应的字节码文件来执行。在Android中不再使用字节码文件而是一种Android所特有的DEX(Dalvik EXecutable)文件。DEX文件的生成还是需要经过生成字节码文件的这个过程的。使用Java语言编写好的Android程序代码,同样是先用Java编译器编译成为字节码文件,但是在这之后还需通过Google提供的一个DX工具将编译好的字节码转换成为DEX文件,然后Dalvik虚拟机通过DEX文件获得执行的代码。
Google弃用字节码文件而采用特有的DEX文件格式,这表明在Android实际运行中DEX文件格式相对于字节码文件格式应该有一些独特的优势。在Java中当一个应用程序定义了多个类后,通过编译则会产生相应数目的class字节码文件,在这些字节码文件中则必然会有冗余信息,例如一些相同的类库会冗余等。而DEX文件格式则是把这些class字节码文件整合到一个DEX文件中,使得字节码中的冗余减少了,同时使整体文件的尺寸也减少了。这样一来,对于同一个应用程序来说,相对于Java的字节码文件Android的DEX文件格式在I/O操作中所需要的时间也减少了,同时也减少了查找类所需要的时间。另外DEX使用等长的指令,这样的话能够使得DEX文件尽量的简洁,从而提高了解析速度。通过上面的研究可以看出DEX文件格式是一种专为Dalvik虚拟机设计的压缩格式,该格式的高性能很适合内存和处理器速度有限的平台,从中可以看出Android是定位于嵌入式平台的一个操作系统。在这也体现出了Google给Android所定 义的发展以及战略方向,如今移动平台的网络应用已经成为当前移动终端设备的发展方向,作为网络搜索的龙头大哥,Android就是其打入该移动平台网络应用的利器。
Android应用开发和Dalvik虚拟机同样都使用Java开发语言,在应用程序开发好以后我们就需要将这个应用发布到Android移动终端设备。我们把一个开发好的应用的Java代码经过编译以后生成.class的字节码文件,通过Android的DX工具转换成.DEX格式的文件,最后使用Android的appt打包工具把DEX文件,源文件以及文件组合成一个APK应用程序包,然后就能发布到移动终端设备上了。在APK应用程序程序包发布到移动终端设备后,应用程序运行前会对其中的DEX文件进行优化,优化后的文件格式称之为DEY,DEY文件被保存到缓存区域,虚拟机会在缓存中执行这些文件。
其次,传统的Java 虚拟机是采用的是基于栈的设计,而Dalvik虚拟机则是基于寄存器设计的。
基于栈设计的虚拟机能够使指令变得简单,不需要考虑程序中的源寄存器和目的寄存器,只需要开辟栈空间而不需要为临时变量再开辟一个存储空间。另外基于栈设计的虚拟机移植性比基于寄存器设计的虚拟机要高很多,从组成原理和嵌入式操作系统课程中我们知道,一般的32位x86处理器的通用寄存器和32位的ARM的通用寄存器数目是不同的。虚拟机的设计中,为了执行的效率,有时会把这些寄存器一一映射到物理寄存器上,但是由于平台的不同,导致通用寄存器数量不同造成如果基于寄存器设计的虚拟机很难做到一一映射,执行效率就会大打折扣。而用基于栈的设计的话,就不存在这种问题,就很容易的分配寄存器。另外,基于栈设计的虚拟机采用的是零地址指令,这样的话指令形式比较紧凑。
虽然基于栈结构的虚拟机有上述的一些优点,但是为什么Google不采用基于栈的设计而采用基于寄存器结构设计Dalvik虚拟机呢。我个人觉得这是和Android所搭载的平台以及Google的战略有关的。首先,Android所搭载的主要平台为移动终端设备,如今的移动终端设备虽然性能比过去 好多了,但是还是无法摆脱CPU处理能力低于桌面PC,存储资源有限的限制,在这样一个平台上使用基于栈的设计,在指令执行时必定会多出一个进栈(PUSH)和出栈(POP)的操作,那一定会影响指令执行的效率,这也是为什么我们在一些手机平台上运行Java程序时感到很慢的原因了。其次从Google对Dalvik虚拟机设计中采用的16个通用寄存器中可以看出Android的发展方向是基于ARM的硬件平台,这也和Google的战略方向相一致。虽然移植性降低了,但是使用二地址和三地址的指令,使得代码执行效率大大提高。另外,Dalvik虚拟机虽然没有采用现在流行虚拟机技术例如JIT(just in time,及时编译)技术,但是Dalvik虚拟机仍然是一个具有很高性能的虚拟机,在这不得不说一下,Dalvik虚拟机是一个设计相当不错的虚拟机。从Dalvik虚拟机的设计上我们可以看到Google打算用Android系统来冲击手机移动终端设备,想把其提供的服务扩展到移动设备上的战略。
另外,Dalvik虚拟机的设计方面也有其独特的地方。它就是本着能够并发执行多个虚拟机的设计思路来编写的。每一个Dalvik虚拟机实例对应于一个应用程序,同时这个虚拟机实例还都是一个进程空间。换句话说就是一个应用对应一个Dalvik虚拟机同时对应一个进程空间。不同的应用程序在不同的Dalvik虚拟机实例中运行,不同的Dalvik虚拟机又对应于不同的进程空间,加之不同的应用程序在Linux内核中以不同的Linux用户来执行,这样可以最大限度的保证应用程度的独立性和安全性。但Dalvik虚拟机要实现如线程机制,内存的分配和管理等操作的话,仍然需要底层操作系统的支持。另外Dalvik虚拟机线程机制中的一个线程对应于Linux中相应的一个线程,这样操作系统中的线程就能最大限度的为Dalvik虚拟机服务。通过这样的一个设计,Android的安全性大大提高了。
说到Dalvik虚拟机,那就应该说说虚拟机中的一个特殊的虚拟机进程Zygote,之前说过一个Dalvik虚拟机对应一个进程空间。Zygote进程的功能有点类似于Linux中的1号进程,在Linux当系统启动时即产生1号进程,而其他的进程都由1号进程创建。在Dalvik虚拟机中Zygote进程fork出所有的虚拟机进程,每当系统提出执行一个Android应用时,需 要一个Dalvik虚拟机是,Zygote就会fork出一个子进程来执行该应用。使用它可以加快系统的执行,因为Zygote进程在系统启动时就产生,已经完成了虚拟机的初始化,预置类库的加载和初始化等等操作。当我们要执行一个应用而建立一个虚拟机时,只需让Zygote进程自身复制,这样就可以减少虚拟机初始化等操作的时间。另外,对于一些只读库所有虚拟机实例都和Zygote进程共享一块内存区,这样大大减少了对内存的开销。
2.1.5 Android的进程管理机制
Android虽然是基于Linux,但是它却采用了一种有别于Linux的一种管理机制。Linux在一个进程活动停止后就立刻结束该进程,而Android在一个进程活动停止后不会立刻结束该进程,并使该进程常驻内存中。直到系统资源不够需要更多内存或者当某个结束进程的事件发生时才将该进程结束。
在Android中进程被分成了前台进程(foreground)、可见进程(visible)、次要服务(secondary server)、后台进程(hidden)、内容供应节点(content provider)、空进程(empty)六种。
⑴前台进程是指一些系统进程和当前屏幕上正在显示的进程。比如说你打开Google地图查找路线,此时Google地图就是一个前台进程。⑵可见进程则是那些虽然不在前台,但是用户依然可见的进程,如输入法,时钟等,这些进程虽然不是在前台运行的,但是其存在和我们的使用却是密切相关的,如果关闭了这些应用程序将给我们的使用带来非常大的不便⑶次要服务是一些与系统功能息息相关的服务,如Google企业套件等。⑷后台进程,可以这么说后台进程就是一个前台进程被另一个前台进程替换后,进程没有结束,但是已经不再是前台进程的一个状态。在实际应用中就是当一个前台进程运行时按HOME键后的进程状态⑸内容供应节点是没有程序实体,而是仅仅提供内容给别的程序使用的比如说日历节点⑹空进程是没有任何东西在运行的进程,在一个程序退出后会有一个没有任何数据和代码在运行但是依然驻留在进程空间中的进程,该进程仅仅是作为一个能够提高该程序下次启动速度和记录程序历史记录的进程。
Android在调度以上几种进程时使用了一个系统值作为系统对进程的一个评估,当要结束一个进程时该值的数值越大的进程被系统选中并结束的概率越大。一般的,前台进程的值为0,这表明前台进程不可能被系统选中并结束。当进程进入后台以后,系统将会分配一个更高的值给该进程。相对于Linux的最近最早未使用的调度策略,Android在其基础上提供了一套独特的进程管理模块,他能让程序员使用脚本来对内存管理进行定制。比如当内存小于某个值时可以结束这个系统值大于另外一个值的进程,还可以当内存小某个值时结束上面六类进程中的一类(但顺序必须是空进程,内容供应节点,后台进程,次要服务,可见进程,最后才是前台进程)。根据这种特性 该系统值至少由两部分组成,一个是基值,另一个根据LRU(最近最久未使用)调度算法产生的一个值。对于以上说的六种进程应该分别有一系统给其赋予的值,其大小顺序应该是空进程大于内容供应节点大于后台进程大于次要服务大于可见进程大于前台进程,而这个系统赋予的值则是基值。这样就能保证一些这六种进程总是当一种进程被结束完了以后另外一种进程才会被结束,同时只需要根据这个系统值就能轻易做到对内存管理的定制。
2.1.6 应用程序框架层
在Android系统构架图中可以看到,应用程序框架层是处于Android
Runtime和库函数层于应用程序层之间,之前的叙述中知道,该层使用开发语言的是Java语言。应用程序框架是能够让开发者完全访问核心应用程序所使用的API(Application Programming Interface,应用程序编程接口),该框架能够让组件软件重用的工做简单化。同时该框架中的任何一个功能模块都是等价的,任何一个应用程序都可以发布其功能模块,该功能模块可以替代当前的任意一个功能模块,但前提是必须遵循框架的安全限制[4],另外,其他的任意应用程序能够使用这个发布的功能模块。这样的设计就使Android的构件重用率提高了。
在每一个应用程序背后,应用程序框架为其提供了一系列的服务。这些服务包括:①一个丰富并且可扩展的视图,通过这个视图我们可以使 用它提供的一些包括按钮、文本框、列表、网格等甚至可嵌入的web浏览器的应用程序来构造我们的应用程序。②内容提供器(content providers),有了内容提供器,一个应用程序可以共享它自己的数据或者访问另外一个应用程序中共享的数据。③资源管理器(resource manager),使用资源管理器,我们在应用程序中能够访问到一些如图形、布局文件等一些非代码资源。④通知管理器(notification manager),给程序员提供了一个可以在程序状态栏中显示自定义提示信息的管理器。⑤活动管理器(activity manager),提供常用导航功能用来管理应用程序生命周期的服务。通过这些应用程序框架层提供的服务程序员能够方便的开发一个界面优秀功能强大易于共享的的应用程序。
2.1.7 应用程序层
回到Android系统构架图中,应用程序层包括了如名片管理、Google
maps、浏览器等本地应用程序(native apps),如QQ、MSN、QuickOffice等第三方应用程序(third part apps),以及developer apps。同样,该层的应用程序也都使用Java语言进行开发的。
2.2 Android的应用
2.2.1 Android应用的组成
任何一个Android应用程序,都可由四个部分组成,这四个组成部分分别是①Activity;②Intent Receiver;③Service;④Content Provider[5]。对于一个应用程序来说,不一定这四个部分都需要。其中,Activity、Intent Receiver和Service是Android最基本的三个组件。其实,这四个部分全部或者其中几个的相互协调工作组成了我们平时见到的应用程序。
在Android中每个应用程序都需要一个XML配置文件AndroidManifest.xml,该配置文件用于定义我们的应用程序组件和组件的功能以及一些必要条件等。因此当我们使用到任何一个组件时都需要在这个配置文件中进行登记,否则就算是你在代码中使用了这个组件,但是Android系统也是找不到该组件的。
2.2.2 Activity
Activity是Android中最最基本的组件,实际应用中,通常就是一个单独的屏[6],也就是一个运行在前台程序在某一时刻在屏幕中所能展示的全部内容就是一个Activity。每一个Activity都是继承于Activity基类的一个子类,并且该Activity类由几个之前说过的应用程序框架提供的视图组成用户接口,实现对事件的响应。绝大部分的应用都会包含多个屏幕,例如名片管理的应用,一个屏用于显示所有的联系人,另一个屏用于显示其中某个联系人的详细信息,可能还会有用于分组信息或者用于系统设定的屏。对于这些,每一个屏都是一个Activity。当一个新的Activity执行以后,前一个Activity将暂停,并保存到系统历史堆栈当中,用户可以返回到历史堆栈中的上一个Activity。当该Activity不用时可以从历史堆栈中删除。
2.2.3 Intent Receiver
Intent Receiver有的地方也叫做Broadcast Receiver。当你希望你的应用能够捕获一个外部事件并作出响应时,比如手机快没电了,收到一条新的短信息等。这时你就可以使用一个Intent Receiver。因为Intent
Receiver只是在一个你所关注的事件发生时,会给那些关注该事件的应用程序发送一个通知,所以它并不会生成一个UI。同样的Intent Receiver也需要在中进行注册。当一个你所关注的时间发生时,我们的应用不需要主动去调用intent receiver,系统会在一个合适的时候去调用我们的程序的。
2.2.4 Service
Service是一段长生命周期的,没有用户界面的程序。我们举一个播放器的例子,来说明Service程序。当一个播放器在前台运行时我们会看到应用程序提供的一个屏,也就是之前说的Activity,这个Activity提供给用户一些操作播放器如播放、停止、下一曲等操作以及显示一些歌曲和播放列表信息的功能。但是当播放器被切换到后台以后,所有的Activity都放到历史堆栈中了,而这时播放器任然继续进行播放,而当一首歌曲播放 完了以后,还会根据播放列表中的信息播放下一首歌曲。完成这些功能的组件就是Service。当播放器的Activity利用ervice()方法启动一个Service后,这个播放器就能够在后台持续的播放音乐了。还有,对于一个Service组件,我们可以使用rvice()连接到Service上,就能通过该Service提供的接口与之进行通信。
2.2.5 Content Provider
Content Provider提供给你的应用程序与其他应用程序共享数据的一个功能。我们的应用程序可以通过Content Provider提供的一些方法来处理或者保存其他应用程序Content Provider中的数据,这样来达到数据的共享。
2.2.6
之前提到过,每一个Android应用程序都包括了一个配置文件,它对应了应用程序的说明,包括运行权限,组件的注册等。其实配置文件和使用Visual Studio开发中的很相似,但是VS的可视化的界面的缘故,只需进行简单的设置,就能自动生成该文件,所以不少的VS程序员会忽略掉该文件的存在。但是在Android应用程序开发中,该文件是不可缺少的。应用程序在运行前通过文件向系统提供一些必要的信息,让系统知道该应用程序应该如何配置。
Android应用
Content
Activity
Service
Intent
图2-3 示
先举一个文件的例子然后从该例子中详细描述一下这个配置文件:
01
02 xmlns:android="/apk/res/android" 03 package="test. hello" android: versionCode="1" 04 05 android: versionName="1.0.0"> 06 07 @string/app_name"> 08 09 10 /> android:name=".HelloAndroid"android:label=" 11 12 13 14
这是一个简单HelloAndroid程序的配置文件,从这个配置文件中我们能够知道,该应用仅包含了一个Activity。下面将对这个配置文件做一个详细的描述。
第1行是一般xml文件都有的头部信息说明,其中包括xml的版本和文件编码方式。
第2行和第14行则是一对“manifest”标签,每一个AndroidManifest配置文件中必须有且只有一对“manifest”标签,所有AndroidManifest中的描述都应该包含在这对标签中。
第3~5行是“manifest”标签的属性,这个例子中的 package属性说明应用程序的入口在这个包下面。而“android:versionCode”和“android:versionName”两个可选的属性则是说明应用程序的版本号,其中“android:versionName”是面向用户的版本号,而“android:versionCode”则是开发者使用的内部版本号。
第6行和第13行是一对“application”标签,该标签中定义了所有应用程序所使用的Activity、Intent Receiver、Service等。该标签的“android: icon”属性定义了应用程序显示在Android主界面中的图标而"@drawable/icon"表示该应用程序图标的路径为/res/drawable/icon。
第7行和第12行是一对“activity”标签。在Android的应用程序当中所有定义好的的Activity都需要在中添加一组“activity”标签,不然的话即使你定义了,但是Android应用程序也找不到。在上面给出的例子中,仅仅有一组“activity”标签,这也说明了给出的例子的应用程序只有一个Activity。紧接其后的是“activity”标 签的属性,“android: name”属性表示了Activity所对应的类,上述例子中的类是HelloAndroid类,结合package的路径,它表示的是ndroid类。另外,在属性中“android: name”的值可以直接写为“HelloAndroid”,因为其已经定义到了包下面了。“android:label”则指定了该Activity代号。
剩下的8~11行是一对定义了Activity性质的“intent-filter”标签以及“intent-filter”包含的另外两个标签“action”和“category”标签之所以这几个标签一同说是因为“intent-filter”标签的性质是由“action”和“category”标签来说明的。也就是说AndroidManifest中上层的标签的性质由下层标签来描述。应用程序的组件为了告诉Android该组件能够相应和处理那些Intent请求可以使用一个或者多个的“intent-filter”的标签,同时一个“intent-filter”标签至少应该包含一个“action”标签。我们再回到例子的这四行代码中,“action”标签中的“android:name”属性的值为,表明该Activity是这个应用程序的进入点,另外,“category”标签中的“android:name”属性值为ER说明了当启动了应用程序以后,应当先执行这个Activity。
对于配置中还有“receiver”,“service”和“provider”标签,分别对应了剩下的Intent Receiver、Service和Content
Provider三个应用的组成部分。同样,每个Intent Receiver和Service以及Content Provider都需要到中进行描述后才能找到。
2.3 Android 文件系统
当Android系统部署到相应的硬件平台上以后,和Linux系统一样,势必有一个系统文件夹,用来存放一些系统程序和数据以及一些用户数据。下面就将介绍一下Android的系统文件夹
2.3.1 系统文件夹分析
①systemapp:这里存放的程序为系统默认的组件自己安装的引用程序一般不放在该文件夹下。同时可以看到,该文件夹下的文件都是APK格式的文件。
②systembin:该目录下都是系统的本地程序,主要为Linux系统自带的组件。而从文件夹名字可以看出都是二进制代码程序。这个文件夹和Linux系统下的systembin文件夹没多大区别。
③systemetc:与Linux系统下的systemetc文件夹没有本质的区别,都用于保存系统的配置文件。
④systemfonts:从名字上可以看出用于存放字体的文件夹。
⑤systemframework:主要存放核心文件,其文件后缀名为jar,可以看出为系统构架平台。
⑥systemlib:用于存放系统底层库。
⑦systemmedia:存放铃声的文件夹
⑧systemsounds:用于存放音乐文件。
⑨systemusr:用户文件夹,如同Linux中的usr文件夹一样,存放一些用户信息,包含键盘布局,用户命令,共享和时间区域信息文件。
从以上系统文件夹的构造中看出,Android的系统文件夹结构继承了Linux系统的系统文件夹组成,但是又有一些Android独特的地方,就是其在Linux系统文件夹的基础上进行了一些删减,使得该系统文件夹更加精简,更加一目了然。
2.3.2 系统构架与系统文件的对应
在这之前介绍了Android的系统架构,但是这个架构如何在Android系统中体现呢?下面将介绍一下,同样从下到上的顺序进行描述。
Linux内核层。Linux内核给其上层的软件和下层硬件间建立起一个抽 象层,其内核的组件都存放在systembin文件夹下面,如systembinsystem_server 系统服务和systembindbus-daemon 系统BUS总线监控以及systembinapp_process 系统进程等。
Android Runtime和函数库层。其中函数库都放于systemlib下,如音频库和系统C库。同时Android Runtime中的Android Libraries也存放在这个文件夹下,与其相对应的文件为systemliblibandroid_。而Dalvik虚拟机则放于systembin文件夹下,它的对应文件为systembindalvikvm。
应用程序框架层。该层的文件一般都存放到systemframework,如核心库,Android系统应用程序框架中的一些主要如Activity Manager,Content Provider等。
应用程序层。这层的本地应用文件都存于systemapp文件夹下,如提供短信和彩信功能的、提供电话拨号功能的和能够提供Google服务的Google程序包。但是像MSN第三方软件保存位置为data文件夹下。 3 Android的开发
3.1 Android开发工具
前面说过,Android的上层应用程序是用Java语言开发的,同时需要基于Dalvik虚拟机,所以Google公司推荐使用主流的Java继承开发环境
Eclipse。有了Eclipse还不够,因为使用Java语言进行开发,应该有由SUN公司提供的Java SDK(其中包含了JRE:Java Runtime Environment)。另外,Android的应用程序开发还是和Java开发有一定区别,所以还需有一个Google提供的Android SDK。有了这三个软件就可以开发Android应用程序了。
3.2 Android开发平台的搭建
Android开发平台搭建步骤很简单,但是和我们的论文没多大关系,所以具体步骤参见附录1。 当平台搭建好以后需要创建一个Android Virtual
Device,这一步是很关键的一步,如果不创建这个AVD的话,在Eclipse中编译运行Android应用程序时就会提示找不到AVD,从而无法编译。在DOS界面下运行Android SDK文件夹中tools目录下的工具,其命令是android create avd –name avd15r1 – target 2,使用这个命令之后会提示是否创建一个AVD,输入yes之后会提示设置AVD的一些属性,如内存信息等。要说明的是name后面的avd15r1是Android Virtual Device的名字,可以自由选取。而我起这个名字的意义是avd使用1.5r1版本的SDK。
简单的几步就将Android的开发平台搭建好了,虽然我使用的是Windows7操作系统,但是方法同样适用于Windows xp等其他Windows 平台。在一个应用程序设计好了以后,点击Eclipse中的run,就可以看到启动了一个叫做avd15r1的Android模拟器,同时,在模拟器中就能找到你所编写的应用程序。
3.3 系统功能介绍
本系统功能主要有通信录功能,游戏,文件浏览器,视频播放器。
通信录功能:模仿手机中的通信录功能实现对手机联系人的添加,修改,删除。
游戏:此游戏是一款简单的坦克大战游戏通过方向键控制己方坦克的移动方向,确认键发射子弹,并记录消灭敌人的数量。
文件浏览器:通过此功能可以浏览多种格式的文本文件
视频播放器:此功能可实现视频的播放
3.3.1 系统功能模块图:
主界面
通信录
文件浏览器
游戏
视频播放器
3.3.2 功能流程图
开机进入主界面
点击视频
视频播放器
点击文件浏览
文件浏览器
器图标
图标
点击通信录标
判断用户点击的图标
点击主界面功能模块图标
点击游戏标
游戏
通信录
3.3.3 功能实现界面
主界面:
游戏界面:
通信录界面:
(创建联系人)
(修改联系人)
(删除联系人)
文件浏览器界面:
视频播放器:
4 系统详细设计
结论
通过对Android系统的层次上分析以及借助Android提供的Intent机制的应用开发,增进了我对这个新生的系统的了解。
在对系统方面的研究中,我明白了Android的应用是怎么在系统上运行的。其中吸引我的地方就是Android的Runtime,在这,我看到了Google设计的Dalvik虚拟机不同于传统Java虚拟机的地方,这个虚拟机在移动终端设备CPU速度低,资源有限的环境下也能很高效率的运行,这无疑也证明了Android这个系统的成功。还有,Android上层采用了Java语言作为开发,让开发更为简单,可以使Java SE阵营的开发者不需要花太多的时间便能转投Android阵营,这样自然的为Android开发提供大量的人力资源。这样才致使Android在短时间内具有大量的应用,同时也使得许多手机生产商使用该系统的原因之一。
在对程序的开发中,我理解了Android的Intent机制在应用上的作用。一个应用的多个组件通过Intent机制联系在一起,这样各个组件之间的信息交换提高了,而程序的灵活性也提高了,给开发者的创造空间也增加了。
有了Google Android这些很强劲的优势,我想,在不久的将来伴随着3G的普及,Android必定能改变现在只能手机市场的格局,开辟出一个新的世界。
致谢
首先我在这里向养育和培养我的父母表示深深地思念和感谢,再向关心我,帮助我的老师和同学表示感谢!
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
1.
8
51
32
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59. 9660.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88. 51
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100. 8
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
2023年12月6日发(作者:綦傲霜)
1 绪论
1.1 智能手机平台
智能手机具有独立的操作系统,像个人电脑一样支持用户自行安装软件、游戏等第三方服务商提供的程序,并通过此类程序不断对手机的功能进行扩充,同时可通过移动通讯网络来实现无线网络接入。目前,全球多数手机厂商都有智能手机产品,而芬兰诺基亚、美国苹果、加拿大RIM(黑莓)、美国摩托罗拉、中国台湾宏达(htc)更是智能机中的佼佼者。
智能手机具有五大特点:1. 具备无线接入互联网的能力,即需要支持GSM网络下的GPRS或者CDMA网络的CDMA 1X或3G网络。 2. 具有PDA的功能,包括PIM(个人信息管理),日程记事,任务安排,多媒体应用,浏览网页。 3. 具有开放性的操作系统,可以安装更多的应用程序,使智能手机的功能可以得到无限扩展。4. 人性化,可以根据个人需要扩展机器功能。5. 功能强大,扩展性能强,第三方软件支持多。
1.1.1 Symbian
Symbian(中文名:塞班)是一个实时性、多任务的纯32位操作系统,具有功耗低、内存占用少等特点,非常适合手机等移动设备使用,经过不断完善,但是虽然在智能型手机市场取得了无比的成功,并长期居于首位,Symbian S60、Symbian3,UIQ等(尤其是S60)系统近两年亦遭遇到显著的发展瓶颈。最近12个月欧洲手机公司诺基亚(Nokia)在智能手机市场市占率的滑落是不争的事实。需要注意的是,并不是所有的Symbian系统都是智能系统,比如S40系统,就不属于智能手机系统。
1.1.2 Android
Android ( 中文名:安卓) 是基于Linux平台开源手机操作系统名称,该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。目前在市场上可谓如日中天,越来越受到玩家的青睐,倍受摩托罗拉推崇。在Android发展的过程中, 摩托罗拉付出的是核心代码,Google付出的是公关和品牌效应,当然还有它的google app,但是Google掌握了Android Market以及通过android
google apps获得的大量用户。
1.1.3 OS(Tapas)
点心操作系统(Tapas OS)是一款基于Android操作平台、针对中国用户使用习惯打造的互联网智能手机操作系统,在底层技术架构优化的基础上,为用户提供流畅的操作体验;同时根据本土化需求,提供贴心的功能设计及丰富的移动互联网应用。点心操作系统由北京风灵创景科技有限公司开发。该公司是李开复博士旗下的创新工场投资孵化的第一家公司。此外,点心还推出“均衡云计算”理念,整合网络环境、终端设备等负责状况,智能分配手机端及云端计算量、管理流量分配,为用户提供安全贴心的云计算服务。
1.1.4 Windows Mobile
作为软件巨头微软的掌上版本操作系统,在与桌面PC和Office办公的兼容性方面具有先天的优势,而且WM具有强大的多媒体性能,办公娱乐两不误,让他成为最有潜力的操作系统之一。以商务用机为主,目前市场已显出颓势,最新版本为Windows Phone 7,几乎对旧有的WM系统全盘推翻再造,其应用机型已逐渐上市,不过价格不菲。
1.1.5 iOS
ios是(又称MAC OS)由苹果公司为iPhone开发的操作系统,它主要是给iPhone、iPod touch以及iPad使用。最新版本为iOS4.3.2,该系统的UI设计及人机操作前所未有的优秀,软件极其丰富。苹果完美的工业设计配以iOS系统的优秀操作感受,就靠仅有的几款机型,已经赢得可观的市场份额。
1.1.6 MeeGo
MeeGo是诺基亚和英特尔宣布推出一个免费手机操作系统,中文昵称米狗,该操作系统可在智能手机、笔记本电脑和电视等多种电子设备上 运行,并有助于这些设备实现无缝集成。这种基于Linux的平台被称为MeeGo,融合了诺基亚的Maemo和英特尔的Moblin平台。
1.1.7 Web OS
Web OS(又称Palm os)以其独特的外形,另类的系统吸引了无数人的眼球,但是一个问题,就是目前没有任何正规途径,还有应用软件的问题,配套太少。Web OS系统目前仍有很多的计算机编程爱好者,在努力的专研。目前也Palm公司被惠普收购。希望其在主流系统云集的将来,不被陨殁!
1.1.8 BlackBerry OS
BlackBerry OS是RIM公司独立开发出的与黑莓手机配套的系统,目前在全世界都颇受欢迎,在此系统基础上,黑莓的手机更是独树一帜的在智能手机市场拼搏,目前也已在中国形成了大笔粉丝。望其开发的愈来愈好,道路愈走愈宽!
1.1.9 三星Bada
bada是韩国三星公司自行开发的智能手机平台,支持丰富功能和用户体验的软件应用,于2009年11月10日发布。bada在韩语里是“海洋”的意思。 bada的设计目标是开创人人能用智能手机的时代。它的特点是配置灵活、用户交互性好、面向服务,非常重视SNS集成和地理位置服务应用。 bada系统由操作系统核心层、设备层、服务层和框架层组成。支持设备应用、服务应用和Web与Flash应用。
1.2 Android 平台介绍
Android从诞生到现在也不过3年的时间,但是也就是在这短短的3年内Android创造了一个迅速被人们知晓并追捧的奇迹。2007 年11 月5 日,Google 与其他33 家手机制造商(包含摩托罗拉、宏达电、三星、LG)、手机晶片供应商、软硬体供应商、电信业者所联合组成的开放手持装置联盟 (Open Handset Alliance),发布了名为Android的开放手机软硬体平台。该联盟的成员宣布日后都会在Android平台上开发他们的新的业务。不久之后的2008 年9 月24 日,T-Mobile 公司首度公布第一台Android 手机(G1)的细节,同日Google 也放出了Android SDK 1.0 rc1。这样Android进入了人们的视线。
Android以其特有的开放性优势越来越受到人们和智能手机厂商的关注。
对于第三放软件开发商来说,Android 是一个真正意义上的开放性移动设备综合平台,Android系统是免费向开发人员提供的,这样就避免了开发中专利权的障碍。因此,就能够为第三方软件开发商省下大笔资金。
对于设备制造商来说,Android是一个免费的平台。当设备制造商每制造一台手机时,那些支付给手机系统制造商的费用也省去了,这样也降低了每台手机的生产费用,同时就降低了手机的价格,这样在市场上也提高了竞争力。
对硬体开发厂商来说,Android也是个开放的平台。使用Android平台的厂商可以更具自己的需求以及能力为Android开发具有该厂商特色的功能,但是这样的增加完全不用考虑版权的问题。
同时Android平台支持各种先进的网络、绘图、3D 处理能力,可以用来提供更好的使用者体验。
Google Android 系统作为一个完全开源的操作系统,是由操作系统(Linux)、中间件以及核心应用程序组成的软件栈(software stack)。通过
android SDK 提供的 API 以及相应的开发工具, 程序员可以很方便的开发android平台上的应用程序。其整个系统由应用程序(Application),应用程序框架(Application Framework),应用程序库(Libraries),Android运行库(Android Runtime),Linux内核(Linux Kernel)五个部分组成。Android操作系统内置了一部分应用程序, 包括电子邮件客户端、SMS程序、日历、地图、浏览器、通讯录以及其他的程序,值得一提的是这些所 有的程序都是用java编写的。
因为应用程序框架使得组件更易于重用,所以开发者的应用程序可以很容易的调用API函数实现我们想要的功能。在遵守应用程序框架的安全机制约束的前提下,开发者开发的一个应用程序可以使用其他程序所开发的功能。虽然Android的应用程序是用Java语言开发的,但是Android给应用程序开发者提供了一系列的 C/C++ 程序库,通过Android的一些特殊的设计,我们开发者可以使用这些库,这在后面的叙述中将看到。
现今,Android操作系统已成为许多手机制造商的宠儿,其中包括HTC、索尼爱立信、Samsung、摩托罗拉以及国内的联想、华为、海尔、华禹等。其中值得一提的是摩托罗拉公司,就在2009年11月凭借其一款搭载Android平台的Droid手机,两个月内就突破百万台,击败了苹果的iPhone
3GS,被《时代》杂志评选为“年度最佳科技产品”。因此告别了两年多的低迷态势,走出了泥潭。 2 Android的系统研究
2.1 Android构架
2.1.1 Android的构架综述
Android是一个包括操作系统,中间件以及一些重要应用程序的专门针对移动设备的层次结构的软件集[1]。作为一个层次结构的软件集,一定有一个层次的系统构架,下图为Android的构架图:
图2-1 Android 系统构架
从图2-1中明显的可以看出该系统从下到上包括Linux内核层、Libraries和运行时环境层、应用程序框架层、应用程序层四层结构。在Android的最下层的操作系统基于Linux2.6内核,往上的中间件包括Libraries和运行时环境层和应用程序框架层两个层次,最上层则是应用程序层。
在Android构架中,可以很明显的看到,底层的Linux内核则采用的是C语言,libraries采用C或者C++,但是应用程序层、应用程序框架层和运行时环境中的Android核心库采用Java语言编写,也就是说Android虽然底层用的是C或者C++但是应用程序的开发则用的是Java。Google采用这样的模式可能是因为相对于C或者C++,Java的开发周期更短的缘故,这样的话就能在短时间内为Android提供大量的应用软件。我们知道,作为一个智能手机平台,只有拥有了大量的源源不断的应用程序作为支持,才能受人们的欢迎,从而才能占领市场。之前Nokia的s60第三版就是一个很好的例子,因此Nokia S60v3的系统才被世人所熟知,并且曾经在智能手机行业占有很大的市场。而另一个例子就是Linux系统,在所有操作系统中,稳定性和性能上能够和Linux抗衡的系统不多吧,但是在智能手机市场上为什么Linux却可以说是一败涂地,其原因也和其第三方应用少是脱不了关系的。
2.1.2 内核层
Google Android 作为一个开源的操作系统其内核采用了同样开源的被业界认为是相当稳定的Linux作为其内核,其中Linux内核包括以下功能模块:安全(Security)、存储器管理(Memory Management)、进程管理(Process Management)、网络堆栈(Network Stack)、驱动程序模型(Driver
Model)等,另外也在给其上层的软件和下层硬件间建立起一个抽象层(Abstraction Layer)。同时Android在Linux 2.6的内核上进行了一些增加和删改,使Linux更加适应ARM平台。
⑴增加了一个基于ARM构架的GoldFish平台作为虚拟机的虚拟CPU。
⑵增加了YAFFS2 FLASH系统文件,因此增加了对NANDFLASH支持。
⑶增加了Android相关的驱动。例如Android的IPC(进程间通信机制)binder,使用这个能使运行的进程为其他进程提供服务;Android的日志系统(Logger)和内存控制台(Ram_console);同时Google还重写了电源管理(Power)
⑷增加了新的共享方式Ashmem(匿名共享内存),多个应用程序可以这种方式共享内存获取信息,为进程间提供大量共享内存,同时为内核提供回收和管理这个内存的机制。
2.1.3 Android Runtime和函数库层
2.1.3.1 函数库
Android 包含一些C/C++库,Android系统中的各种不同组件都能够使用这些库函数。这些库函数通过Android 应用程序框架为开发者提供服务。以下列举了一些库函数[2]:
①系统 C 库-一个专门为Embedded Linux设备定制的从BSD(Berkeley
Software Distribution 伯克利软件套件)继承来的标准C系统函数库。
②媒体库 - 基于 PacketVideo公司的OpenCORE开发设计的。该库支持MPEG4, H.264, MP3, AAC, AMR, JPG, PNG多种常用的音频、视频格式的回放和录制,同时支持静态图像文件。
③Surface Manager - 对显示子系统的管理,并且为多个应用程序提
供了2D和3D图层的无缝融合,提供如同类似iPhone的界面管理功能。
④LibWebCore - 一个支持Android浏览器和一个可嵌入的web视图的最新的web浏览器引擎。
⑤3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使用硬件
3D加速(如果可用)或者使用高度优化的3D软加速。
⑥SQLite - 一个功能强劲的轻型关系型数据库引擎,Android中所有应用程序都可以调用它。
⑦FreeType -位图(bitmap)和矢量(vector)字体显示。
⑧SGL - 底层的2D图形引擎。
2.1.3.2 Android Runtime
前面说到Android采用Java作为应用程序的开发语言,但是虽然使用的是Java语言,但是Google却没使用传统的Java Runtime来执行应用程序而是采用Android自己特有的Android Runtime。从Android 的系统构架图中可以清楚的看到,Android Runtime由Android函数库(Android
Libraries)和Dalvik虚拟机组成[3]。
Android函数库中里包含了大部分Java程序语言所需要调用的函数库,如data structure, network, utilities, file system等,其中很多代码是源于2005年的Apache Harmony项目。这样做的话能够使Android的虚拟机的类库与Java SE的类库有非常大的相似性,进而提高了Java SE类库的兼容性,最大限度的降低了一个程序员从Java平台开发到Andorid平台开发的难度,这样就降低了对Android开发的准备时间以及前期培训的费用,从而降低了Android应用程序开发的周期以及开发费用,这样的话短时间内就能让Google Android系统能够拥有大量的可执行的应用程序。另外,使用Apache Harmony 类库还能完全摆脱Sun的束缚而走上完全开源的Java之路,这样也奉行了Google对Android完全开源的原则。
我们知道,对一个应用程序而言,都采用一个属于该应用程序的进程作为执行的载体,同样,对于Android也是,一个应用程序也是有一个属于它的进程。之前说过Android采用Java作为开发语言,在进程执行时应该会有一个Java虚拟机来为进程提供服务。在Android构架图中可以看到,
该系统采用的是一个叫做Dalvik的虚拟机。在前面的研究中我们了解到Dalvik虚拟机是一个Java 虚拟机,但是又和Java虚拟机有所不同。Dalvik虚拟机和传统的Java虚拟机所不同之处的是传统的Java虚拟机是一个虚拟机来为不同应用程序提供服务,而Google自己开发的Dalvik虚拟机则是每一个Android应用程序都拥有一个其自身的Dalvik虚拟机,换句话说就是专属于每一个应用程序对应着一个Dalvik虚拟机而这个Dalvik虚拟机相当于一个执行个体。有关Dalvik虚拟机的内容将在下一个部分详细说明。
Android函数库和Dalvik虚拟机组成了Android的运行时环境。从图 中可以看到,Android Runtime和Libraries在同一层,建立在Linux Kernel
层之上,与Linux Kernel 没有交集,而是直接嵌套到libraries中。我们之前说过,我们开发者可以调用C和C++的一些类库。其实就是这样Android
Runtime与Libraries在同一层的设计并同时让Android Runtime 中的Android Libraries 引用libraries中的函数,而通过Dalvik虚拟机编译以后再调用这些函数做到上面所述的功能。
也就是说其实Android Libraries中的函数只是libraries中的一些引用,当一个上层的应用程序调用Dalvik虚拟机中的核心库函数时,调用的其实只是一个函数名,并不是函数的具体实现,然后Dalvik虚拟机对该函数进行一些处理以后再通过Dalvik虚拟机调用libraries中的相应函数,使之运行。换句话说就是,Android Libraries中的只是一个函数名,而真正代码的实现是libraries中的C或者C++代码。这样的好处就在于那些使用Java语言很难实现但是在C或者C++却能很容易实现的功能也能通过Java很容易等的实现。
Android
调应用程序进程
交给Dalvik虚拟机进行处理
Dalvik虚拟Dalvik虚拟机调用Libraries用Android
图2-2 应用程序调用Android Libraries中函数2.1.4 Dalvik 虚拟机
Dalvik虚拟机是Android Runtime的一个组成部分,之所以要把他拿出来单独进行研究是因为,Dalvik虚拟机作为一个Java虚拟机,但它和普 通的Java虚拟机有着一些不同。Google的工程师结合传统的Java 虚拟机,根据Android使用的平台一般为移动终端设备这样一个特点重新设计的虚拟机,这个虚拟机在移动终端设备上运行效率上明显比传统的Java 虚拟机要高许多。Dalvik虚拟机对内存的高效使用和在低速的CPU上表现出的高性能,确实让人们刮目相看。
Android的上层应用程序虽然是用Java开发的,但是Dalvik虚拟机却和传统的Java虚拟机有着很大的区别,两者是不兼容的。
首先,众所周知在Java 中,所有的程序代码会被编译器编译成字节码(.class)文件,然后再打包成JAR文件,在执行时Java虚拟机就从JAR文件中提取出相应的字节码文件来执行。在Android中不再使用字节码文件而是一种Android所特有的DEX(Dalvik EXecutable)文件。DEX文件的生成还是需要经过生成字节码文件的这个过程的。使用Java语言编写好的Android程序代码,同样是先用Java编译器编译成为字节码文件,但是在这之后还需通过Google提供的一个DX工具将编译好的字节码转换成为DEX文件,然后Dalvik虚拟机通过DEX文件获得执行的代码。
Google弃用字节码文件而采用特有的DEX文件格式,这表明在Android实际运行中DEX文件格式相对于字节码文件格式应该有一些独特的优势。在Java中当一个应用程序定义了多个类后,通过编译则会产生相应数目的class字节码文件,在这些字节码文件中则必然会有冗余信息,例如一些相同的类库会冗余等。而DEX文件格式则是把这些class字节码文件整合到一个DEX文件中,使得字节码中的冗余减少了,同时使整体文件的尺寸也减少了。这样一来,对于同一个应用程序来说,相对于Java的字节码文件Android的DEX文件格式在I/O操作中所需要的时间也减少了,同时也减少了查找类所需要的时间。另外DEX使用等长的指令,这样的话能够使得DEX文件尽量的简洁,从而提高了解析速度。通过上面的研究可以看出DEX文件格式是一种专为Dalvik虚拟机设计的压缩格式,该格式的高性能很适合内存和处理器速度有限的平台,从中可以看出Android是定位于嵌入式平台的一个操作系统。在这也体现出了Google给Android所定 义的发展以及战略方向,如今移动平台的网络应用已经成为当前移动终端设备的发展方向,作为网络搜索的龙头大哥,Android就是其打入该移动平台网络应用的利器。
Android应用开发和Dalvik虚拟机同样都使用Java开发语言,在应用程序开发好以后我们就需要将这个应用发布到Android移动终端设备。我们把一个开发好的应用的Java代码经过编译以后生成.class的字节码文件,通过Android的DX工具转换成.DEX格式的文件,最后使用Android的appt打包工具把DEX文件,源文件以及文件组合成一个APK应用程序包,然后就能发布到移动终端设备上了。在APK应用程序程序包发布到移动终端设备后,应用程序运行前会对其中的DEX文件进行优化,优化后的文件格式称之为DEY,DEY文件被保存到缓存区域,虚拟机会在缓存中执行这些文件。
其次,传统的Java 虚拟机是采用的是基于栈的设计,而Dalvik虚拟机则是基于寄存器设计的。
基于栈设计的虚拟机能够使指令变得简单,不需要考虑程序中的源寄存器和目的寄存器,只需要开辟栈空间而不需要为临时变量再开辟一个存储空间。另外基于栈设计的虚拟机移植性比基于寄存器设计的虚拟机要高很多,从组成原理和嵌入式操作系统课程中我们知道,一般的32位x86处理器的通用寄存器和32位的ARM的通用寄存器数目是不同的。虚拟机的设计中,为了执行的效率,有时会把这些寄存器一一映射到物理寄存器上,但是由于平台的不同,导致通用寄存器数量不同造成如果基于寄存器设计的虚拟机很难做到一一映射,执行效率就会大打折扣。而用基于栈的设计的话,就不存在这种问题,就很容易的分配寄存器。另外,基于栈设计的虚拟机采用的是零地址指令,这样的话指令形式比较紧凑。
虽然基于栈结构的虚拟机有上述的一些优点,但是为什么Google不采用基于栈的设计而采用基于寄存器结构设计Dalvik虚拟机呢。我个人觉得这是和Android所搭载的平台以及Google的战略有关的。首先,Android所搭载的主要平台为移动终端设备,如今的移动终端设备虽然性能比过去 好多了,但是还是无法摆脱CPU处理能力低于桌面PC,存储资源有限的限制,在这样一个平台上使用基于栈的设计,在指令执行时必定会多出一个进栈(PUSH)和出栈(POP)的操作,那一定会影响指令执行的效率,这也是为什么我们在一些手机平台上运行Java程序时感到很慢的原因了。其次从Google对Dalvik虚拟机设计中采用的16个通用寄存器中可以看出Android的发展方向是基于ARM的硬件平台,这也和Google的战略方向相一致。虽然移植性降低了,但是使用二地址和三地址的指令,使得代码执行效率大大提高。另外,Dalvik虚拟机虽然没有采用现在流行虚拟机技术例如JIT(just in time,及时编译)技术,但是Dalvik虚拟机仍然是一个具有很高性能的虚拟机,在这不得不说一下,Dalvik虚拟机是一个设计相当不错的虚拟机。从Dalvik虚拟机的设计上我们可以看到Google打算用Android系统来冲击手机移动终端设备,想把其提供的服务扩展到移动设备上的战略。
另外,Dalvik虚拟机的设计方面也有其独特的地方。它就是本着能够并发执行多个虚拟机的设计思路来编写的。每一个Dalvik虚拟机实例对应于一个应用程序,同时这个虚拟机实例还都是一个进程空间。换句话说就是一个应用对应一个Dalvik虚拟机同时对应一个进程空间。不同的应用程序在不同的Dalvik虚拟机实例中运行,不同的Dalvik虚拟机又对应于不同的进程空间,加之不同的应用程序在Linux内核中以不同的Linux用户来执行,这样可以最大限度的保证应用程度的独立性和安全性。但Dalvik虚拟机要实现如线程机制,内存的分配和管理等操作的话,仍然需要底层操作系统的支持。另外Dalvik虚拟机线程机制中的一个线程对应于Linux中相应的一个线程,这样操作系统中的线程就能最大限度的为Dalvik虚拟机服务。通过这样的一个设计,Android的安全性大大提高了。
说到Dalvik虚拟机,那就应该说说虚拟机中的一个特殊的虚拟机进程Zygote,之前说过一个Dalvik虚拟机对应一个进程空间。Zygote进程的功能有点类似于Linux中的1号进程,在Linux当系统启动时即产生1号进程,而其他的进程都由1号进程创建。在Dalvik虚拟机中Zygote进程fork出所有的虚拟机进程,每当系统提出执行一个Android应用时,需 要一个Dalvik虚拟机是,Zygote就会fork出一个子进程来执行该应用。使用它可以加快系统的执行,因为Zygote进程在系统启动时就产生,已经完成了虚拟机的初始化,预置类库的加载和初始化等等操作。当我们要执行一个应用而建立一个虚拟机时,只需让Zygote进程自身复制,这样就可以减少虚拟机初始化等操作的时间。另外,对于一些只读库所有虚拟机实例都和Zygote进程共享一块内存区,这样大大减少了对内存的开销。
2.1.5 Android的进程管理机制
Android虽然是基于Linux,但是它却采用了一种有别于Linux的一种管理机制。Linux在一个进程活动停止后就立刻结束该进程,而Android在一个进程活动停止后不会立刻结束该进程,并使该进程常驻内存中。直到系统资源不够需要更多内存或者当某个结束进程的事件发生时才将该进程结束。
在Android中进程被分成了前台进程(foreground)、可见进程(visible)、次要服务(secondary server)、后台进程(hidden)、内容供应节点(content provider)、空进程(empty)六种。
⑴前台进程是指一些系统进程和当前屏幕上正在显示的进程。比如说你打开Google地图查找路线,此时Google地图就是一个前台进程。⑵可见进程则是那些虽然不在前台,但是用户依然可见的进程,如输入法,时钟等,这些进程虽然不是在前台运行的,但是其存在和我们的使用却是密切相关的,如果关闭了这些应用程序将给我们的使用带来非常大的不便⑶次要服务是一些与系统功能息息相关的服务,如Google企业套件等。⑷后台进程,可以这么说后台进程就是一个前台进程被另一个前台进程替换后,进程没有结束,但是已经不再是前台进程的一个状态。在实际应用中就是当一个前台进程运行时按HOME键后的进程状态⑸内容供应节点是没有程序实体,而是仅仅提供内容给别的程序使用的比如说日历节点⑹空进程是没有任何东西在运行的进程,在一个程序退出后会有一个没有任何数据和代码在运行但是依然驻留在进程空间中的进程,该进程仅仅是作为一个能够提高该程序下次启动速度和记录程序历史记录的进程。
Android在调度以上几种进程时使用了一个系统值作为系统对进程的一个评估,当要结束一个进程时该值的数值越大的进程被系统选中并结束的概率越大。一般的,前台进程的值为0,这表明前台进程不可能被系统选中并结束。当进程进入后台以后,系统将会分配一个更高的值给该进程。相对于Linux的最近最早未使用的调度策略,Android在其基础上提供了一套独特的进程管理模块,他能让程序员使用脚本来对内存管理进行定制。比如当内存小于某个值时可以结束这个系统值大于另外一个值的进程,还可以当内存小某个值时结束上面六类进程中的一类(但顺序必须是空进程,内容供应节点,后台进程,次要服务,可见进程,最后才是前台进程)。根据这种特性 该系统值至少由两部分组成,一个是基值,另一个根据LRU(最近最久未使用)调度算法产生的一个值。对于以上说的六种进程应该分别有一系统给其赋予的值,其大小顺序应该是空进程大于内容供应节点大于后台进程大于次要服务大于可见进程大于前台进程,而这个系统赋予的值则是基值。这样就能保证一些这六种进程总是当一种进程被结束完了以后另外一种进程才会被结束,同时只需要根据这个系统值就能轻易做到对内存管理的定制。
2.1.6 应用程序框架层
在Android系统构架图中可以看到,应用程序框架层是处于Android
Runtime和库函数层于应用程序层之间,之前的叙述中知道,该层使用开发语言的是Java语言。应用程序框架是能够让开发者完全访问核心应用程序所使用的API(Application Programming Interface,应用程序编程接口),该框架能够让组件软件重用的工做简单化。同时该框架中的任何一个功能模块都是等价的,任何一个应用程序都可以发布其功能模块,该功能模块可以替代当前的任意一个功能模块,但前提是必须遵循框架的安全限制[4],另外,其他的任意应用程序能够使用这个发布的功能模块。这样的设计就使Android的构件重用率提高了。
在每一个应用程序背后,应用程序框架为其提供了一系列的服务。这些服务包括:①一个丰富并且可扩展的视图,通过这个视图我们可以使 用它提供的一些包括按钮、文本框、列表、网格等甚至可嵌入的web浏览器的应用程序来构造我们的应用程序。②内容提供器(content providers),有了内容提供器,一个应用程序可以共享它自己的数据或者访问另外一个应用程序中共享的数据。③资源管理器(resource manager),使用资源管理器,我们在应用程序中能够访问到一些如图形、布局文件等一些非代码资源。④通知管理器(notification manager),给程序员提供了一个可以在程序状态栏中显示自定义提示信息的管理器。⑤活动管理器(activity manager),提供常用导航功能用来管理应用程序生命周期的服务。通过这些应用程序框架层提供的服务程序员能够方便的开发一个界面优秀功能强大易于共享的的应用程序。
2.1.7 应用程序层
回到Android系统构架图中,应用程序层包括了如名片管理、Google
maps、浏览器等本地应用程序(native apps),如QQ、MSN、QuickOffice等第三方应用程序(third part apps),以及developer apps。同样,该层的应用程序也都使用Java语言进行开发的。
2.2 Android的应用
2.2.1 Android应用的组成
任何一个Android应用程序,都可由四个部分组成,这四个组成部分分别是①Activity;②Intent Receiver;③Service;④Content Provider[5]。对于一个应用程序来说,不一定这四个部分都需要。其中,Activity、Intent Receiver和Service是Android最基本的三个组件。其实,这四个部分全部或者其中几个的相互协调工作组成了我们平时见到的应用程序。
在Android中每个应用程序都需要一个XML配置文件AndroidManifest.xml,该配置文件用于定义我们的应用程序组件和组件的功能以及一些必要条件等。因此当我们使用到任何一个组件时都需要在这个配置文件中进行登记,否则就算是你在代码中使用了这个组件,但是Android系统也是找不到该组件的。
2.2.2 Activity
Activity是Android中最最基本的组件,实际应用中,通常就是一个单独的屏[6],也就是一个运行在前台程序在某一时刻在屏幕中所能展示的全部内容就是一个Activity。每一个Activity都是继承于Activity基类的一个子类,并且该Activity类由几个之前说过的应用程序框架提供的视图组成用户接口,实现对事件的响应。绝大部分的应用都会包含多个屏幕,例如名片管理的应用,一个屏用于显示所有的联系人,另一个屏用于显示其中某个联系人的详细信息,可能还会有用于分组信息或者用于系统设定的屏。对于这些,每一个屏都是一个Activity。当一个新的Activity执行以后,前一个Activity将暂停,并保存到系统历史堆栈当中,用户可以返回到历史堆栈中的上一个Activity。当该Activity不用时可以从历史堆栈中删除。
2.2.3 Intent Receiver
Intent Receiver有的地方也叫做Broadcast Receiver。当你希望你的应用能够捕获一个外部事件并作出响应时,比如手机快没电了,收到一条新的短信息等。这时你就可以使用一个Intent Receiver。因为Intent
Receiver只是在一个你所关注的事件发生时,会给那些关注该事件的应用程序发送一个通知,所以它并不会生成一个UI。同样的Intent Receiver也需要在中进行注册。当一个你所关注的时间发生时,我们的应用不需要主动去调用intent receiver,系统会在一个合适的时候去调用我们的程序的。
2.2.4 Service
Service是一段长生命周期的,没有用户界面的程序。我们举一个播放器的例子,来说明Service程序。当一个播放器在前台运行时我们会看到应用程序提供的一个屏,也就是之前说的Activity,这个Activity提供给用户一些操作播放器如播放、停止、下一曲等操作以及显示一些歌曲和播放列表信息的功能。但是当播放器被切换到后台以后,所有的Activity都放到历史堆栈中了,而这时播放器任然继续进行播放,而当一首歌曲播放 完了以后,还会根据播放列表中的信息播放下一首歌曲。完成这些功能的组件就是Service。当播放器的Activity利用ervice()方法启动一个Service后,这个播放器就能够在后台持续的播放音乐了。还有,对于一个Service组件,我们可以使用rvice()连接到Service上,就能通过该Service提供的接口与之进行通信。
2.2.5 Content Provider
Content Provider提供给你的应用程序与其他应用程序共享数据的一个功能。我们的应用程序可以通过Content Provider提供的一些方法来处理或者保存其他应用程序Content Provider中的数据,这样来达到数据的共享。
2.2.6
之前提到过,每一个Android应用程序都包括了一个配置文件,它对应了应用程序的说明,包括运行权限,组件的注册等。其实配置文件和使用Visual Studio开发中的很相似,但是VS的可视化的界面的缘故,只需进行简单的设置,就能自动生成该文件,所以不少的VS程序员会忽略掉该文件的存在。但是在Android应用程序开发中,该文件是不可缺少的。应用程序在运行前通过文件向系统提供一些必要的信息,让系统知道该应用程序应该如何配置。
Android应用
Content
Activity
Service
Intent
图2-3 示
先举一个文件的例子然后从该例子中详细描述一下这个配置文件:
01
02 xmlns:android="/apk/res/android" 03 package="test. hello" android: versionCode="1" 04 05 android: versionName="1.0.0"> 06 07 @string/app_name"> 08 09 10 /> android:name=".HelloAndroid"android:label=" 11 12 13 14
这是一个简单HelloAndroid程序的配置文件,从这个配置文件中我们能够知道,该应用仅包含了一个Activity。下面将对这个配置文件做一个详细的描述。
第1行是一般xml文件都有的头部信息说明,其中包括xml的版本和文件编码方式。
第2行和第14行则是一对“manifest”标签,每一个AndroidManifest配置文件中必须有且只有一对“manifest”标签,所有AndroidManifest中的描述都应该包含在这对标签中。
第3~5行是“manifest”标签的属性,这个例子中的 package属性说明应用程序的入口在这个包下面。而“android:versionCode”和“android:versionName”两个可选的属性则是说明应用程序的版本号,其中“android:versionName”是面向用户的版本号,而“android:versionCode”则是开发者使用的内部版本号。
第6行和第13行是一对“application”标签,该标签中定义了所有应用程序所使用的Activity、Intent Receiver、Service等。该标签的“android: icon”属性定义了应用程序显示在Android主界面中的图标而"@drawable/icon"表示该应用程序图标的路径为/res/drawable/icon。
第7行和第12行是一对“activity”标签。在Android的应用程序当中所有定义好的的Activity都需要在中添加一组“activity”标签,不然的话即使你定义了,但是Android应用程序也找不到。在上面给出的例子中,仅仅有一组“activity”标签,这也说明了给出的例子的应用程序只有一个Activity。紧接其后的是“activity”标 签的属性,“android: name”属性表示了Activity所对应的类,上述例子中的类是HelloAndroid类,结合package的路径,它表示的是ndroid类。另外,在属性中“android: name”的值可以直接写为“HelloAndroid”,因为其已经定义到了包下面了。“android:label”则指定了该Activity代号。
剩下的8~11行是一对定义了Activity性质的“intent-filter”标签以及“intent-filter”包含的另外两个标签“action”和“category”标签之所以这几个标签一同说是因为“intent-filter”标签的性质是由“action”和“category”标签来说明的。也就是说AndroidManifest中上层的标签的性质由下层标签来描述。应用程序的组件为了告诉Android该组件能够相应和处理那些Intent请求可以使用一个或者多个的“intent-filter”的标签,同时一个“intent-filter”标签至少应该包含一个“action”标签。我们再回到例子的这四行代码中,“action”标签中的“android:name”属性的值为,表明该Activity是这个应用程序的进入点,另外,“category”标签中的“android:name”属性值为ER说明了当启动了应用程序以后,应当先执行这个Activity。
对于配置中还有“receiver”,“service”和“provider”标签,分别对应了剩下的Intent Receiver、Service和Content
Provider三个应用的组成部分。同样,每个Intent Receiver和Service以及Content Provider都需要到中进行描述后才能找到。
2.3 Android 文件系统
当Android系统部署到相应的硬件平台上以后,和Linux系统一样,势必有一个系统文件夹,用来存放一些系统程序和数据以及一些用户数据。下面就将介绍一下Android的系统文件夹
2.3.1 系统文件夹分析
①systemapp:这里存放的程序为系统默认的组件自己安装的引用程序一般不放在该文件夹下。同时可以看到,该文件夹下的文件都是APK格式的文件。
②systembin:该目录下都是系统的本地程序,主要为Linux系统自带的组件。而从文件夹名字可以看出都是二进制代码程序。这个文件夹和Linux系统下的systembin文件夹没多大区别。
③systemetc:与Linux系统下的systemetc文件夹没有本质的区别,都用于保存系统的配置文件。
④systemfonts:从名字上可以看出用于存放字体的文件夹。
⑤systemframework:主要存放核心文件,其文件后缀名为jar,可以看出为系统构架平台。
⑥systemlib:用于存放系统底层库。
⑦systemmedia:存放铃声的文件夹
⑧systemsounds:用于存放音乐文件。
⑨systemusr:用户文件夹,如同Linux中的usr文件夹一样,存放一些用户信息,包含键盘布局,用户命令,共享和时间区域信息文件。
从以上系统文件夹的构造中看出,Android的系统文件夹结构继承了Linux系统的系统文件夹组成,但是又有一些Android独特的地方,就是其在Linux系统文件夹的基础上进行了一些删减,使得该系统文件夹更加精简,更加一目了然。
2.3.2 系统构架与系统文件的对应
在这之前介绍了Android的系统架构,但是这个架构如何在Android系统中体现呢?下面将介绍一下,同样从下到上的顺序进行描述。
Linux内核层。Linux内核给其上层的软件和下层硬件间建立起一个抽 象层,其内核的组件都存放在systembin文件夹下面,如systembinsystem_server 系统服务和systembindbus-daemon 系统BUS总线监控以及systembinapp_process 系统进程等。
Android Runtime和函数库层。其中函数库都放于systemlib下,如音频库和系统C库。同时Android Runtime中的Android Libraries也存放在这个文件夹下,与其相对应的文件为systemliblibandroid_。而Dalvik虚拟机则放于systembin文件夹下,它的对应文件为systembindalvikvm。
应用程序框架层。该层的文件一般都存放到systemframework,如核心库,Android系统应用程序框架中的一些主要如Activity Manager,Content Provider等。
应用程序层。这层的本地应用文件都存于systemapp文件夹下,如提供短信和彩信功能的、提供电话拨号功能的和能够提供Google服务的Google程序包。但是像MSN第三方软件保存位置为data文件夹下。 3 Android的开发
3.1 Android开发工具
前面说过,Android的上层应用程序是用Java语言开发的,同时需要基于Dalvik虚拟机,所以Google公司推荐使用主流的Java继承开发环境
Eclipse。有了Eclipse还不够,因为使用Java语言进行开发,应该有由SUN公司提供的Java SDK(其中包含了JRE:Java Runtime Environment)。另外,Android的应用程序开发还是和Java开发有一定区别,所以还需有一个Google提供的Android SDK。有了这三个软件就可以开发Android应用程序了。
3.2 Android开发平台的搭建
Android开发平台搭建步骤很简单,但是和我们的论文没多大关系,所以具体步骤参见附录1。 当平台搭建好以后需要创建一个Android Virtual
Device,这一步是很关键的一步,如果不创建这个AVD的话,在Eclipse中编译运行Android应用程序时就会提示找不到AVD,从而无法编译。在DOS界面下运行Android SDK文件夹中tools目录下的工具,其命令是android create avd –name avd15r1 – target 2,使用这个命令之后会提示是否创建一个AVD,输入yes之后会提示设置AVD的一些属性,如内存信息等。要说明的是name后面的avd15r1是Android Virtual Device的名字,可以自由选取。而我起这个名字的意义是avd使用1.5r1版本的SDK。
简单的几步就将Android的开发平台搭建好了,虽然我使用的是Windows7操作系统,但是方法同样适用于Windows xp等其他Windows 平台。在一个应用程序设计好了以后,点击Eclipse中的run,就可以看到启动了一个叫做avd15r1的Android模拟器,同时,在模拟器中就能找到你所编写的应用程序。
3.3 系统功能介绍
本系统功能主要有通信录功能,游戏,文件浏览器,视频播放器。
通信录功能:模仿手机中的通信录功能实现对手机联系人的添加,修改,删除。
游戏:此游戏是一款简单的坦克大战游戏通过方向键控制己方坦克的移动方向,确认键发射子弹,并记录消灭敌人的数量。
文件浏览器:通过此功能可以浏览多种格式的文本文件
视频播放器:此功能可实现视频的播放
3.3.1 系统功能模块图:
主界面
通信录
文件浏览器
游戏
视频播放器
3.3.2 功能流程图
开机进入主界面
点击视频
视频播放器
点击文件浏览
文件浏览器
器图标
图标
点击通信录标
判断用户点击的图标
点击主界面功能模块图标
点击游戏标
游戏
通信录
3.3.3 功能实现界面
主界面:
游戏界面:
通信录界面:
(创建联系人)
(修改联系人)
(删除联系人)
文件浏览器界面:
视频播放器:
4 系统详细设计
结论
通过对Android系统的层次上分析以及借助Android提供的Intent机制的应用开发,增进了我对这个新生的系统的了解。
在对系统方面的研究中,我明白了Android的应用是怎么在系统上运行的。其中吸引我的地方就是Android的Runtime,在这,我看到了Google设计的Dalvik虚拟机不同于传统Java虚拟机的地方,这个虚拟机在移动终端设备CPU速度低,资源有限的环境下也能很高效率的运行,这无疑也证明了Android这个系统的成功。还有,Android上层采用了Java语言作为开发,让开发更为简单,可以使Java SE阵营的开发者不需要花太多的时间便能转投Android阵营,这样自然的为Android开发提供大量的人力资源。这样才致使Android在短时间内具有大量的应用,同时也使得许多手机生产商使用该系统的原因之一。
在对程序的开发中,我理解了Android的Intent机制在应用上的作用。一个应用的多个组件通过Intent机制联系在一起,这样各个组件之间的信息交换提高了,而程序的灵活性也提高了,给开发者的创造空间也增加了。
有了Google Android这些很强劲的优势,我想,在不久的将来伴随着3G的普及,Android必定能改变现在只能手机市场的格局,开辟出一个新的世界。
致谢
首先我在这里向养育和培养我的父母表示深深地思念和感谢,再向关心我,帮助我的老师和同学表示感谢!
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
1.
8
51
32
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59. 9660.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88. 51
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100. 8
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.