我们知道,开发一个软件产品,最怕的就是没有辅助IDE工具。如果要用文本编辑器,一行一行的coding,效率太低了。现在的应用非常复杂,一个应用包括资源文件、源码文件、签名加密文件等,非常多。好在Android为应用开发提供了对应的便利工具。开发APP应用最常用的是SDK,另外还有NDK。这两大利刃作为分发包其中包含了许多开发工具。另外最重要的一点就是ECLIPSE,基于Eclipse的ADT插件可以自动调用之些工具,让你图形化的完成一个软件从开发到发布的全过程。
1.4.1Android AVD
开发一个应用APP,首要的条件就是可以运行这个应用APP的机器,通常我们可以将开发好的应用装载到真机上进行测试,但是一般情况下,特别是针对不同版本的Android开发,这是非常不方便的。因此,Android提供了Android virtual device(AVD),注意,这个AVD可不是像它字面所表达的那样是一个虚拟设备,实际上它只是我们Android模拟器的虚拟设备配置项,这些配置项定义了将要运行的模拟器的硬件和软件特征。起动一个模拟器首要条件就是AVD。通常管理AVD是通过SDKmanger的图形化界面,当然这个界面也可以从Eclipse中直接打开。
从命令行,也可以创建、删除、更新一个AVD,缺省创建的AVD文件保存路径在C:\Documents and Settings\<user>\.android\下。
1.4.2 Android 真机调试
我们开发一个应用APP,最终的目的就是发布到手机上运行。在开发过程中,我们通常使用模拟器,便于加快开发速度,另外也便于在不同的硬件和不同的操作系统版本下进行调试。但有些如重力感兴等,模拟器无法模拟的硬件条件,你就需要使用一台真机进行一下测试。在windows XP平台上,你需要安装USB驱动,安装完了USB驱动后,你可以在设备管理器中检查是否有新增设备adb USB Devices,需要手机与计算机用USB连上,才能看到如下内容。
你也可以使用adb 命令来查看设备
其次你需要设置你的Android手机,在设置-》应用程序-》开发—》USB调试,将这个选项勾上。另外你的应用在AndroidManifest.xml中设置android:debuggable=”true”。
运行你的应用时,你就会发现一个弹出框要求你选择应用的部署机器,是模拟机还是真机。
1.4.3 Android 模拟器调试
Android 模拟器是一个基于QEMU的应用,我们知道QEMU是大名鼎鼎的不同CPU机器的模拟器,它能模拟X86,ARM机器的CPU。在Android源码中,它被命名为goldfish,用来模拟一些ARM SOC的常见功能,如arm926ej-S CPU, MMC,RTC,keyboard,USB gadget,Framebuffer,TTY driver NAND FLash等。使用android模拟器首先需要创建一个AVD,通过AVD中定义的硬件和软件选项,模拟器模拟不同的硬件和软件需求。
起动和停止一个模拟器非常简单,通常可以在Eclipse的AVD界面中直接起动,也可以用命令行来启动。
Android模拟器运行起来后,所有的数据都来源于AVD下面的四个image:userdata.img sdcard.img userdata-qemu.img cache.img.这些image在创建AVD时通常都会创建好,如果没有创建或者想要更换时,可以在启动模拟器时指定参数-data/-cache/-initdata/-sdcard/ 等。
Android模拟器启动以后,自己为自己建立了一个独立的网段10.0.2.*,在这个网段与外面相连的是一个虚拟路由器。
在这种网络环境下,有两点特别需要注意,一个是你的HOST是代理上网时,显然模拟器需要配置代理,可以启动时加-http-proxy参数,也可以启动后在设置中设置;另一个是你的主机是DHCP获取IP和DNS,这时候,特别是在WINDOW环境下,模拟器是不能自动根据主机来得到正确的DNS,需要手工设置。方法也比较简单,就是adb shell后 setprop就可以了。
Android模拟器提供了两个连接端口,一个是ADB shell通常是5555,另外一个是Console 口,这两个端口与平常的LINUX登陆是不一样的。CONSOLE口是控制口,主要用来对一些硬件进行管理,ADB Shell是登陆到操作系统之上。
通过以上的介绍,我们可以知道Android模拟器是非常强大的。但是有些还是不支持的,比喻USB,蓝牙,像机、电量等硬件方面的一些特征。
1.4.4 Android项目生成器
Android应用开发包含了一些配置文件、资源文件、程序源文件及库文件等,这些文件共同组成的一个项目工程。默认推荐使用Eclipse ADT自动产生这些相关文件。按照功能划分,Android分成应用工程项目、测试工程项和库工程项目。其中库工程项目和一般应用工程项目创建时都一样,只要将一个属性选上就好了。
是库工程项目的default.properties中增加一行:android.library=true。这里比较烦的就是所有库文件中组件的声明需要也主应用工程的Manifest.xml中重新声明。因为可以通过Eclipse IDE很方便的创建和维护一个工程项目,使用命令方式进行工程创建的我就不细述了,但是原理是一样的。
1.4.5编译和运行
基于Eclipse 的开发,是非常简单,隐藏的按钮后的工具调用,通常你是不需要了解的,但从内部机理来说,对一个应用来说,编译和运行是通过Android提供的一些工具来实现的。如下图所示:
这些过程,当你运行Eclipse->Run as->as a Android application,Eclipse自动调用这些工具完成打包签名过程,并且启动模拟器,调用ADB工具将应用安装到模拟器上。在Eclipse上你也可以配置run configuration修改运行时的一些参数,如下图所示,你可以选择缺省的模拟器(你有多个模拟器的前提下)。
当然你也可以使用ant编写脚本工具进行项目编译打包测试。ant会跟自动产生的build.xml进行编译、打包发布过程。基于Eclipse IDE的开发,最后生成的apk包放在bin目录下。缺省情况下这个apk包使用的是默认的Debug key进入签名的。也可以手工改变,在eclipse配置项中,如下图所示:
1.4.5 Android 调试方法
作过程序开发的人都知道,所有的程序都不是写出来的,都是调试出来。一个程序不经过生死调试经历的程序通常都不是好程序。程序员通过调试过程更好的理解了自己的程序原理,同时也避免了在客户手中出现更多问题的可能性。但是调试也是非常复杂的。从面向对象的角度来说,你写出的一个对象想要和另外一个对象进行交互时,经常会有不同的场景出现。就像你相亲,去跟一个办公室秘书相亲,通常都认为办公室秘书怎么也是娇小玲珑的小女生吧,但实际上也有男的,也有大妈级人物。所有写一个程序,有一个好的调试工具对程序员来说,绝对是一个幸福的事情。写C时候对GDB就非常喜欢。到了Android时来了一个ADB,注意,它可不是GDB这样的调试工具。实际上因为你的应用是JAVA应用,因此基于JDWP-DEBUGGER的JAVA Debugger通过DDMS加上ADB,就这样三下两下就可以直接和远程模拟器的Dalvkit VM进行对话了。这就是Google的强大,强大到让你不用转换以前JAVA开发经常就可以
直接进行Android应用调试了。
JDWP,全称是Java Debug Wire Protocol,从名字就可以看出来,它是一个协议。它跟实现无关,通常的架构模式如下所示:
通常一个Debugger实现,都分成两部分,一部分基于IDE或者直接的应用如JDB的Debugger,另外一部是基于JWMTI接口(由VM提供的)实现的JDWP的Agent。Android Dalvkit是部分基于Apache Homeney 的VM实现,因此,Android借助ADB通讯协议实现了一个简单的调试环境,注意有些JDWP未完全实现。
Eclipse IDE会有一个DDMS 视图,点击它,实际上在SDK上运行DDMS命令也会打开DDMS图形工具,这两者在界面上有一些小小差异,但功能都一样的。如下图所示:
通过DDMS你可以查看到如下内容:
【1】显示调试的设备,包括真机和模拟器
【2】模拟控制,操作一些设备特性
【3】LOGCAT,记录系统日志,类似于LINUX中的SYSTEM LOG,根据不同的级别进行格式化输出
【4】Threads/Heap/AllocationTracker/File Explore,基于ADB的一些工具应用,可以让你方便的查看系统
DDMS可以让你同时调试多个应用,因此,DDMS对每个DalvkVM配置了一个调试端口,从8600开始向上分配。但Debug用来接收Dalvik VM发过的来数据使用的商品是8700.
Android为应用开发默认提供了两个用于调试的类,一个是android.util.log,另外一个android.os.Debug。前一个应用使用它用来记录不同级别的日志,所以在Android应用中使用system.printout缺省是不能在logcat中显示的。需要设置属性:
$ adb shell stop$ adb shell setprop log.redirect-stdio true
$ adb shell start 后面一个DEBUG主要用来对系统内存及进程方面跟踪,输出一个特定的文件,通过这个文件,使用traceview工具可以查看系统的性能。