
第1章 初识庐山真面目——Android简介
Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称。该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的解决方案。
在此之前的几年间,当“智能手机”被越来越多的用户提及时,当手机爱好者手持一款Symbian S60手机随意安装一款软件时,人们认为智能手机时代已经来临,但现在看来,那还只是个预热,真正的智能手机时代还没有到来。直到Android的诞生,才真正打破了智能手机发展的僵局,它带领智能手机市场迅速崛起,为人们的生活和工作带来了与众不同的全新体验。
从此,人们不再受PC束缚。无论走到哪里,只要有一部Android手机,并且有移动信号,就可以随时随地办公、浏览资讯、网上冲浪,这极大地方便了人们的生活。正因为如此,Android仅仅用了3年左右的时间,就迅速成长为全球第一大移动终端平台,不仅广泛应用到了智能手机领域,而且在平板电脑、智能导航仪、智能MP4领域也有很大的影响,深受移动终端生产厂商和广大用户的青睐。
1.1 Android的来龙去脉
Android的创始人Andy Rubin是硅谷著名的“极客”,他离开Danger移动计算公司后不久便创立了Android公司,并开发了Android平台,他一直希望将Android平台打造成完全开放的移动终端平台。之后Android公司被Google公司看中并收购。这样,号称全球最大的搜索服务商Google大举进军移动通信市场,并推出了自主品牌的移动终端产品。
2007年11月初,Google正式宣布与其他33家手机厂商、软硬件供应商、手机芯片供应商、移动运营商联合组成开放手机联盟(Open Handset Alliance),并发布名为Android的开放手机软件平台,希望建立标准化、开放式的移动电话软件平台,在移动行业内形成一个开放式的生态系统。
1.2 掀起Android的盖头来
自从Android发布以来,越来越多的人关注Android的发展,越来越多的开发人员在Android系统平台上开发应用。那么,是什么使Android备受青睐、在众多移动平台中脱颖而出呢?
1.2.1 选择Android的理由
Android基于Linux技术开发,由操作系统、用户界面和应用程序组成,允许开发人员自由获取、修改源代码,也就是说这是一套具有开源性质的移动终端解决方案,具有开放性、平等性、无界性、方便性以及硬件的丰富性等特点。下面对以上各个优点进行简单介绍。
●开放性。
提到Android的优势,首先想到的一定是真正的开放,其开放性包含底层的操作系统以及上层的应用程序等。Google与开放手机联盟合作开发Android的目的就是建立标准化、开放式的移动软件平台,在移动产业内形成一个开放式的生态系统。
●平等性。
在Android的系统上,所有的应用程序完全平等,系统默认自带的程序与自己开发的程序没有任何区别,程序开发人员可以开发个人喜爱的应用程序来替代系统的程序,构建个性化的Android手机系统,这些功能在其他的手机平台是没有的。
在开发之初,Android平台就被设计成由一系列应用程序组成的平台,所有的应用程序都运行在一个虚拟机上面。该虚拟机提供了系列应用程序之间和硬件资源通信的API。这成就了在Android的系统上,所有应用程序完全平等。
●无界性。
Android平台的无界性表现在应用程序之间的无界,开发人员可以很轻松地将自己开发的程序与其他应用程序进行交互,比如应用程序需要播放声音的模块,而正好你的手机中已经有一个成熟的音乐播放器,此时就不需要再重复开发音乐播放功能,只需简单地加上几行代码即可将成熟的音乐播放功能添加到自己的程序中。
●方便性。
在Android平台中开发应用程序是非常方便的,如果对Android平台比较熟悉,想开发一个功能全面的应用程序并不是什么难事。Android平台为开发人员提供了大量的实用库及方便的工具,同时也将百度地图等功能集成了进来,只需简单的几行调用代码即可将强大的地图功能添加到自己的程序中。
●硬件的丰富性。
由于平台的开放,众多的硬件制造商推出了各种各样的产品,而这些产品功能上的差异并不影响数据的同步与软件的兼容,例如,原来在诺基亚手机上的应用程序,可以很轻松地被移植到摩托罗拉手机上使用,且联系人、短信息等资料更是可以方便地转移。
1.2.2 Android的应用程序框架
从软件分层的角度来说,Android平台由应用程序、应用程序框架、Android运行时库层以及Linux内核共4部分构成,本节将分别介绍各层的功能,使读者对Android平台有一个大致的了解,便于以后对Android应用程序的开发。其分层结构如图1-1所示。

