你是否曾希望自己是罗丹?坐着用凿子雕琢着一块石头,将它塑造成你想要的样子。由于害怕无法“雕琢”出实用的应用程序,主流程序员曾经十分排斥资源严重受限的移动设备。不过那段时光已经一去不复返了。Android将可编程设备难以置信的应用领域带到了你的门前。本书用31章涵盖了100多个主题。这一版介绍了Android的2.3和Android3.0版,它们分别是针对移动电话和平板电脑而优化的Android版本。

第一章 Android计算平台简介 (部分)

计算正逐渐变得“个人化”,对计算资源的访问越来越容易。很大程度上,手持设备已转变成计算平台。曾几何时,手机不再仅仅用于通话,它们已能够承载数据和视频。移动设备(手机或平板电脑)正成为非常强大的通用计算平台,势必成为新一代的PC。据预测,甚至华硕、惠普和戴尔等传统PC制造商都在计划推出基于Android的各种规格的设备。各种操作系统之间、计算平台之间、编程语言之间,以及开发框架之间的竞争将转而在移动设备上重演。

我们还预测,随着越来越多的IT应用程序开始推出移动版本,IT行业将掀起一场移动编程热潮。为了帮助读者从这一趋势中受益,本书将介绍如何使用Java为运行在Google公司Android平台上的设备开发应用程序。Android是一个面向移动开发和平板电脑开发的开源平台。本章将概述Android及其SDK,简短介绍一些重要的包,引出每章将涉及的主题,展示如何利用Android源代码,并重点介绍一下为Android平台编程的美好前景。

Android令我们非常激动,因为它是一个引入了众多全新的框架设计模式的先进平台(即使受到移动平台的限制)。

1.1 面向新PC的全新平台

目前移动电话等专用设备已跻身于重要的通用计算平台行列,这对于开发人员而言是件好事。从Android3.0开始,这一家族又添新成员:平板电脑这一新趋势使我们可通过通用计算语言使用移动设备,扩大了移动应用程序的应用范围和市场份额。

手持设备是全新的PC

Android平台融入了面向手持设备的通用计算理念。它是一个综合平台,包含一个基于Linux的操作系统,用于管理设备、内存和进程。Android中的Java库涵盖了电话、视频、语音、图形、连接、UI编程和设备的其他许多方面。

Android软件栈的总体结构

尽管针对移动设备和平板设备而构建,但Android平台具备全功能桌面框架的所有特征。Google公司通过AndroidSDK(SoftwareDevelopmentKit,软件开发工具包)将此框架提供给Java程序员。在使用AndroidSDK时,很难感受到是在向移动设备编写应用程序,因为你能够访问在桌面或服务器(包括关系数据库)上使用的大部分类库。

AndroidSDK支持大多数JavaSE(JavaPlatform,StandardEdition),但并不支持AWT(AbstractWindowToolkit,抽象窗口工具包)和Swing。对于AWT和Swing,AndroidSDK拥有自己的扩展现代UI框架(extensivemodernUIframework)。因为你在使用Java编写应用程序,所以可以想到,需要一个JVM(JavaVirtualMachin,Java虚拟机)来解释运行时Java字节码。JVM通常会提供必要的优化,以使Java能够达到与C和C++等编译语言相当的性能水平。Android提供了自己的经过优化的JVM来运行已编译的Java类文件,以克服手持设备在内存、处理器速度和功率等方面上的限制。这个虚拟机称为DalvikVM(1.3节将详细介绍)。

Java编程语言的简单性和人们对它的熟悉,再加上Android丰富的类库,使Android成为了富有吸引力的编程平台。

1.2 Android的历史

各种手机使用着不同的操作系统,比如SymbianOS、微软公司的WindowsMobile、MobileLinux、iPhoneOS(基于MacOSX)、Moblin(来自英特尔公司)以及许多其他专用操作系统。迄今为止,没有一个操作系统成为事实标准。可用于开发移动应用程序的API和环境具有诸多限制,似乎远远落后于桌面框架。Android平台具有开放、经济和代码开源的特点,更重要的是,它还包含一个高端、高度集成、一致的开发框架。

Google于2005年收购了新兴公司Android,开始开发Android平台。Android公司的重要成员包AndyRubin、RichMiner、NickSears和ChrisWhite。

Android的发展历程

