Android提供了调试工具被称为Dalvik Debug Monitor Server (DDMS),工作原理如下:

DDMS将搭建起IDE与测试终端(Emulator 或者connected device)的链接,它们应用各自独立的端口监听调试器的信息,DDMS可以实时监测到测试终端的连接情况。当有新的测试终端连接后,DDMS将捕捉到 终端的ID,并通过adb建立调试器,从而实现发送指令到测试终端的目的。
 
DDMS监听第一个终端App进程的端口为8600,APP进程将分配8601,如果有更多终端或者更多APP进程将按照这个顺序依次类推。DDMS通过8700端口(”base port”)接收所有终端的指令。
下边通过GUI详细了解DDMS的一些功能
Devices
在GUI的左上角可以看到标签为”Devices”的面板,这里可以查看到所有与DDMS连 接的终端的详细信息,以及每个终端正在运行的APP进程,每个进程最右边相对应的是与调试器链接的端口。因为Android是基于Linux内核开发的操 作平台,同时也保留了Linux中特有的进程ID,它介于进程名和端口号之间。
 
在面板的右上角有一排很重要的按键他们分别是Debug the selected process、Update Threads、Update Heap、Stop Process和ScreenShot。

Emulator Control
通过这个面板的一些功能可以非常容易的使测试终端模拟真实手机所具备的一些交互功能,比如:接听电话,根据选项模拟各种不同网络情况,模拟接受SMS消息和发送虚拟地址坐标用于测试GPS功能等。

Telephony Status: 通过选项模拟语音质量以及信号连接模式。
www.moandroid.com
Telephony Actions: 模拟电话接听和发送SMS到测试终端。Location Control: 模拟地理坐标或者模拟动态的路线坐标变化并显示预设的地理标识,可以通过以下3种方式:
•Manual:手动为终端发送二维经纬坐标。

•GPX:通过GPX文件导入序列动态变化地理坐标,从而模拟行进中GPS变化的数值。

•KML:通过KML文件导入独特的地理标识,并以动态形式根据变化的地理坐标显示在测试终端。

Threads、Heap、File Exporler
mo-Android感受Android带给我们的新体验

这几项,我们在其他开发工具中也经常使用,就在不此详细说明了。通过File Exporler可以查看Android模拟器中的文件,可以很方便的导入/出文件。
Locate、Console

Locate:显示输出的调试信息,详见Android下如何调试程序?; Console:是Android模拟器输出的信息,加载程序等信息;
使用DDMS模拟发送短信,操作过程如下:
在Emulator Control\Telephony Actions 中输入以下内容

单击发送后,在Android模拟器中打开Messaging,看到下面的短信:

单击新短信,详细查看短信内容:

中文显示为乱码,在未来的开发中,我们必须要注意中文字符的问题。

Android下如何调试程序?
常用调试程序的方法总结如下:

1. 使用Eclipse开发平台调试;

这是使用Eclipse工具开发Android必须熟练掌握的调试技术,主要包括:设置断点、查看变量值、查看当前堆栈等。打开Eclipse工具,单击“Run”

2. 结合Android SDK调试;

在复杂的程序运行过程中,如何调试程序了?把程序运行过程的信息保存为文件或者输出到IDE中,这样就可以知道程序是否是正常运行了。
在Android中可以使用Log类,Log类在android.util包中,可以使用它将运行过程的信息输出到IDE中,直接查看程序运行的过程。Log 类提供了若干静态方法 : Log.v(String tag, String msg); Log.d(String tag, String msg); Log.i(String tag, String msg); Log.w(String tag, String msg); Log.e(String tag, String msg);
分别对应 Verbose,Debug,Info,Warning,Error。 tag是一个标识,可以是任意字符串,通常可以使用类名+方法名,主要是用来在查看日志时提供一个筛选条件。程序运行后,在show view中选择Locat就可以直接看到输出了。也可以在程序运行后,可以通过DDMS 查看程序的运行过程记录,并可以通过String tag来过滤输出的信息。
除了以上方法外,我们也可以把程序运行过程信息的输出当作程序运行的一部分,比如使用Toast Notificatio将输出信息显示在界面中,当然这些只是些调试代码,在发布程序时需要去掉。
 

3. 使用JUnit调试;

JUnit可用来做完整的单元测试,对当前的部分代码,测试其在每种“环境”下的运行结 果。 现简要说下JUnit的几个主要功能:

1) JUnit首先有管理测试用例的功能。修改了哪些代码,这些代码的修改会对哪些部分有影响,通过JUnit将这次的修改做个完整测试。这也就JUnit中所谓的TestSuite。

2.)如何定义需要测试的代码?这也就是JUnit中所谓的TestCase,根据源代码的测试需要定义每个TestCase,并将TestCase添加到相应的TestSuite方便管理。

3)如何定义测试的“环境”?在TestCase测试前会先调用“环境”配置,在测试中使用,当然也可以在直接测试用例中定义测试“环境”。

4) 最为重要的部分,测试结果的检测。对于每种正常、异常情况下的测试,运行结果是什么、结果是否是我们预期的等都需要有个明确的定义,JUnit在这方面提供了强大的功能。

以上部分与我们平常使用IDE调试的过程是完全一样的,只不过是增加了测试用例管理、测试结果检测等功能,提高了单元的效率,保证了单元测试的完整性,明确了单元测试的目标。带着以上4个问题,简要举例并分析如下: 源代码如下:

public class SampleCalculator { public int add(int augend , int addend) {return augend + addend ;} public int subtration(int minuend , int subtrahend) {return minuend – subtrahend ;} }

测试代码(TestCase)如下:

import junit.framework.TestCase; public class TestSample extends TestCase { public void testAdd()
{ SampleCalculator calculator = new SampleCalculator(); int result = calculator.add(50 , 20); assertEquals(70 , result); } public void testSubtration() { SampleCalculator calculator = new SampleCalculator(); int result = calculator.subtration(50 , 20); assertEquals(30 , result); } }

以上TestSample测试用例中就对SampleCalculator进行了完整的单元测试,并对测试结果做了预期说明。当然还需要将TestSample增加到TestCase中方便管理。

import junit.framework.Test; import junit.framework.TestSuite; public class TestAll{ public static Test suite(){ TestSuite suite = new TestSuite(”TestSuite Test”); suite.addTestSuite( TestSample.class); return suite; } }
以上就将TestSample增加到”TestSuite Test”中,将来在选择测试用例的过程中只要选择了TestSuite Test,TestSample就将加入当前测试中。如果将来SampleCalculator增加了其他功能,只需要在TestSample增加相应的 测试,就可以对TestSample进行完整单元测试。
看到这里对上面4个问题,应该都有了大致的了解。最后需要说明的:对TestCase的管理,是完全界面化的,只需要按照JUnit的要求实现会自动产生UI界面,这个不必担心,还需要下载JUint packeage,根据需求选择自己需要的。
以上是在工作中总结的代码调试的方法,并结合Android应用程序开发,为将来深入开发Android应用程序打好坚实的基础。
 

Android DDMS如何使用?

DDMS 为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。
如何启动 DDMS
DDMS 工具存放在SDK – tools/路径下,启动DDMS方法如下:

1. 直接双击ddms.bat运行;

2. 在Eclipes调试程序的过程中启动DDMS,在Eclipes中的界面如下:
 

选择“Other”,界面如下:
 
双击DDMS就可以启动了。
DDMS对Emulator和外接测试机有同等效用。如果系统检测到它们(VM)同时运行,那么DDMS将会默认指向 Emulator。以上2种启动后的操作有些不一样,建议分别尝试下。