▲图1-1 Android平台架构图
1.应用程序层
本层的所有应用程序都是用Java编写的,一般情况下,很多应用程序都是在同一系列的核心应用程序包中一起发布的,主要有拨号程序、浏览器、音乐播放器、通讯录等。该层的程序是完全平等的,开发人员可以任意将Android自带的程序替换成自己的应用程序。
2.应用程序框架层
对于开发人员来说,接触最多的就是应用程序框架层。该应用程序的框架设计简化了组件的重用,其中任何一个应用程序都可以发布自身的功能供其他应用程序调用,这也使用户可以很方便地替换程序的组件而不影响其他模块的使用。当然,这种替换需要遵循框架的安全性限制。
该层主要包含以下9部分,如图1-2所示。

▲图1-2 应用程序框架
●活动管理(Activity Manager):用来管理程序的生命周期,以及提供最常用的导航回退功能。
●窗口管理(Window Manager):用来管理所有的应用程序窗口。
●内容供应商(Content Providers):通过内容供应商,可以使一个应用程序访问另一个应用程序的数据,或者共享数据。
●视图系统(View System):用来构建应用程序的基本组件,包括列表、网格、按钮、文本框,甚至是可嵌入的Web浏览器。
●包管理(Package Manager):用来管理Android系统内的程序。
●电话管理(Telephony Manager):所有的移动设备的功能统一归电话管理器管理。
●资源管理(Resource Manager):资源管理器可以为应用程序提供所需要的资源,包括图片、文本、声音、本地字符串,甚至是布局文件。
●位置管理(Location Manager):该管理器是用来提供位置服务的,如GPRS定位等。
●通知管理(Notification Manager):主要对手机顶部状态栏进行管理,开发人员在开发Android程序时会经常使用,如来短信提示、电量低提示,还有后台运行程序的提示等。
3.Android运行时库
该层包含两部分,程序库及Android运行时库。程序库为一些C/C++库,这些库能够被Android系统中不同的应用程序调用,并通过应用程序框架为开发者提供服务。而Android运行时库包含了Java编程语言核心库的大部分功能,提供了程序运行时所需调用的功能函数。
程序库主要包含的功能库如图1-3所示。

▲图1-3 程序库框架
●libc:一个从BSD继承来的标准C系统函数库,是专门针对移动设备优化过的。
●Media Framework:它基于PacketVideo公司的OpenCORE,支持多种常用音频、视频格式回放和录制,并支持多种图像文件,如MPEG-4、H.264、MP3、AAC、AMR、JPG、PNG等。
●Surface Manager:它主要管理多个应用程序同时执行时,各个程序之间的显示与存取,并且为多个应用程序提供了2D和3D图层无缝的融合。
●SQLite:所有应用程序都可以使用的轻量级关系型数据库引擎。
●WebKit:这是一套最新的网页浏览器引擎,可同时支持Android浏览器和一个可嵌入的Web视图。
●OpenGLIES:基于OpenGL ES 1.0 API标准实现的3D绘制函数库,该函数库支持软件和硬件两种加速方式执行。
●FreeType:提供位图(bitmap)和矢量图(vector)两种字体显示。
●SGL:提供2D图形绘制的引擎。
Android运行时库包括核心库及Dalivik虚拟机,如图1-4所示。

▲图1-4 Android运行时库
●核心库(Core Libraries):该核心库包括Java语言所需要的基本函数以及Android的核心库。与标准Java不一样的是,系统为每个Android应用程序提供了单独的Dalvik虚拟机来执行,即每个应用程序拥有自己单独的线程。
●Dalvik虚拟机(Dalvik Virtual Machine):大多数的虚拟机(包括JVM)都是基于栈的,而Dalvik虚拟机则是基于寄存器的,它可以支持已转换为.dex格式的Java应用程序的运行。.dex格式是专门为Dalvik虚拟机设计的,更适合内存和处理器速度有限的系统。
4.Linux内核
Android平台中操作系统采用的是Linux 2.6内核,其安全性、内存管理、进程管理、网络协议栈和驱动模型等基本依赖于Linux。对于程序开发人员,该层为软件与硬件之间增加了一层抽象层,使开发过程中不必时时考虑底层硬件的细节。而对于手机开发商而言,对此层进行相应的修改即可将Android平台运行到自己的硬件平台之上。
1.3 Android开发环境的搭建
本节主要讲解基于Eclipse的Android开发环境的搭建(包括SDK的下载和SDK的配置)、模拟器的创建和运行,以及Android开发环境搭建好之后,对其开发环境进行测试并创建第一个Android应用程序Hello Android等相关知识。
1.3.1 Android SDK的下载
前面已经对Android平台进行了简单的介绍,从本小节开始,将带领读者逐步搭建自己的开发环境。Android SDK是开发Android应用程序的基础开发环境,其本身是免费的,下面将向读者介绍Android SDK的下载,其具体步骤如下。
(1)首先在浏览器中输入http://developer.android.com/sdk/index.html,打开Android SDK的官方下载网站,如图1-5所示。点击网页右下角被椭圆圈中的内容为“Download the SDK……”的区域,进入SDK的下载页面,如图1-6所示。