2007年年底,一些行业领先企业围绕Android平台成立了开放手机联盟(OpenHandsetAlliance,www.openhandsetalliance.com)。该联盟的一些重要成员如下。

  • SprintNextel
  • T-Mobile
  • 摩托罗拉
  • 三星
  • 索尼爱立信
  • 东芝
  • 沃达丰
  • Google
  • 英特尔
  • 德州仪器

截至2011年,此列表已增长了数倍(超过80个),你可以在开放手机联盟网站上看到它。

从网站上可以了解到,该联盟的一个目标是迅速创新和更好地应对用户需求,它的第一个重要成果就是Android平台。Android旨在满足移动运营商、手机制造商和应用程序开发人员的需求。联盟成员已承诺通过开源的Apache许可证2.0版发布重要的知识产权。

2007年11月,AndroidSDK首次发布“预览”版。2008年9月,T-Mobile发布了T-MobileG1,这是第一部基于Android平台的智能手机。几天后,Google公司发布了AndroidSDKReleaseCandidate1.0。2008年10月,Google依据Apache的开源许可公开了Android平台的源代码。2010年末,Google针对智能电话发布了AndroidSDK2.3,其代号为Gingerbread,该版本于2011年3月升级到了2.3.3版。2011年年初,又针对平板电脑发布了一个优化过的Android版本Android3.0,其代号为Honeycomb。摩托罗拉公司的XOOM是使用此操作系统版本的早期平板电脑之一。

在Android发布时,它的一个重要架构目标是使应用程序能够彼此交互,重用彼此的组件。这种重用不仅适用于服务(service),还适用于数据和用户界面(UI)。最终,Android平台的众多架构功能使这一开放性得以实现。

由于功能完善成熟,Android也吸引了一些早期追随者利用Web资源所提供的云计算模型,使用手机自身的本地数据存储增强云计算体验。Android对手机上的关系数据库的支持也是吸引早期采用者的一个重要因素。

1.0和1.1版(2008年发布)的Android不支持软键盘,设备需要配备物理键盘。2009年4月发布的1.5SDK解决了这个问题,该版本还包含许多其他功能,比如高级媒体录制功能、部件和活动文件夹(livefolder)。

2009年9月发布了Android1.6,在一个月内又发布了Android2.0,这有力地推动了2009年圣诞节众多Android设备的上市。这个版本引入了高级搜索功能和文本到语音的转换功能。

借助对HTML5的支持,Android2.0还可能使人利用HTML完成一些有趣的功能。联系人API经过了全面改进。添加了对Flash的支持。每天都会诞生越来越多基于Android的应用程序以及新类型的独立在线应用程序商店。现在也可以买到基于Android的备受期待的平板电脑。

Android2.3包括以下一些重要的功能:由管理员远程擦除安全数据、在光照不足条件下使用照相机和视频、WiFi热点、重大的性能改善、改进的蓝牙功能、可选择将应用程序安装在SD卡上、OpenGLES2.0支持、备份改进、搜索实用性改进、针对信用卡处理的近场通信支持、显著改进的动作和传感器支持(类似于Wii)、视频聊天,以及改进的Market。

Android的最新成员3.0版主要针对基于平板电脑的设备和强大得多的双核处理器,比如NvidiaTegra2。此版本的主要功能包括支持使用较大的屏幕,引入了一个名为“碎片”的重要的新概念。这个概念渗透到了3.0版的体验中。Android3.0还引入了更加类似于桌面的功能,比如ActionBar和拖放。主屏幕部件得到了显著改进。现在有更多UI控件可用。在3D领域,OpenGL使用Renderscript得以改进,为ES2.0提供了进一步的补充。它对于平板电脑而言是一项激动人心的功能。

1.3 DalvikVM剖析

作为Android平台的一部分,Google公司花了大量时间思考针对低功耗手持设备的优化设计。与桌面设备相比,手持设备在内存和速度方面落后8~10年。它们的计算能力也有限。结果,手机的性能需求变得很严格,要求手机设计人员优化所有因素。如果查看Android中的包列表,你将会看到它们的功能全面而丰富。

这些问题使Google公司在许多方面重新审视标准JVM实现。(DanBornstein对Google公司的这个JVM实现作出了重要贡献,他编写了DalvikVM,Dalvik是冰岛一个小镇的名称。)首先,DalvikVM获取生成的Java类文件,将它们组合为一个或多个Dalvik可执行文件(.dex)。它重用多个类文件中的重复信息,与未压缩的传统.jar文件相比,有效地将空间需求减少了一半。

