- Android应用开发教程
- 赵明渊
- 2437字
- 2025-02-21 19:39:28
2.4 Android应用的调试
调试是Android应用开发的重要工作,本节介绍Android调试工具:Java调试器Debug、图形化调试工具DDMS和获取日志信息调试工具LogCat。
2.4.1 Java调试器Debug
Eclipse提供了一个内置的Java调试器Debug,提供了标准的调试功能,包括设置断点、查看变量、单步调试、挂起和恢复线程等。
在Eclipse主界面中,选择菜单File→Window→Open Perspective→Debug,进入Debug透视图,如图2.19所示。此时,在Eclipse窗口右上角出现Debug按钮,单击该按钮左侧的Java按钮,即切换到Java透视图,Debug透视图与Java透视图可通过单击相应按钮相互切换。

图2.19 Debug透视图
右击Debug按钮,在弹出的菜单中选择Close命令,即关闭Debug透视图。
1.Debug透视图
Debug透视图用于在工作台中管理程序的调试和运行,可以显示每个调试目标中挂起的线程堆栈框架。
2.Debug面板
Debug透视图中的Debug面板用于管理与程序调试相关的功能,面板中的视图呈树状结构,每一个线程对应一个树节点,在图2.20中显示的是暂挂线程的调试堆栈结构。
3.设置断点
设置断点是常用的调试方法,在Java透视图的应用项目中,双击需要设置断点的Java源代码文件,该文件的代码在中部编辑器打开,将鼠标放在代码行左侧的标记栏上,双击即可设置断点。例如,在应用项目FirstAndroidApplication的Java源代码文件MainActivity.java中,设置了两个断点,已在Debug透视图中的Breakpoints面板中列出,如图2.21所示。

图2.20 Debug面板

图2.21 BreakPoints面板
注意:设置断点时不要将多条语句放在一行上,不能为同一行上的多条语句设置断点。
4.查看变量
断点时的变量值,可以使用Variables面板查看,如图2.22所示。
5.单步调试
在调试过程中,可以使用工具栏中的单步调试按钮:Step Into按钮、Step Over按钮、Step Return按钮进行单步调试,如图2.23所示。

图2.22 Variables面板

图2.23 工具栏中的单步调试按钮
(1)Step Into按钮(F5)。
在单步执行过程中,遇到子函数即进入,并继续单步执行。
(2)Step Over按钮(F6)。
在单步执行过程中,遇到子函数不进入,将整个子函数执行完再停止。
(3)Step Return按钮(F7)。
单步执行到子函数内时,单击Step Return按钮则执行完子函数其余部分,并返回上一层函数。
2.4.2 图形化调试工具DDMS
DDMS(Dalvik Debug Monitor Service)是一个功能强大的图形化调试工具,用于监控正在运行的线程以及堆信息、LogCat日志信息、广播状态信息、模拟电话呼叫、模拟短信收发、虚拟地理位置等。
在Eclipse主界面中,选择菜单File→Window→Open Perspective→DDMS,进入DDMS透视图,如图2.24所示。此时,在Eclipse窗口右上角出现DDMS按钮,单击该按钮左侧的Java按钮,即切换到Java透视图,DDMS透视图与Java透视图可通过单击相应按钮相互切换。

