Android 3D游戏开发技术详解与典型案例
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第一篇 必知必会的基础知识

第1章 英雄还看今朝——Android简介

Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称。该平台由操作系统、中间件、用户界面和应用软件组成,号称是首个为移动终端打造的真正开放和完整的移动软件。

1.1 群雄割据的手机市场

话说天下之势分久必合、合久必分,手机市场也从当年的单一非智能平台发展到了如今的群雄割据的局面。Android、iPhone无数的光环围绕在这两颗新星周围。

1.1.1 手机市场的两颗新星

2007年1月9日,iPhone(如图1-1所示)的诞生开创了移动设备软件尖端功能的新纪元,其重新定义了移动电话的功能,个人数码助理、媒体播放器、无线通信设备、多点触控技术、感应器、10万种的软件应用,苹果似乎总是可以把下个世纪的产品带到这个世纪来,乔布斯再次创造了新的神话。

图1-1 iPhone手机

但是紧邻其后,2007年11月5日Google宣布了一个基于Linux平台的开源手机操作系统—Android,该平台由操作系统、中间件、用户界面和应用软件组成,是首个为移动终端打造的真正开放和完整的移动软件。如图1-2所示,为第一款搭载Android平台的手机G1。

图1-2 G1手机

1.1.2 手机操作系统的5大元老

与此同时手机操作系统的几大元老们—Symbian、Windows、Palm OS、Linux和BlackBerry OS似乎也在寻求转型之路以适应新的市场。

以Nokia为主导的Symbian操作系统是当今手机市场的霸主,其市场占有率一直稳居榜首。但是各项数据都表明Symbian的市场占有率在被Android、iPhone等新兴的操作系统蚕食,Nokia自身也意识到了这一点,在2008年10月2日其发布了装载全新操作系统的Symbian S60 V5版本的Nokia 5800 XpressMusic手机,如图1-3所示,这也意味着Android、iPhone等新兴的操作系统让Nokia已经有些坐立不安了。

图1-3 Nokia 5800 XM手机

Microsoft自己声明要将Windows Mobile重新设计,也从侧面反映了除新设计的Windows Mobile 7以外的其他WM产品,已经不能适应市场的需求,如图1-4为搭载Windows Mobile 6.5 Professional的HTC HD2手机。而MOTO全面转向Android平台,也让Linux似乎显得更加形单影只,Palm OS及BlackBerry OS似乎一直也没搭上中国手机市场繁荣发展的顺风车,甚至在中国市场的知名度都不是很高。

图1-4 为HTC HD2手机

1.2 Android的未来及特点

在Google中输入Android,可以获得11亿条以上的结果,大部分是关于技术的文章、新软件的发布、市场占有率的提升等,基本上都是Android的正面消息。而打开招聘网站,Android的程序员需求与日俱增,无数的消息都在告诉我们:Android,你就是下一代移动平台的霸主。

1.2.1 得中国市场者得天下

2010年5月27日手机广告公司AdMob发表报告称:中国市场上Android手机销量超过苹果iPhone。而在仅仅的2个月后《福布斯》杂志网络版周二刊文指出Android手机销量将达到iPhone销量的3倍。

另一方面,Android更加贴近中国公民的购买力,Android为不同层次的消费群体量身定做了属于他们的产品。而软件方面,Android的软件从无到有,在到现在几乎所有的手机软件都能找到Android版本。Android在中国市场的脚步越走越快。

中国拥有全世界最多的人口,中国的经济发展速度如日中天,得中国市场就得到了天下五分之一的市场,Android在中国正在阔步前进,未来一片光明。

1.2.2 全新的概念带来全新的体验

平台的开放性,应用程序间的平等性,无界限、快速方便的应用程序开发,不管是给用户还是给应用程序开发人员,都带来了全新的体验。

Android是一个真正意义上的开放性移动开发平台,其不仅仅包含上层的用户界面和应用程序,还包括底层的操作系统。所有的Android应用程序都运行在虚拟机上,程序之间是完全平等的,用户可以随意将第三方软件置换掉系统自带的系统软件。