▲图1-5 SDK官方下载首页

▲图1-6 下载页面
(2)进入到SDK的下载页面后,按照图1-6中被椭圆圈中的区域进行下载项选择(这里选择的是Windows下的32位版本),然后点击网页正下方被椭圆圈出的内容为“Download the SDK……”的区域进行下载,此时浏览器会弹出下载对话框(这一点不同的浏览器会有所不同),如图1-7所示。

▲图1-7 下载对话框
完成以上步骤,等待Android SDK下载完成,就可以进行环境搭建的下一步工作了,也就是对Android SDK进行相关的配置,这些内容将在下一小节中向读者介绍。
1.3.2 Android SDK的配置
下载完成后,就可以对Android SDK进行解压和配置了,主要步骤如下。
(1)Android SDK下载成功后,会得到一个名称为“adt-bundle-windows-x86-20140702”的压缩包(随选择下载版本的不同,此名称可能不同)。将此压缩包解压得到同名文件夹,如图1-8所示。

▲图1-8 下载后得到的压缩包及解压后的文件夹
(2)打开解压后的文件夹,如图1-9所示。其中名称为“eclipse”的子文件夹为绑定了ADT插件的用于Android应用程序开发的集成开发环境——Eclipse。另外一个名称为“sdk”的子文件夹则是要进行配置的Android SDK。

▲图1-9 解压后的文件夹的子目录
(3)打开“eclipse”子文件夹,如图1-10所示。接着点击其中的“eclipse.exe”,启动Eclipse集成开发环境,此时会出现如图1-11所示的界面。

▲图1-10 eclipse文件夹的子目录

▲图1-11 Android工作区的选择
(4)图1-11所示界面是提醒读者设置自己的项目工作区路径,这里采用的是“E: \软件\workspace”。建议读者的工作区路径设置和这里介绍的保持一致,这样在进行后继案例的学习时可能会方便不少,当然读者也可以采用自己特定的工作区路径。
提示
若读者的工作区路径与笔者这里设置的不一样,也是可以的。但导入的Android项目都需要对构建器进行修改才能正常编译运行。如何修改构建器会在后面进行介绍,读者到时注意一下即可。
(5)指定完工作区路径后,就进入了Eclipse的主界面,如图1-12所示。在此界面中选择“Window”菜单下面的“Preferences”子菜单项,系统将弹出“Preferences”配置界面,如图1-13所示。

▲图1-12 Android的SDK的配置图1

▲图1-13 Android的SDK的配置图2
(6)选择“Preferences”配置界面左侧列表中的“Android”选项(如图1-13步骤(1)所示),然后点击界面右上侧的“Browse…”按钮(如图1-13步骤(2)所示),在弹出的文件浏览界面中选中前面解压得到的“sdk”目录(如图1-13步骤(3)所示)。
(7)选中“sdk”目录后,点击文件浏览界面中的确定按钮(如图1-13步骤(4)所示)。等文件浏览界面消失后,再点击“Preferences”配置界面中右下侧的“Apply”按钮(如图1-13步骤(5)所示),若此时看到图1-13中列出了多个Android版本的信息(如图1-13中“配置成功的标志”框所圈中的部分),则说明配置成功。
(8)最后点击“Preferences”配置界面中右下侧的“OK”按钮(如图1-13步骤(6)所示)即完成了整个Android SDK的配置。
(9)图1-13中只有“Android 4.4W”版本,如果需要其他的版本,可点击Eclipse主界面中的“Android SDK Manager”按钮,进入加载界面,如图1-14所示。加载完成后,进入Android SDK Manager界面,如图1-15所示,在该界面勾选需要下载的SDK版本,再单击“Install……”按钮进行下载、安装即可。

▲图1-14 单击Android SDK Manager

▲图1-15 SDK下载界面
提示
在图1-15SDK下载界面中单击“Install……”进行下载安装SDK版本时,需要联网下载,且下载速度较慢,请读者耐心等待。
1.3.3 创建并启动模拟器
开发环境搭建基本完成后,在正式开发Android应用程序之前,还有一个很重要的工作就是创建模拟器。模拟器可以在初学者没有实际设备的情况下在PC上对应用程序进行简单的运行测试,很大程度上降低了学习的成本。模拟器的创建很简单,其具体步骤如下。
(1)首先在Eclipse中单击(Android Virtual Device Manager)按钮,如图1-16所示。单击
按钮后,系统将弹出“Android Virtual Device Manager”对话框,如图1-17所示。

▲图1-16 “Opens the Android SDK and AVD Manager”按钮