图2.24 DDMS透视图
右击DDMS按钮,在弹出的菜单中选择Close命令,即关闭DDMS透视图。
1.Devices面板
DDMS透视图左上部是Devices面板,这个设备面板列出当前所有运行的终端设备,包括模拟器和手机,并列出各个终端设备的所有进程信息。
2.DDMS输出面板
DDMS右上部有几个输出面板,用于获取调试中的各种输出信息。
(1)Threads面板:线程跟踪面板,用于查看指定进程内正在执行的线程状态。为显示输出信息,需要单击Devices面板上部Update Threads按钮,并在设备面板选中需要查看的进程。
(2)Heap面板:内存跟踪面板,用于查看指定进程内堆内存的分配和回收信息。为显示输出信息,需要单击Devices面板上部Update Heap按钮,并在设备面板选中需要查看的进程。
(3)Emulator Control面板:模拟器控制面板,用于模拟器模拟拨打电话、发送短信,还可虚拟模拟器的位置信息。
3.LogCat输出面板
LogCat输出面板位于DDMS透视图下部,用于输出日志信息,具体使用方法参见2.4.3节。
2.4.3 获取日志信息调试工具LogCat
LogCat是Android系统提供的一个调试工具,用于获取系统日志信息,例如Dalvik虚拟机产生的信息、进程信息、ActivityManager信息、PackagerManager信息、Homeloader信息、WindowsManager信息、Android运行时信息等。
在Eclipse主界面中,选择菜单File→Window→Show View→Other…,弹出一个Show View对话框,选择Android→LogCat,单击OK按钮,在Eclipse主界面下部出现LogCat视图,如图2.25所示。

图2.25 LogCat视图
1.LogCat视图
LogCat视图右上方有一个日志控制级别的下拉列表,前5个选项分别为verbose、debug、info、warn、error,表示5种控制级别的信息:详细信息(verbose)、调试信息(debug)、通知信息(info)、警告信息(warn)、错误信息(error),选项控制级别依次增高。单击某一选项,可以使LogCat视图仅输出指定选项的日志信息和高于指定选项控制级别的日志信息,低于指定选项控制级别的日志信息则不显示。
2.设置LogCat过滤器
LogCat视图提供了过滤功能,单击视图左侧的“+”按钮,弹出设置LogCat过滤器对话框,如图2.26所示,可以增加一个新的过滤器,根据日志信息标签(by Log Tag),产生日志进程编号(by PID),日志控制级别(by Log Level)等对显示信息的内容进行过滤。
例如,在图2.26中,在Filter Name框输入“FilterTest”,在by Log Tag框输入“ObservationPoint”,单击OK按钮,在LogCat视图左边Saved Filters框中添加一个新的过滤器FilterTest,可根据设置的标签ObservationPoint对LogCat日志输出进行过滤。

图2.26 设置LogCat过滤器对话框
3.过滤应用项目的日志信息
LogCat提供了以下几个过滤输出日志的方法:
(1)Log.v( ):用来输出详细信息,对应级别为verbose,控制级别最低。
(2)Log.d( ):用来输出调试信息,对应级别为debug,比verbose高一级。
(3)Log.i( ):用来输出通知信息,对应级别为info,比debug高一级。
(4)Log.w( ):用来输出警告信息,对应级别为warn,比info高一级。
(5)Log.e( ):用来输出错误信息,对应级别为error,比warn高一级。
上述每个方法中都传入两个参数,第一个参数是日志的标签(Tag),第二个参数是日志要显示的内容。
通过以上方法,可在程序中预先设置一些日志信息,当程序运行时,这些日志信息就会输出到LogCat窗口,从而查看应用项目的运行状态。
【例2.2】 通过应用项目LogCatDemo演示过滤日志信息。
应用项目LogCatDemo的MainActivity类代码如下:

① 第6行使用import语句引入“android.util.Log”包文件。
② 第9行定义一个用于日志标签的符号常量ObservationPoint。
③ 第16行至第20行使用Log.v()、Log.d()、Log.i()、Log.w()、Log.e()方法在程序中过滤输出日志。当程序运行到以上方法时,预先设置的日志信息便被发送到LogCat窗口中。
运行应用项目LogCatDemo,输出的日志信息如图2.27所示。

图2.27 运行LogCatDemo项目的LogCat日志信息
可以看出,输出的日志信息太多,迫切需要通过LogCat过滤器和控制级别过滤出感兴趣的信息,为此我们已在该项目中编写了MainActivity类的代码,并在设置LogCat过滤器的例中,设置了一个新的过滤器FilterTest,其标签(Tag)为ObservationPoint。
运行应用项目LogCatDemo,单击LogCat视图左边Saved Filters框中的过滤器FilterTest,过滤后的LogCat日志信息如图2.28所示。

图2.28 运行LogCatDemo项目过滤后的LogCat日志信息