Android开发权威指南(第二版)
上QQ阅读APP看书,第一时间看更新

3.7 运行Android应用程序

到现在为止本章例子的代码部分已经全部编写完了,本节会运行这个例子。现在按着2.4.2小节的方式启动Android模拟器,如果读者有真机,可以用USB线将真机与电脑连接。如果读者用的是Windows,别忘了安装驱动程序或直接安装91手机助手。

现在选中Android工程,在鼠标右键菜单中单击“Run As”>“Android Application”菜单项就会运行当前的Android应用程序。

如果PC上连接了多个Android设备,就会显示如图3-9所示的选择框,读者可以选择要运行程序的Android设备。

成功运行程序后,会显示3.4节如图3-8所示的效果。单击“显示当前日期”按钮,会显示如图3-10所示的显示日期的对话框。

 

▲图3-9 选择在哪个Android设备上运行

 

▲图3-10 显示当前日期

多学一招:加快Android程序的编译速度

由于ADT的原因,在运行Android应用程序的过程中,会出现如图3-11所示的“Refreshing external folders”动作。实际上这并不是必要的,可以直接单击右侧的停止按钮停止该处理过程,这样编译Android应用程序会更快。

 

▲图3-11 运行Android应用程序的编译过程

每次修改完Java源代码并保存后,Eclipse都会自动编译当前的Android工程。这样每次都会进行刷新和编译,由于编译Android程序要比编译普通的Java程序慢一些,所以在这种情况下会影响到开发效率。为了避免这种情况的发生,可以通过单击“Project”>“Build Automatically”子菜单将自动编译功能关闭,当运行程序时编译一次即可。但如果将自动编译功能关闭,在修改资源文件(res目录中的文件)后,需要重新编译Android工程才会在R类中为刚修改的资源生成相应的变量。

扩展学习:Android应用程序的编译过程

Android应用程序(APK文件)并不是基于传统的JVM的,而是基于Dalivk虚拟机的。其中前者是Sun公司开发的(现在属于Oracle公司)基于堆栈的Java虚拟机,后者是Google公司开发的基于寄存器的Java虚拟机。在这两种虚拟机上运行的Java程序的语法相同,但二进制并不兼容。也就是说JVM的.class文件并不能在Dalivk虚拟机上直接运行,而Dalivk虚拟机格式的执行文件(.apk)也不能直接在JVM上运行。

ADT在利用Android SDK编译Android应用程序时并不是直接将Android工程编译成apk文件(Android应用程序的安装和执行程序),而是分成多步来生成apk文件。为了弄清楚具体的编译过程,读者可以打开Android工程的属性对话框,找到并单击左侧的“Builders”,会在右侧的列表中显示编译当前工程的步骤,如图3-12所示。

 

▲图3-12 编译Android应用程序的步骤

从图3-12所示的列表可以看出编译Android应用程序需要如下的4步。

Android Resource Manager:根据res目录中的资源在R类中生成相应的子类和变量。

Android Pref Compiler:编译res目录中的资源除了res/raw目录中的资源外,res目录中的其他资源都会被编译。例如,xml资源文件会被编译成二进制格式,这样直接将apk文件解压是无法得到原来的xml资源文件的。当然,可以通过一些工具反编译apk文件。关于资源和反编译的内容会在后面的章节详细介绍。

Java Builder:将Java源代码编译成.class文件。

Android Package Builder:将.class文件编译成Dalivk虚拟机格式的文件(classes.dex将apk文件解压,就会看到classes.dex文件。),然后将classes.dex和其他文件包括被编译和未被编译的资源文件、AndroidManifest.xml文件等。一起打包成apk文件就是zip格式的压缩包,只是文件扩展名是apk。

从编译Android应用程序的步骤可以看出,ADT首先处理了Android工程中的资源,然后将Java代码编译成JVM格式的.class文件。最后再将.class文件转换成Dalivk虚拟机格式的classes.dex文件,并进一步打包成apk文件。而传统的Java程序只会将.java文件编译成.class文件,也就是说只执行了图3-12所示编译步骤的第3步。因此,Android应用程序编译生成最终的apk文件的步骤要比编译传统的Java程序多了3步,这也是为什么编译Android工程会比较慢的主要原因。