▲图1-17 “Android SDK and AVD Manager”对话框
(2)在弹出的Android SDK and AVD Manager对话框中单击“New”按钮(如图1-18所示),系统将弹出Create new Android Virtual Device(AVD)对话框,如图1-19所示。

▲图1-18 “New”按钮

▲图1-19 “Create new Android Virtual Device(AVD)”对话框
(3)在Create new Android Virtual Device(AVD)对话框中输入模拟器的名称(这里输入的是android4.2.2),下拉Target列表选中Android4.2.2-API Level 17,在Internal Storage面板中输入100(代表内部存储容量为100MB),在SD Card面板中的Size文本框中输入100(代表SD卡容量为100MB),如图1-20所示。

▲图1-20 模拟器配置
(4)然后设置模拟器显示屏分辨率为5.1"WVGA(480×800),最后勾选Use Host GPU开启本地GPU渲染支持,如图1-20所示。模拟器配置完成后,单击“OK”按钮,即可完成创建指定版本的Android SDK模拟器。
(5)创建完Android SDK的模拟器后,在Android SDK and AVD Manager对话框中就可以显示出创建的Android SDK模拟器了,如图1-21所示。在Android SDK and AVD Manager对话框中选中创建的Android模拟器,单击“Start”按钮(如图1-22所示),弹出Launch Options对话框,如图1-23所示。

▲图1-21 创建完成的Android SDK模拟器

▲图1-22 “Start”按钮

▲图1-23 “Launch Options”对话框
(6)在弹出的Launch Options对话框中单击“Launch”按钮(如图1-24所示)系统将启动Android SDK模拟器,启动完成后的效果如图1-25所示。

▲图1-24 “Launch”按钮

▲图1-25 启动完成的Android SDK模拟器
提示
运行模拟器时可能会很慢,有时甚至可能达到几分钟时间,如果没有报错,请读者耐心等待。
1.3.4 第一个Android程序
前面小节已经介绍了Android的来龙去脉、Android SDK的下载、Android SDK的配置和创建及启动模拟器等重要内容,接下来将带领读者构建第一个Android应用程序并对该程序进行简单的讲解,其具体内容如下。
1.创建第一个Android应用程序
在学习各种编程语言时,写的第一个程序都是Hello World。在本小节中将详细讲述如何在Android开发中开发自己的第一个Android程序——Hello Android。希望读者通过本小节的学习,熟悉Android程序的创建。其具体步骤如下。
(1)点击eclipse.exe,启动Eclipse,依次选择“File/New/Android Application Project”,如图1-26所示。或者点击按钮后,系统将弹出新建项目对话框,如图1-27所示。

▲图1-26 新建项目方法

▲图1-27 新建项目对话框
(2)在新建项目对话框中选择“Android/Android Application Project”,如图1-28所示,然后单击“Next”按钮,执行下一步,即弹出“New Android Application”对话框,如图1-29所示。

▲图1-28 选择Android Project创建Android应用程序

▲图1-29 “New Android Application”对话框
(3)在“New Android Application”对话框中输入应用程序的名称(在这里输入的是Sample_1_1),然后在Project Name中输入项目名称(这里输入的名称与Application Name中的相同,当然也可以不同),同时在Package Name中输入应用程序的包名(这里输入的是wyf.ytl),如图1-29所示。
(4)接着在Minimum Required SDK中选择应用程序最低版本(这里选择的是Android 2.2版本),最后在Target SDK中选择应用程序的目标版本,都填完后,整体情况如图1-29所示。
提示
创建项目时输入项目包名时,需要至少使用二级包名,否则在该对话框上方会显示“Package name must have at least two identifiers.”的错误信息。
(5)单击“Next”按钮后进入如图1-30所示的界面,根据需要勾选是否创建自定义图标,勾选“Create activity”,根据需要也可更改默认的项目路径,最后单击“Next”按钮执行下一步。接着在如图1-31所示的界面中选择Activity样式,此处选择的是“Blank Activity”,单击“Next”按钮执行下一步。

▲图1-30 创建项目截图1

▲图1-31 创建项目截图2
(6)在如图1-32所示的界面中输入Activity Name——Hello Android和Layout Name——main,单击“Finish”按钮完成项目的创建。此时在Eclipse的Project Explorer界面中会自动添加创建的项目Sample_1_1,其目录结构如图1-33所示。

▲图1-32 单击“Finish”按钮创建项目

▲图1-33 创建完成的Android项目
(7)在项目名上单击鼠标右键,然后依次选择“Run As/Android Application”即可运行刚才创建的HelloAndroid项目,该项目在模拟器上的运行效果如图1-34和图1-35所示。

▲图1-34 HelloAndroid项目竖屏效果