一个应用程序不但可以通过API访问系统提供的功能,还可以声明自身的功能供其他应用程序调用。同时Android为开发人员提供了大量的适用库和工具,使得开发人员可以快速创建自己的应用程序。

1.3 Android开发环境的搭建

本节主要讲解基于Eclipse的Android开发环境的搭建,及模拟器的创建和运行。

1.3.1 SDK的安装及环境配置

构建Android的平台,首先要安装Java的JDK和配置环境变量。具体步骤如下。

● 登录Oracle网站http://www.oracle.com/technetwork/java/javase/downloads/index.html,下载最新的JDK安装程序。

● 双击下载的JDK安装包,将其安装到默认目录(用户也可自己定制)下。

● 右击“我的电脑”图标,选择属性➔高级➔环境变量命令,添加path变量,值设置为:C:\Program Files\Java\jdk1.6.0\bin。

● 在环境变量中配置JAVA_HOME,在系统变量中添加JAVA_HOME,值设为:C:\Program Files\Java\jdk1.6.0。

在安装完JDK后,就需要下载及安装Android SDK。具体步骤如下。

● 登录http://developer.android.com页面下载最新的SDK,本书使用的版本是2.1。读者也可以自行下载其他版本,安装类似。

● 将下载好的SDK压缩包解压到硬盘目录下,在环境变量中配置参数,配置系统变量path的值为:C:\Program Files\android-sdk-windows\tools。至此环境变量配置完成,单击确定按钮完成配置。

1.3.2 Eclipse集成开发环境的搭建

在完成了SDK的安装及配置后,读者就可以安装及配置Eclipse集成开发环境了,具体步骤如下。

● 首先登录Eclipse官网http://www.eclipse.org/downloads/,下载Eclipse,笔者使用的是3.5.2版。

● 将下载完的Eclipse安装包解压到硬盘下,双击eclipse.exe文件打开Eclipse。

● 在Help菜单中选择Install New Software,如图1-5所示,进入Install界面。

图1-5 安装新软件

● 接下来安装ADT,在Install界面中单击Add按钮,在Name中可输入任意名字,笔者输入的是:Android adt,在Location中输入:http://dl-ssl.google.com/android/eclipse/,如图1-6所示。

图1-6 安装ADT

● 在Install界面选中Developer Tools并单击Next按钮。安装完后,在弹出的界面中,直接单击Finish按钮,重启Eclipse,至此完成了ADT的安装。

● 重启Eclipse后,选择Window菜单中的Preferences命令,打开Preferences界面。

● 在Preferences界面中单击Browse按钮,添加Android SDK,如图1-7所示。

图1-7 在Eclipse中添加Android SDK

至此,在Eclipse中就成功安装和配置了Android SDK。

1.3.3 模拟器的创建和运行

成功安装和配置Android SDK后便可以创建和运行Android模拟器了。在Eclipse中单击Opens the Android SDK and AVD Manager按钮(如图1-8所示),打开Android SDK and AVD Manager(如图1-9所示)。

图1-8 Opens the Android SDK and AVD Manager按钮

图1-9 AVD设置

打开Android SDK and AVD Manager后单击New按钮,弹出Create new Android Virtual Device(AVD)对话框,在其中输入模拟器的名字,笔者输入的是Android2_1。Target选择Android 2.1 –API Level 7,设置模拟器的版本为Android 2.1。SD Card中Size设置为50,即创建50MB的SD卡。在Built-in中选择分辨率,笔者选择的是默认分辨率HVGA,如图1-9所示。

配置完成后,单击Create AVD按钮,然后回到Android SDK and AVD Manager界面,之后选中刚刚创建的模拟器,单击Start按钮,运行模拟器。

如图1-10所示为Android模拟器界面。至此基于Eclipse环境的Android平台搭建成功。

图1-10 Android模拟器

1.4 第一个Android应用程序的开发

千里之行始于足下,相信大部分读者在学习Java时也是从Hello World开始的。本小节讲述如何在Android中写自己的第一个Hello World程序,及简单介绍一下Android应用程序的调试。

