《Android应用开发揭秘》
///http://www.javaeye.com/wiki/hzbook/2249-Android
作者:杨丰盛
出版社:机械工业出版社
ISBN:9787111291954
出版日期:2010 年3月(1版2次)
开本:16
页码:515
版次:1-2
定价:69元
豆瓣网讨论地址: http://www.douban.com/subject/4200822/
China-pub预订地址: http://www.china-pub.com/196305
第一部分 准备篇
随着Android手机的普及,Android应用的需求势必会越来越大,这将是一个潜力巨大的市场,会吸引无数软件开发厂商和开发者投身其中。作为程序员的我们,当然也不应该落后于人,赶快加入到Android应用的开发阵营中来吧!
Android一词本意是指“机器人”,当然现在大家都知道它是Google推出的开源手机操作系统。Android基于Linux平台,由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。它是由一个由 30 多家科技公司和手机公司组成的“开放手机联盟”共同研发的,这将大大降低新型手机设备的研发成本。完全整合的全移动功能性产品成为“开放手机联盟”的最终目标。
Android 作为Google移动互联网战略的重要组成部分,将进一步推进“随时随地为每个人提供信息”这一企业目标的实现。Google的目标是让移动通信不依赖于设备,甚至是平台。出于这个目的,Android 将完善而不是替代Google长期以来推行的移动发展战略:通过与全球各地的手机制造商和移动运营商成为合作伙伴,开发既实用又有吸引力的移动服务,并推广这些产品。
Android平台的研发队伍阵容强大,包括Google、HTC(宏达电)、T-Mobile、高通、摩托罗拉、三星、LG以及中国移动在内的30多家企业都将基于该平台开发手机的新型业务,应用之间的通用性和互联性将在最大程度上得到保持。“开放手机联盟”表示,Android平台可以促使移动设备的创新,让用户体验到最优质的移动服务。同时,开发商也将得到一个新的开放级别,更方便地进行协同合作,从而保障新型移动设备的研发速度。因此Android 是第一个完整、开放、免费的手机平台。下面我们来欣赏一下第一款基于Android操作系统的手机G1,外观相当漂亮,如图1-1所示。
Android系统具有如下5个特点:
* 开放性。Google与开放手机联盟合作开发了 Android,Google通过与运营商、设备制造商、开发商和其他有关各方结成深层次的合作伙伴关系,希望通过建立标准化、开放式的移动电话软件平台,在移动产业内形成一个开放式的生态系统。
* 应用程序无界限。Android 上的应用程序可以通过标准 API 访问核心移动设备功能。通过互联网,应用程序可以声明它们的功能可供其他应用程序使用。
* 应用程序是在平等的条件下创建的。移动设备上的应用程序可以被替换或扩展,即使是拨号程序或主屏幕这样的核心组件。
* 应用程序可以轻松地嵌入网络。应用程序可以轻松地嵌入HTML、JavaScript 和样式表,还可以通过 WebView 显示网络内容。
* 应用程序可以并行运行。Android 是一种完整的多任务环境,应用程序可以在其中并行运行。在后台运行时,应用程序可以生成通知以引起注意。
为什么Android手机如此受用户青睐,下面我们来看看Android究竟有些什么功能在吸引着我们。
(1)智能虚拟键盘。虚拟键盘的出现意味着基于Android 1.5或以上版本(Android 2.0)的移动设备可以同时支持物理键盘和虚拟键盘。不同的输入方式可满足用户在特定场景的需求。Android虚拟键盘可以在任何应用中提供,包括Gmail、浏览器、SMS,当然也包括大量的第三方应用,如自动校正、推荐、用户词典等。不同于其他手机平台,Android 1.5及其以上的版本还支持第三方虚拟键盘应用的安装,如图1-2所示。
(2)使用Widget实现桌面个性化。可以用Widget“武装”自己的桌面。大多数小的Web应用都是从网络上获得实时数据并展示给用户的。Android预装了5个桌面Widget,包括数字时钟、日历、音乐播放器、相框和搜索。不同于iPhone,Android通过内置的应用程序库安装第三方Widget,如图1-3所示。
![](http://dl.javaeye.com/upload/attachment/219970/25d0647b-ed79-34f9-9321-5b4633c44301.png)
![](http://dl.javaeye.com/upload/attachment/219972/cc03ab2f-af37-300b-8805-d6287cd9a791.png)
![](http://dl.javaeye.com/upload/attachment/219974/ab13b263-ea87-3298-a1f9-decb881fe5c9.png)
图1-3 用Widget实现个性化桌面
(3)用在线文件夹快速浏览在线数据。类似于OS X Leopard的QuickLook特征,Android的在线文件夹可显示常见的数据条目,比如联系人、喜欢的应用、E-mail信息、播放列表、书签、RSS源等,并不需要运行系统程序处理特定的数据条目。在线文件夹数据实时更新,就像通过云或是本地创建新的数据。什么是最好的,开发者可以拓展通用数据条目和注册新数据类型的内置支持。例如,Twitter客户端程序可以注册tweet作为新数据类型,因此可以让你从你的朋友那里创建tweet的在线文件。Android可以为我们的个人桌面提供一组在线文件夹,从而帮助我们快速、方便地浏览联系人、股市、书签等信息。
(4)视频录制和分享。Android还有录制和分享视频的功能,对回放和MPEG-4、3GP等视频格式也有了更好的支持。可以通过E-mail、MMS或直接上传到YouTube等方式来分享视频,使用隐私控制来决定是分享给朋友还是每个人。上传视频的同时,可以继续使用手机,甚至可以继续录制和上传新的视频。如图1-4所示,通过YouTube分享录制的视频。
(5)图片上传。在线分享图片需要的点击更少。完成照相后,当浏览图片或选择Google在线图片服务Picasa时,只需轻点“分享”就会拥有1GB的免费图片存储空间。
(6)更快、更兼容的浏览器。Android的基于Webkit内核的浏览器带来了重要的调速装置(SpeedPumb),这得益于新的Webkit渲染引擎和优化的Java脚本编译器(SquireIFish)。当使用包含大量Java脚本的复杂Web应用时,可以体验到更佳的性能。除提高速度外,Android的浏览器还支持Web页面内的复制和粘贴操作,用户可以选中文本并复制,然后粘贴到搜索框中进行搜索。
(7)Voice Search语音搜索。带有语音识别技术的Google手机已于2008年11月面世,它支持语音搜索功能。该功能增强了默认的搜索能力,已超过纯文本搜索。当你大声说出要搜索的内容后,Android将上传数字信号并记录到Google服务器中。在服务器中,语音识别技术能将语音转化为特定的文本搜索,使之通过Google搜索引擎,通过地理位置的筛选,将结果反馈到手机设备。图1-5显示了Google文本和语音搜索桌面。
(8)立体声蓝牙和免提电话。除了增强的免提电话体验,Android还支持立体声蓝牙(A2DP和AVCRP),并有自动配对功能。
(9)强大的GPS技术。Android内部提供了大量GPS组件,我们可以很轻松地获得设备当前的位置等信息,让导航等功能更加完美。
(10)Android系统硬件检测。Android可自动检测和修复SD卡的文件系统,允许第三方应用显示Android系统的硬件特征。为了让用户下载到与自己的设备更匹配的应用,我们可以检测用户设备的硬件信息,让满足应用要求的设备安装该程序,当更多的Android设备建立在不同的硬件上时,这个功能会显得很实用。
图1-4 通过YouTube分享录制的视频 图1-5 Google文本和语音搜索桌面
1.1.2 Android的系统构架
通过上一节的介绍,我们对Android的特点以及它为什么会如此受欢迎有了初步的了解。下面将讨论Android的系统架构,我们先来看看Android的体系结构,如图1-6所示。
图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效果预览
1.3 小结
本章主要介绍了与Android相关的一些基本概念,同时分析了Android系统的特点及其功能,简单介绍了目前主流的7个Linux平台手机以及中国移动的OMS操作系统。在介绍Android基本概念时重点介绍了Android系统架构和应用框架,其中应用层即是我们使用Java语言编写的一些运行在虚拟机上的程序,应用框架层是我们开发应用时接触最为紧密的一层,在开发应用程序时必须遵守其规则,才能保证所开发的应用程序能在Android上安全地运行。大家应着重理解这两层,这样才能开发出效率更高的应用程序。
据称今年底将会有18款之多的以Android平台为系统的Linux手机上市, Android将在移动开发中具有更广阔的前景。要想成为一个优秀的Android手机开发者,还需要从基础做起,希望大家好好掌握本章的内容。