其次,Google公司在DalvikVM中对垃圾收集进行了调优,但它在早期版本中选择了删除JIT(Just-In-Time,即时)编译器。Android2.3添加了JIT。报告称这可在各种场所提供快2到5倍的原始性能,将通用应用程序的性能提升10%~20%。

最后,DalvikVM使用了一种不同的汇编代码生成方法,它使用寄存器而不是栈作为主要的数据存储单元。Google公司希望这样能将指令减少到30%。应当指出,采用DalvikVM的一个结果是,Android中最终的可执行程序代码不是基于Java字节码,而是基于.dex文件。这意味着无法直接执行Java字节码,必须首先得到Java类文件,然后将它们转换为可链接的.dex文件。

这种对性能的狂热追求还扩展到了AndroidSDK的其他部分。例如,AndroidSDK大量使用XML来定义UI布局。然而,所有XML数据必须编译为二进制文件,然后才能将这些文件存储在设备上。Android提供了一些专门的机制来使用XML数据。

1.4 理解Android软件栈

到目前为止,我们介绍了Android的历史和它的优化功能,包括DalvikVM,还提到了可用的Java软件栈。本节将介绍与Android开发有关的内容。下图是开始此讨论的一个不错的出发点。

Android SDK软件栈详细结构

Android平台的核心是Linux内核,它负责设备驱动程序、资源访问、电源管理和完成其他操作系统的职责。提供的设备驱动程序包括显示器、照相机、键盘、WiFi、闪存、音频和IPC(Inter-ProcessCommunication,进程间通信)。尽管核心是Linux,但Android设备(比如MotorolaDroid)上的绝大部分应用程序都是使用Java开发,通过DalvikVM运行的。

我们看一下另一层,内核之上是许多C/C++库,比如OpenGL、WebKit、FreeType、SSL(SecureSocketsLayer,安全套接字层)、libc(C运行时库)、SQLite和媒体。基于BSD(BerkeleySoftwareDistribution,伯克利软件套件)的系统C库针对嵌入式Linux设备进行了调优(大小约为原始大小的一半)。媒体库基于PacketVideo(www.packetvideo.com/)的OpenCORE。这些库负责录制和播放音频和视频格式的内容。一个名为SurfaceManager的库控制对显示系统的访问,支持2D和3D。在新版本中可能添加更多这样的本地库。

WebKit库负责浏览器支持,WebKit也是Google公司的Chrome和苹果公司的Safari使用的库。FreeType库负责字体支持。SQLite(www.sqlite.org/)是一个可在设备自身上使用的关系数据库。SQLite也是关系数据库的一项独立的开源成果,没有直接绑定到Android。适用于SQLite的工具也可用于Android数据库。

大多数应用程序框架都通过DalvikVM访问这些核心库,DalvikVM就像Android平台的入口。前面几节已经提到,Dalvik经过了优化,可以运行多个VM实例。访问这些核心库时,每个Java应用程序都会获得自己的VM实例。

AndroidJavaAPI的主要库包括电话、资源、位置、UI、ContentProvider(数据)和包管理器(安装、安全等)。程序员使用此JavaAPI开发最终用户应用程序。设备上的一些最终用户应用程序示例包括Home、Contacts、Phone、Browser等。

Android还支持Google公司一个名为Skia的自定义2D图形库,这个库是使用C和C++编写的。Skia也是GoogleChrome浏览器的核心组件。然而,Android中的3DAPI基于来自Khronos小组(www.khronos.org)的一个OpenGLES实现。OpenGLES包含OpenGL中面向嵌入式系统的子集。

从媒体角度讲,Android平台支持最常见的音频、视频和图像格式。从无线角度讲,Android的API可支持蓝牙、EDGE、3G、WiFi和GSM(GlobalSystemforMobileCommunication,全球移动通信系统)电话而具体则取决于设备硬件。

1.5 使用AndroidSDK开发最终用户应用程序

本节将介绍用于在Android上开发最终用户应用程序的高级AndroidJavaAPI。我们将简单介绍Android模拟器、Android基础组件、UI编程、服务、媒体、电话、动画和OpenGL。我们还将展示一些代码片段。

1.5.1 Android模拟器