▲图1-35 HelloAndroid项目横屏效果
提示
因为有很多程序或者游戏是横屏模式的,所以在程序调试过程中,可能需要将模拟器切换成横屏模式,读者可以通过使用快捷键Ctrl+F12来切换模拟器的横、竖屏模式,HelloAndroid程序在横屏模拟器中运行效果如图1-35所示。
2.HelloAndroid的简单讲解
通过前面的学习,读者已经能够创建并运行简单的Android程序了,但可能对Android项目还不够了解,接下来将通过对HelloAndroid程序的详细介绍使读者了解Android项目的目录结构以及HelloAndroid的运行机理。
(1)首先将介绍一下HelloAndroid项目中各个目录和文件的作用,正确理解Android项目中各个目录和文件的作用,可以使读者对Android项目的运行机理有一个更加深刻的印象,对以后开发其他Android项目有很大帮助。
●src目录:该目录用来存放应用程序中所有的源代码,其中代码的源文件一般是存放在相应的包下面。在开发Android应用程序时,大部分时间都是在编写src中的源代码,src中的源代码可以说是Android应用程序的基础。
●gen目录:该目录下一般只有一个文件,即R文件。该文件是由ADT自动产生的,存放的是应用程序中所使用的全部资源文件的ID,在应用程序开发过程中只是使用R文件,一般不需人工修改该文件。
●assets目录:该目录中存放Android应用程序中使用的外部资源文件,例如音频文件、视频文件、数据文件等。在Android应用程序中可以通过输入或输出流对asserts目录中的文件进行读写操作,从而使Android应用程序更加具有吸引力。
●res资源目录:该目录下一般有drawable系列文件、layout布局文件以及values资源描述文件,这些文件用来存放Android应用程序中所需的图片资源、界面描述文件以及资源描述文件等。后面将对这些文件夹逐一进行介绍。
●drawable系列文件夹:一般有drawable-hdpi、drawable-mdpi、drawable-ldpi3个文件夹,这3个文件夹分别用来存放不同分辨率目标设备的图片资源。当应用程序在目标设备上运行时,系统会自动根据目标设备的分辨率选择对应文件夹下的图片。
●layout文件夹:该文件夹下包含了所有使用xml格式的界面描述文件,这些文件主要用于表述应用程序中用户界面的布局。
●values文件夹:该文件夹中包含了一些xml格式的资源描述文件,一般包括string.xml(字符串资源)、colors.xml(颜色资源)、style(样式资源)等。
●AndroidManifest.xml,该文件是整个程序的系统控制文件,是每个应用程序都不可缺少的。它描述了应用程序有哪些组件、哪些资源、哪些权限等。
(2)上面介绍了HelloAndroid项目中各个目录和文件的作用,接下来介绍的是该项目的系统控制文件AndroidManifest.xml,该文件的主要功能为定义该项目的使用架构、版本号、SDK的版本以及声明Activity组件等,其具体代码如下。
代码位置:见随书光盘中源代码/第1章/Sample_1_1目录下的AndroidManifest.xml。
1 <? xml version="1.0" encoding="utf-8"? > <! --XML的版本以及编码方式--> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="wyf.ytl" 4 android:versionCode="1" 5 android:versionName="1.0"><! --该标记定义了该项目的使用架构,所在的包以及版本号--> 6 <uses-sdk android:minSdkVersion="14" 7 android:targetSdkVersion="17" /> <! -- 声明SDK的版本 --> 8 <application android:icon="@drawable/ic_launcher" 9 android:label="@string/app_name" 10 android:theme="@style/AppTheme"><! -- 定义了该项目在手机中的图标以及名称 --> 11 <activity android:name="wyf.ytl.MainActivity" 12 android:label="@string/app_name" > <! -- 声明Activity组件 --> 13 <intent-filter> 14 <action android:name="android.intent.action.MAIN" /> 15 <category android:name="android.intent.category.LAUNCHER" /> 16 </intent-filter> <! -- 声明Activity可以接受的Intent--> 17 </activity> 18 </application> 19 </manifest>
说明
定义了一个名为HelloAndroid的Activity以及该Activity能够接受的intent,并且给出了程序的版本、编码方式、用到的架构、该程序所在的包与版本号、程序的SDK版本程序、在手机上的显示图标、显示名称以及显示风格等。
(3)上面介绍了HelloAndroid项目的系统控制文件AndroidManifest.xml,接下来介绍的是该项目的布局文件main.xml,该文件的主要功能为声明XML文件的版本以及编码方式、定义布局并添加控件TextView,其具体代码如下。
代码位置:见随书光盘中源代码/第1章/Sample_1_1/res/Layout目录下的main.xml。
1 <? xml version="1.0" encoding="utf-8"? > <! -- XML的版本以及编码方式 --> 2 < RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:orientation="vertical" 4 android:layout_width="fill_parent" 5 android:layout_height="fill_parent" > <! --定义了一个布局,布局方式是垂直的--> 6 <TextView 8 android:layout_width="fill_parent" 9 android:layout_height="wrap_content" 10 android:text="@string/hello" /> <! --向布局中添加一个TextView控件--> 11 </ RelativeLayout >
说明
定义了布局方式为RelativeLayout,且左右和上下的填充方式为fill_parent,并向该布局中添加了一个TextView控件,其宽度和高度模式分别为fill_parent、wrap_content,在TextView控件显示的内容为string.xml中的hello的内容。
(4)上面介绍了本项目的布局文件main.xml,接下来将为读者介绍的是项目的主控制类HelloAndroid。本类为继承自Android系统Activity的子类,其主要功能为调用父类的onCreate方法,并切换到main布局,其具体代码如下。
代码位置:见随书光盘中源代码/第1章/Sample_1_1/src/wyf/ytl目录下的HelloAndroid.java。
1 package wyf.ytl; 2 import android.app.Activity; //引入相关类 3 import android.os.Bundle; 4 public class HelloAndroid extends Activity { //定义一个Activity 5 @Override 6 public void onCreate(Bundle savedInstanceState) {//重写的onCreate回调方法 7 super.onCreate(savedInstanceState); //调用基类的onCreate方法 8 setContentView(R.layout.main); //指定当前显示的布局 9 }}
说明
对继承自Activity子类的声明,重写了Activity的onCreate回调方法,在onCreate方法中先调用基类的onCreate方法,然后指定用户界面为R.layout.main,对应的文件为res/layout/main.xml。
1.4 DDMS的灵活应用
作为一名合格的软件开发人员,必须要学会怎样去调试程序。调试是一个程序员最基本的技能,其重要性甚至超过学好一门语言。那么什么是调试呢?所谓调试,就是在软件投入实际使用前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证软件系统正确性的必不可少的步骤。
Android为开发人员提供了一个强大的调试工具——DDMS,通过DDMS可以调试并监控程序的运行,更好地帮助开发人员完成软件的调试和开发。本节将对DDMS的使用进行详细的讲解,帮助读者提高对软件整体的把握能力。
1.4.1 初识DDMS
一般情况下,在Eclipse中安装了ADT插件后,Eclipse窗口的右上角会有DDMS的选项按钮,如图1-36所示。若DDMS按钮
是隐藏的,读者可以通过Eclipse窗口界面右上角的
(Open Perstective)按钮来打开DDMS,如图1-37所示。单击
按钮即可切换到DDMS界面,如图1-38所示。