1.4.1 第一个Android程序

打开Eclipse,依次选择File→New→Android Project命令来创建一个新的Android项目。如图1-11所示,创建Sample1_1程序,具体步骤如下。

图1-11 创建Sample1_1程序

● 在Project name中输入项目名称,笔者输入的是Sample1_1。

● 在Build Target中选择项目的版本,本书中均使用Android 2.1版本。

● 在Application name中输入程序的名称,笔者输入的是Sample1_1。

● 在Package name中输入程序的包名,笔者输入的是wyf.zcl。

● 选中Create Activity复选框,让系统帮我们创建一个Activity,输入Activity名称,笔者输入的是MyActivity。

提示:在Package name中输入的包名,必须是两级以上的包名。

设置完成后单击Finish按钮,在Project Explorer中则会自动增加一个项目包。项目包中每个文件夹及其文件的作用在下一小节中笔者会一一分析,这里还是先继续Sample1_1程序。

● 首先展开项目包,找到values文件夹,打开其中的strings.xml文件,如图1-12所示,添加字符串资源。

图1-12 strings.xml位置

● 在strings.xml左下角有两个视图,Resources与strings.xml,前者所见即所得,后者通过xml文件添加字符串资源。笔者这里将介绍后者。

● 将<string name="hello">Hello World, MyActivity!</string>一行删除,该行是默认情况下Activity中显示的字符串信息。然后在</resources>标记前添加代码<string name="hello">Hello World, lost in android</string>。

● 单击运行按钮,如图1-13所示,运行我们第一个程序。

图1-13 运行程序按钮

● 运行效果如图1-14所示。

图1-14 第一个Sample1_1程序的运行效果

提示:选择自动创建Activity,是让开发环境帮我们创建,省去我们一些不必要的工作,读者也可以自己创建一个类继承Activity。在项目生成后,读者可自己运行一下,观看系统默认情况下生成程序的效果。

1.4.2 Android应用程序的调试

Android为我们提供了一个强大的调试工具DDMS,通过DDMS可以调试并监控程序的运行。Android除了可以用System.out.println(“…”);语句来打印输出外,还为我们提供了另外一个类android.util.Log来调试程序。下面就为大家一一讲解两种方法的使用方法。

首先讲解在Java中十分熟悉的System.out.println();方法进行打印输出,具体步骤如下。

● 首先创建一个新的项目,项目名及程序名为Sample1_2,Activity名为MyActivity。

● 项目创建成功后,依次打开src文件夹下的wyf.zcl包中的MyActivity.java文件。

● 然后在setContentView(R.layout.main);下面添加一句代码:System.out.println("first System.out.println");

● 运行程序,便可在DDMS中观看效果了。

提示:默认情况下,DDMS的按钮是隐藏的,读者需要通过Open Perstective来添加DDMS,通常Open Perstective在开发环境的右上角,如图1-15所示。

图1-15 Open Perstective和DDMS按钮

● 打开DDMS,找到LogCat面板,单击DEBUG按钮,如图1-16所示,在Log选项卡中可以找到我们刚刚打印的语句了,如图1-17所示。

图1-16 DEBUG按钮

图1-17 Log面板打印输出

● 如果读者觉得在Log中有太多信息,也可以在LogCat中添加一个专门输出System.out信息的面板。单击DEBUG按钮后面的加号,会弹出Log Filter面板,在Filter Name中输入过滤器名称,在by Log Tag中输入过滤的内容,如图1-18所示。

图1-18 过滤器设置

提示:在过滤器内容一项中,因为程序是使用System.out.println()进行输出的,但有时可能用System.out.print()输出,所以此处笔者设置为System.out。

此时可以再次运行,观看效果,如图1-19所示。

图1-19 System.out输出面板

当然除了我们熟悉的System.out外,Android还为我们提供了另外一个类android.util. Log进行打印输出调试,下面介绍Log类的使用,步骤如下。

● 在PrintDemo例子中注释我们刚刚添加的System.out.println("first System.out.println");,然后在后面添加代码Log.d("TAG", "first Log");。

