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