▲图1-36 DDMS按钮

▲图1-37 使用Open Perstective按钮打开DDMS

▲图1-38 DDMS界面
说明
该窗口的布局可自行调整,主要包括Device(s设备列表面板)、Emulator Control(模拟器控制器面板)、LogCat(日志显示面板)、Threads(线程监控面板)、Heap(内存堆监控面板)、Allocation Tracker(对象分布监控面板)、File Explorer(文件浏览器面板)等。
1.4.2 强大的日志管理功能——LogCat的使用
查看日志文件,可以使程序员完全了解程序的运行状况,从而进一步优化和修改程序代码,LogCat为开发人员提供了强大的日志管理功能,通过LogCat可以查看模拟器运行的所有状态,还可以通过过滤器来筛选出自己需要的日志。
打开DDMS后单击LogCat选项卡,打开LogCat面板,默认看到的是模拟器所有的日志,如图1-39所示,其中包括verbose、debug、info、warn、error和assert共6种类别。开发人员可以使用Java中的System.out.println()方法来打印输出,辅助调试程序。运行程序后,打印输出的内容便显示在LogCat中,如图1-39所示。

▲图1-39 打印输出
如果读者觉得Log中有太多的无用信息,还可以自建日志过滤器,只显示自己需要的日志文件。方法是:单击LogCat面板右上角的绿色加号,弹出“LogFilter”对话框,在Filter Name中输入过滤器的名称,在by Log Tag中输入要过滤的内容,如图1-40所示即可,此时再次运行程序,选择自定义日志选项卡,可以看到日志中只有System.out的内容,如图1-41所示。

▲图1-40 “Log Filter”对话框

▲图1-41 只查看System.out输出的信息
1.4.3 Devices的管理
Devices选项卡提供了软件截图的功能,可以方便地对多个模拟器和模拟器的进程、线程、堆等进行管理,如图1-42所示。其中Devices面板还可以与其他面板共同使用,例如Threads选项卡、Heap选项卡等,从而进行程序线程和堆的管理。