● 运行程序,在DDMS中找到LogCat面板,切换到Log页面,观看打印的内容,如图1-20所示。

图1-20 Log输出内容

提示:public static int d (String tag, String msg)方法为打印输出,tag为输出的标签,mag为输出的信息内容。使用该方法还需要导入import android.util.Log包。

两种输出各有优缺点,读者可在日后的学习中慢慢体会,看情况选择。

1.5 Android应用程序运行的内部机制

前几个小节介绍了Eclipse集成环境的安装和配置,以及简单的Android应用程序的创建及调试功能,接下来将简要介绍一下Android应用程序运行的内部机制。

1.5.1 Android应用程序的项目结构

上一小节的两个例子读者已经知道了,通过Android SDK可以自动生成一个项目包,但是没有对项目包里的内容进行介绍,本小节对项目包中的内容进行一一介绍,项目包如图1-21所示。

图1-21 Android应用程序项目结构

src源代码目录:该目录存放Android应用程序所有的源代码。该目录项有不同的包,包中对应我们开发的源程序,我们开发的主要精力都集中在开发src目录下的内容。

gen文件夹目录:该目录存放了Eclipse的ADT插件自动生成的R.java文件。实际上R.java定义了一个R类,它包含了应用中用户界面、图像、字符串等各种资源与之相对应的资源编号(id),这些资源编号都是系统自动生成的,即有一个资源对象,系统就为此在R类中生成相应的资源编号,好比一本字典。

提示:Android应用程序中通过R类别来实现对资源的应用。同时,编译器也会查看这个资源列表,没有使用到的资源就不会编译进去,为手机应用程序节省空间。

res资源目录:该目录下定义了drawable、layout及values 3个目录,下面对这3个目录一一进行介绍。

● drawable目录:该目录下有drawable-hdpi、drawable-ldpi、drawable-mdpi 3个文件夹分别用来存放不同分辨率的图片资源,用于不同分辨率的手机的开发,开发人员可以通过Resource.getDrawable(id)获得该资源。

● layout目录:该目录下包含了所有使用XML格式的界面描述文件。主要用于表述应用程序的用户界面布局,也用于描述用户界面和接口组件。一般一个用户界面布局一个XML文件。

● values目录:该目录包含了使用XML格式的参数描述文件,读者可以在此添加一些额外的资源如字符串(string.xml)、颜色(color.xml)、样式(style.xml)和数组(arrays.xml)等。主要用于在代码中通过R类来调用它们,而不直接使用,这样就可将代码和资源分开管理,便于维护。

除了以上文件夹外,还有一个AndroidManifest.xml文件,它是系统的控制文件,告诉系统如何处理创建的所有顶层组件,尤其是Activity、Intent、Service及ContentProvider,凡是需要用到的组件都要在此注册。同时,该文件也是所有Android应用程序都需要的文件,其描述了程序包的全局变量,包括公开的应用程序组件和每个组件的实现类,什么样的数据可以操作,在什么地方可以运行等。

提示:除上述功能以外,在AndroidManifest.xml文件中也可以指定权限、安全控制及测试,这些功能在以后的开发中会经常用到。

1.5.2 Android应用程序的系统架构

从软件分层的角度看,Android平台由应用程序、应用程序框架、Android运行时、系统库,以及Linux内核构成,如图1-22所示。

图1-22 Android系统框架

通过图1-22,我们能够大致了解Android的系统框架,下面就一一讲解每一部分。

1.5.3 Android应用程序框架

Android应用程序框架是进行Android开发的基础,开发人员的大部分时间也是在这一层进行的,应用程序框架包含了视图系统、活动管理器、通知管理器、内容提供者、窗口管理器、位置管理器、资源管理器、电话管理器和包管理器9大部分,如图1-23所示。

图1-23 应用程序框架

应用程序框架的各部分具体功能如下所列。

● 活动管理器(Activity Manager):管理所有的应用程序生命周期,以及通常的导航返回栈。

● 窗口管理器(Window Manager):管理所有的窗口程序。