AndroidSDK包含一个Eclipse插件,名为ADT(AndroidDevelopmentTools,Android开发工具)。这个IDE(IntegratedDevelopmentEnvironment,集成开发环境)工具用于开发、调试和测试Java应用程序。(第2章将介绍ADT。)也可以单独使用AndroidSDK,使用命令行工具代替ADT。两种方法都支持使用模拟器来运行、调试和测试应用程序。甚至90%的应用程序开发工作都不需要真实设备。全功能的Android模拟器能够模拟大部分的设备功能。模拟器不能模拟USB连接、照相机与视频采集、耳机、电池、蓝牙、WiFi、NFC和OpenGLES2.0。

Android模拟器使用一种名为QEMU(http://bellard.org/qemu/)的开源“处理器模拟器”技术来完成它的工作,此技术由FabriceBellard开发。这项技术还支持在一个操作系统上模拟另一个操作系统,而不用考虑采用了何种处理器。QEMU支持在CPU级别上进行模拟。

在Android模拟器中,处理器基于ARM(AdvancedRISCMachine,高级精简指令集机器)架构。ARM是一种基于RISC(ReducedInstructionSetComputer,精减指令集计算机)的32位微处理器架构,其设计上的简单性和较高的速度通过指令集中精减的指令来实现。模拟器在此模拟处理器上运行Linux的Android版本。

ARM被广泛应用于手持设备和其他嵌入式电子设备中,低功耗对这些设备非常重要。移动市场也广泛使用了基于此架构的处理器。

可以在AndroidSDK文档中找到关于该模拟器的更多详细信息:http://developer.android.com/guide/developing/tools/emulator.html。

1.5.2 AndroidUI

Android使用的UI框架类似于其他基于桌面的全功能UI框架。实际上,它在本质上更加先进,更具异步特征。如果将基于C的传统MicrosoftWindowsAPI看做第一代UI框架,将基于C++的MFC(MicrosoftFoundationClasses,Microsoft基础类)看做第二代。基于Java的SwingUI框架可以看做第三代,它比MFC具有更高的设计灵活性。AndroidUI、JavaFX、MicrosoftSilverlight和MozillaXUL(XMLUserInterfaceLanguage,XML用户界面语言)都是第四代UI框架的新成员,它们的UI是声明性的,具有独立的主题。

说明在Android中,即使编程的目标设备是手持设备,也会使用一种时尚的用户界面模式。

在AndroidUI中编程涉及在XML文件中声明界面。然后将这些XML视图(view)定义作为窗口加载到UI应用程序中。甚至应用程序中的菜单也是从XML文件加载的。Android中的屏幕或窗口通常称为活动(activity),包含用户完成一个逻辑动作单元所需的多个View。View是Android中的基本UI构建块,可以对它们进一步组合形成名为视图组的复合视图。View在内部使用我们熟悉的画布、绘图和用户交互概念。在Android中,承载这些复合视图(包括View和视图组)的Activity是逻辑上可替换的UI组件。Android3.0引入了另一个名为碎片的UI概念,允许开发人员将视图和功能在平板电脑上分块显示。平板电脑为多窗格活动提供了充足的屏幕空间,而碎片提供了这些窗格的抽象。

Android框架的一个重要概念是Activity窗口的生命周期管理。Android采用一些协议在用户隐藏、还原、停止和关闭Activity窗口时管理状态。第2章将介绍这些基本的思想,还将介绍如何设置Android开发环境。

本文节选自《精通Android 3》作者(印) 克曼特内尼(Komatineni,S.) , (美) 哈希米 (Hashimi,S.) , (美)麦克莱恩 (MacLean,D.),译者杨越,由人民邮电出版社发行。

更多相关文章

  1. Android获取设备IP地址代码与分析
  2. Android之React Native平台与Android本地模块之间的调用
  3. Android开发之应用程序基础及组件
  4. 一起学android之如何获取Android设备的唯一识别码笔记(21)
  5. Android开发平台振动器系统详解

随机推荐

  1. Android中不常见的监听: 鼠标划过/双击/右
  2. Android(安卓)闹钟详解
  3. Android WebView 支持H5图片上传
  4. 最新Android(安卓)SDK_API_开发包_离线包
  5. Http的15种请求
  6. Android×××方法详解
  7. [Android] Handler源码解析 (Java层)
  8. Android取得长宽的问题
  9. android WindowManager可拖动悬浮按钮
  10. Xamarin 中开发Android实现全屏或者不显