▲图1-42 Devices面板
1.Devices简介
首先介绍Devices选项卡的基本功能,如图1-42所示,这里开启了两个Android模拟器,从图中可以看到两个模拟器都出现在了Devices选项卡面板中,名称分别为emulator-5554和emulator-5556,通过单击模拟器的名称,可以在多个模拟器中进行切换。
●截图功能。在模拟器中运行程序,如需要对软件运行效果进行抓图,则可在需要抓图的界面停留,然后单击“Devices”选项卡右上角的“Screen Capture”按钮,显示截图对话框。在对话框中可以预览图片,并进行刷新、图片旋转、保存、复制等,如图1-43所示。

▲图1-43 截图对话框
●结束进程功能。先单击选中模拟器中要结束的进程,然后单击“Devices”选项卡右上角的“Stop Process”按钮,即可强制结束进程。如要结束模拟器中的“com.anroid.music”进程,如图1-44所示。

▲图1-44 结束music进程
●在“Devices”面板中,还可对某一进程进行“心电图”测试。首先选中要测试的进程,单击“Devices”面板右上角的“star Method Profiling”按钮,待程序运行一段时间后,单击“Devices”面板右上角的“stop Method Profiling”按钮,等待一段时间后,自动弹出“心电图”窗口,如图1-45所示。

▲图1-45 进程“心电图”
2.Devices与Threads
上面介绍的只是“Devices”面板简单的两个功能,下面介绍Devices面板与Threads面板共同使用,进行程序线程的管理。一个程序假如开太多的线程即使机器性能再好,也会慢如龟速,所以线程的控制就显得尤为重要了,线程的查看方法如下。
(1)选中“Devices”面板中要查看的程序进程。
(2)单击“Devices”面板右上角的“Update Threads”按钮。
(3)单击“Threads”选项卡,即可查看该进程的所有线程及线程的运行情况,如图1-46所示。

▲图1-46 Threads查看
3.Devices与Heap
虽然当下的手机性能越来越好,手机内存当然也越来越大,但是程序过多地占用内存也是不允许的,这不仅会使程序显得很慢造成用户的不满,而且会造成程序的臃肿,甚至瘫掉。作为合格的软件开发人员,必须严格地管理自己程序的内存使用情况,在条件允许的情况下,尽量优化程序,用最小的内存完美地运行程序。堆的查看和管理方法如下。
(1)选中“Devices”面板中要查看的程序进程。
(2)单击“Devices”面板右上角的“Update Heap”按钮。
(3)单击“Heap”选项卡,在该选项卡中单击“Cause GC”按钮,即可进行程序堆的详细查看和管理,如图1-47所示。

▲图1-47 堆的查看和管理
1.4.4 模拟器控制(Emulator Control)详解
Emulator Control顾名思义,即模拟器控制。通过“Emulator Control”面板(如图1-48所示)可以非常容易地使用模拟器模拟真实手机所具备的一些交互功能,如接听电话、模拟各种不同网络环境、模拟接收SMS消息和发生虚拟的地址坐标用于测试GPS相关功能等。

▲图1-48 Emulator Control面板
●Telephony Status:通过选项模拟语音质量以及信号连接模式。
●Telephony Actions:模拟电话接听和发送SMS到测试终端。
●Location Controls:模拟地理坐标或者模拟动态的路线坐标变化并显示预设的地理标识。
●模拟地理坐标的三种方式为:Manual(手动为终端发送经纬度坐标)、GPX(通过GPX文件导入序列动态变化地理坐标,从而模拟行进中GPS变化的数值)和KML(通过KML文件导入独特的地理标识,并以动态形式根据变化的地理坐标显示在测试终端)。
1.4.5 File Explorer——SD Card文件管理器
File Explorer是Android SDK提供的管理SD Card的文件管理器。通过File Explorer可以查看程序对SD Card的使用情况,从而判断程序是否正确运行,具体步骤如下。
(1)选择要查看的模拟器。
(2)单击File Explorer选项卡,如图1-49所示。从图1-49中可以看到该管理器很类似于Windows的资源管理器,可以通过单击方便地查看任何文件。

▲图1-49 SD Card文件管理器
(3)单击File Explorer选项卡右上角的两个按钮,可以方便地进行文件的导入和导出。
1.5 本书案例项目的导入
前面介绍了如何搭建Android开发环境、如何开发Hello Android应用程序以及DDMS的应用等,接下来将为读者详细地介绍已有Android项目的导入与运行。本节将以导入本书第4章BN理财助手为例进行详细讲解,具体内容如下。
1.5.1 导入并运行Android程序
首先为读者介绍的是怎样将已有的Android项目导入Eclipse,然后介绍的是Android项目的运行,此处Android项目运行在移动设备上,将以导入并运行本书第4章BN理财助手为例进行详细讲解,其具体步骤如下。
(1)首先将随书光盘中源代码目录下的第4章子目录下的BN理财助手项目拷贝到开发用PC的“E:\软件\workspace”路径下。点击“eclipse.exe”,启动Eclipse集成环境,如图1-50所示。一般第一次使用时Eclipse都会显示欢迎界面,此时若不需要将其关闭即可。