● 内容提供者(Content Provider):用来让应用程序之间互相存取/分享数据。例如,某个应用程序可以存取联系人应用程序内的联系人数据。

● 视图系统(View System):用来构建应用程序的基本组件,包含了列表、网格、文本框和按钮等。

● 包管理器(Package Manager):用来进行Android系统内的程序管理。

● 电话管理器(Telephone Manager):用来管理所有的移动设备的功能。

● 位置管理器(Location Manager):用来提供位置服务。

● 资源管理器(Resource Manager):提供各种资源让应用程序使用,比如本地化字符串、图片、布局文件。

● 通知管理器(Notification Manager):使应用程序可以在状态栏应用程序中显示警告信息。状态栏通常在手机的顶部,比如短信、语音邮件提示就会显示在这里。

提示:Android平台的应用程序平等和无界限等特性就是由应用程序框架来保证的。

1.5.4 Android运行时

Android运行时包括核心库和Dalvik虚拟机两部分,如图1-24所示,接下来我们将一一介绍这两部分。

图1-24 Android运行时

核心库:包括两大部分,一部分由Java所需调用的功能函数组成,另一部分由Android的核心库如android.os、android.net、android.media等组成。

提示:与传统的Java程序不同的是,每一个Android应用程序都有一个自有的进程,每一个Android应用程序都是用一个自有的Dalvik虚拟机来执行的。

Dalvik虚拟机:是一种基于寄存器的Java虚拟机,其依靠转换工具dx将Java字节码转换为dex格式(称为.dex)。基于寄存器的虚拟机相对于基于栈的虚拟机的优点是:其所需资源相对较少,而且硬件实现虚拟机也会比较容易。

1.5.5 系统库

应用程序框架是贴近于应用程序的软件组件服务,而更底层则是Android的函数库,这一部分是应用程序框架的支撑,其架构如图1-25所示。

图1-25 系统库

● 媒体函数库:以Packet Video公司的OpenCORE为基础所发展成的,使用这个函数库在播放、录制多种常见的影音格式时,非常方便。

● Surface Manager:负责合成2D与3D绘图的软件的合成。

● WebKit:这是一套网页浏览器的软件引擎。WebKit可以为Android内部自带的浏览器所调用,WebKit是一个开源项目,许多浏览器也都是用WebKit引擎所开发的,如Apple的Safari、Nokia s60手机的浏览器等。

● SGL:提供Android在2D绘图方面的绘图引擎。

● OpenGL ES:Android是依据OpenGL ES1.0API标准来实现其3D绘图函数库的,该函数库可以用软件方式执行,也可以用硬件加速方式执行,其中在3D软件光栅处理方面进行了高度优化。

● FreeType:该库提供位图、向量字的绘图显示。

● SSL(媒体框架):提供了对各种音频、视频的支持。Android支持多种音频、视频、静态图像格式。

● SQLite:这是一套轻量级的数据库引擎,支持关系数据库的事务等。

● Libc:提供了一套C库。

1.5.6 Linux内核

采用Linux内核(如图1-26所示)则是Android平台开放性的基础。Android平台中的操作系统采用了Linux 2.6版的内核,它包括了显示驱动、摄像头驱动、Flash内存驱动、Binder(ipc)驱动、键盘驱动、wifi驱动、Audio驱动及电源驱动。

图1-26 Linux内核

Linux内核层是软件与硬件之间的桥梁,软件开发者不必关心内核的底层实现,而只需将精力全部投入到上层软件的开发中。而底层的工作都要由Google和手机开发商来完成,如驱动的更新、新硬件驱动的编写等。

1.6 本章小结

本章介绍了市场上主流的手机平台,同时也分析了未来手机平台的发展趋势及Android平台的前景。本章还对Eclipse集成开发环境的安装与配置进行了介绍,同时创建了我们第一个Android应用程序——Sample1_1,关于Android应用程序的调试及Android应用程序的框架我们也做了简要的介绍。对于理论性的知识,读者可能暂时不能彻底理解,这些知识读者只需要先有些概念,在以后的学习中一定会遇到,结合实际例子学习之后,才能更进一步理解。