▲图1-50 Eclipse开发工具欢迎界面
(2)关闭欢迎界面后,将进入Eclipse的主界面,如图1-51所示。接着选择“File”菜单项,并点击其下的“Import”子菜单项,如图1-52所示。

▲图1-51 Eclipse开发工具主界面

▲图1-52 项目导入图1
(3)点击“Import”子菜单项后系统将弹出“Import”对话框,此时选择“General”项目下的“Existing Projects into Workspace”子项,并按下“Next”按钮,如图1-53所示。按下“Import”对话框中的“Next”按钮,系统将弹出项目导入对话框,如图1-54所示。

▲图1-53 项目导入图2

▲图1-54 项目导入图3
(4)在项目导入对话框中首先点击右上侧的“Browse...”按钮,找到工作区“E: \软件\workspace”,系统将工作区中的所有项目导入到“Projects”,选中“BN-Financial_assistant”项目,并按下“Finish”按钮,即可完成项目的导入。
(5)项目导入成功后,系统将自动关闭项目导入对话框,回到Eclipse主界面,如图1-55所示。此时在界面左侧的项目列表中可以看到导入的BN-Financial_assistant项目,从图1-55中可以看出。此时可以用鼠标点击左侧的“BN-Financial_assistant”,待其展开后再点击其下的“src”子目录便可查看src的目录结构,如图1-56所示。

▲图1-55 项目导入成功

▲图1-56 项目的src目录
(6)将Android设备连接到运行Eclipse的PC上,打开Android设备的USB调试功能。然后点击主界面右上侧的“DDMS”按钮(如图1-57步骤(1)所示),在“Devices”列表中即可看到自己连接的Android设备,并可以看到设备的名称。若希望切换回原来的界面,仅仅需要按下主界面右上侧的“Java”按钮(如图1-57步骤(2)所示)即可。

▲图1-57 移动设备的连接
(7)用鼠标选中主界面左侧项目列表中的“BN-Financial_assistant”项目,点击鼠标右键,在弹出的右键菜单中选择“Run As”选项,接着选择其下的“Android Application”子项,如图1-58所示。

▲图1-58 项目的运行1
(8)点击“Android Application”子项,界面中会弹出如图1-59所示的界面。选中当前连接的Android设备,并点击“OK”按钮,即可将项目运行到所连接的Android设备,如图1-60所示。

▲图1-59 项目的运行2

▲图1-60 项目运行界面
提示
由于模拟器的性能低、兼容性差,所以此处给出的是在实际移动设备上运行BN-Financial_assistant案例。此外,本书中其他大案例可能也会出现由于模拟器性能问题或兼容性问题导致运行效果不佳或不正确的情况,此时读者可在真机上运行查看。
1.5.2 Android程序的监控与调试
前面几个小节已经对Android应用程序的导入及运行进行了详细讲解,本小节将介绍如何通过DDMS来监控Android应用程序的运行以及如何调试Android程序。在调试过程中使用了android.util.Log类,该类简单易用。监控与调试的详细步骤如下。
(1)打开刚刚导入的项目,依次选择src/com.bn.account找到AccountActivity.java文件,在第125行super.onCreate (savedInstanceState);之后添加“Log.d("TAG", "This is message! ");”语句。在项目名上单击鼠标右键,然后依次选择“Run As/Android Application”运行该项目。
(2)单击Eclipse右上角的DDMS,切换到DDMS视角。LogCat显示在屏幕的下方,系统中所有的日志都将出现在LogCat中,通过对LogCat的观察可以详细了解Android程序运行的过程。
(3)在图1-61中可以看到在程序中添加的日志输出,这样在程序的开发过程中可以随时使用Log类来打印需要打印的信息,而当LogCat中日志或者其他信息过多时,可以使用过滤器Filter通过对tag进行过滤来筛选log。

▲图1-61 LogCat界面
1.6 本章小结
本章首先介绍了Android的诞生及其特点,相信读者对Android开发平台已有所了解。本章中还介绍了Android开发环境的搭建以及用Android创建的第一个应用程序——Hello Android,通过该程序,读者应该对Android应用程序的开发步骤有所了解。
本章重点为读者介绍的是Android应用程序的详细调试方法、项目结构和系统架构,它们能够帮助读者进一步更深层次地了解Android。对于理论性的知识,读者只需要先暂时有些概念,在以后的学习中结合实际例子之后,会有更进一步的理解。