Android 附带一个叫Dalvik 调试监控服务 (DDMS) 的调试工具,它提供端口转发服务、在设备上的屏幕捕获,设备上的线程和堆栈信息, logcat,进程, 和无线状态信息,接收呼叫和SMS 欺骗,位置数据欺骗 和更多功能。 这篇仅介绍DDMS一般特性,不是对它的特性和功能做详细的说明。
DDMS 位于SDK的 tools/
目录。从一个终端或控制口进入此目录并键入 ddms
(或 ./ddms
在 Mac/Linux上) 以运行它, DDMS 将运行在模拟器上或一个连接的设备上,如果模拟器和连接的设备都在运行,DDMS默认运行在模拟器上。
DDMS如何工作
DDMS作为一个中间人,连接IDE到运行在设备上的应用程序。在 Android上,每个应用程序运行在他自己的进程中,管理它们自己的虚拟机 (VM),并且每个进程在不同的端口监听调试器。
当它启动时, DDMS连到 adb 上并在他们之间建立一个设备监控服务,当设备连接或断开时将通知DDMS,一个虚拟监视服务在adb和DDMS之间建立,当一个在设备上的虚拟机开始或终止时,它将通知DDMS,一旦虚拟机运行, DDMS通过adb获得进程的ID, 并且建立一个到虚拟机调试器的连接,通过设备上adb daemon (adbd)程序. DDMS 能够使用自定义的有线协议和虚拟机通信。
在设备上的每个虚拟机, DDMS 打开一个端口监听调试器。对于第一个虚拟机, DDMS在 8600端口监听调试器,下一个在 8601端口, 并且等等。当一个调试器连接到这些端口中的其中一个后,所有的通信量被转到调试器和相应的虚拟机之间。DDMS能够像一个远程调试会话那样进行调试工作。
DDMS也打开另一个本地端口,DDMS的 "基本端口" (8700,默认情况下), 它也作为调试器的监听端口,当一个调试器连接到这个端口,所有当前在DDMS中选择的通信量被转发到虚拟机中,所以他作为调试器的默认连接端口。
关于DDMS端口转发的更多信息,请阅读 配置你的IDE以绑定到8700端口调试.
提示: 你可以在File > Preferences菜单里设置DDMS配置端口。配置被保存在 "$HOME/.ddmsrc"文件中。
了解关于Dalvik的调试知识
在Dalvik 虚拟机上调试应用程序和在其它的虚拟机上一样,但是,当单步步出同步代码时,“当前行”的光标跳到这个方法的的最后一行。
左边框架
调试监控器的左侧显示每个模拟器/设备的当前运行状况,用一个列表显示每个模拟器/设备上的虚拟机,虚拟机被运行在它上面的应用程序的包名唯一标识。
用这个列表来查找和捆绑你要调试的进程到虚拟机上,列表中靠近虚拟机名的是一个“调试通信”端口(在最右边的列),如果你连接调试器到列表中的一个端口,你将被连接到设备上相应的虚拟机上。但是,当使用DDMS时,仅仅需要连接到8700端口,这时DDMS转发这里所有的流量到当前所选的虚拟机上,(注意:当你在列表中选择一个虚拟机时,列出的端口包含8700)这样,你每次在切换虚拟机时,就不需要重新配置调试器的端口。
当一个运行在设备上的应用程序调用waitForDebugger()(或者你在开发者选项里选择这个选项)时,一个红色的图标将显示在客户端名字的边上,当它等待调试器捆绑到虚拟机时,并且一个调试器连接上时,这个图标将变成绿色。
如果你看到一个带删除线的小虫图标,它的意思是:DDMS不能在调试器和虚拟机之间建立一个连接,原因是它不能打开虚拟机的本地端口,如果你在这个设备上的所有虚拟机上都看到这个图标,很可能是因为还有另一个DDMS实例正在运行(这里包含Eclipse插件)。
如果你看到一个问号标记在一个应用程序包空间里,这意味着,DDMS从adb中接收到应用程序的pid,它不知何故的不能和虚拟机的进程握手,这时可以试试重启DDMS。
右边框架
在右侧,调试监控器通过制表符显示有用的信息和一些相当酷的工具。
信息
这个视图显示当前选择虚拟机相关的一般信息,包含进程ID、包名、和虚拟机版本。
线程
线程视图有一个运行在目标虚拟机上的线程列表,为了减少数据的发送量,当按下在工具栏的“线程”按钮时,仅仅线程更新信息被发送,这个按钮对应着每个虚拟机,这个列表包含以下信息:,
- ID - 一个虚拟机分配的唯一的线程ID。在Dalvik中,这些奇数号码从3开始。
- Tid - Linux线程ID。 作为一个进程的主线程,它等于进程的ID。
- Status - 虚拟机线程状态,守护线程显示时带有一个星号,它将是下面的状态之一:
- running - 执行应用程序代码
- sleeping - 调用 Thread.sleep()
- monitor - 等待获取一个监视锁
- wait - 在 Object.wait()
- native - 执行本地代码
- vmwait - 等待一个虚拟机资源
- zombie - 在死进程中的线程
- init - 线程正在初始化 (你将看不到这步)
- starting - 线程准别运行 (在这你将也看不到)
- utime - 执行用户代码的总时间, 在 "jiffies" (通常是 10ms),仅在Linux下可用。
- stime - 执行系统代码的总时间,在 "jiffies" (通常是 10ms)。
- Name - 线程的名字。
"ID" and "Name" 在线程启动时被设置,保留的区域被定时更新 (默认是4秒一次)。
VM 堆
显示一些堆状态,在垃圾回收时更新,如果当一个虚拟机被选中,虚拟机堆视图提示禁止堆更新。单击位于左上侧工具栏的“显示堆更新”按钮,返回到虚拟机堆视图,点击Cause GC进行垃圾回收和更新堆状态。
分配跟踪
在这个视图,你可以跟踪每个虚拟机的内存分配。在左边选择一个虚拟机,然后点击 开始跟踪,再点击 获取分配 以查看从开始跟踪后的内存分配信息,相应的数据将显示在下面的表格中,再次点击它以刷新列表。
竞争控制
通过这些控制,你可以模拟特殊的设备状态和活动,包含以下特性:
- 电话状态 - 改变语音电话的状态和数据计划(本地、漫游,搜索,等等),并能模拟不同种类的网络速度和延时(GPRS, EDGE, UTMS, 等等)
- 电话活动 - 模拟到模拟器的电话呼叫和SMS短消息
- 位置控制 -发送虚假的位置数据到模拟器 ,这样你能够形成一个像GPS映射那样的定位操作。
要使用位置控制,启动你在 Android模拟器中的应用程序并打开DDMS,点击模拟器控制标签并按下位置控制,从这以后,你可以:- 手动发送单独的经度/纬度坐标到设备。
单击手动,选择坐标格式,在字段里填上数据并点击发送。
- 使用一个GPX文件描述在设备上的路径的回放。
选择GPX文件并载入此文件,一旦载入,点击播放按钮回放定位操作程序的路径。当从GPX开始回放时,你可以在DDMS面板上调节回放的速度和通过暂停、跳过按钮控制回放,DDMS将解析轨迹点(
<wpt>
, 在第一个表中),和轨迹(<trk>
,在第二个表中,通过<trkseg>字段
的简单组合以支持多段),仅仅轨迹可以播放,在第一个列表中点击轨迹点仅发送它的坐标到设备,当选择一个轨迹后,就可以播放它。 - 使用一个KML文件描述设备上的顺序回放的位置点
单击并打开一个KML文件,一旦文件载入,单击播放按钮以发送坐标到你的定位程序中。当使用一个KML文件,它解析一个
<coordinates>
元素,它的值由一套经度、纬度、高度值组成。例如:<coordinates>-122.084143,37.421972,4</coordinates>
在你的文件中,你可以包含多个
<Placemark>
元素,每个包含一个<coordinates>
元素。当你这样做的时候,位置标记集合将被添加到轨迹上,DDMS将每秒发送一个位置标记到设备。生成一个合适的KML文件的方法是:在Google Earth上找到一个位置,右键单击这个位置点,在左边弹出的菜单上选择“位置另存为”菜单项,并选择存储格式为Kml。
注意:DDMS不支持通过
<MultiGeometry><LineString>lat1, long1, lat2, long2, ....</LineString></MultiGeometry>
方法创建路经。同样当前也不支持<TimeStamp>
节点在<Placemark>
中,未来的版本可能支持时间位置和路径拥有一个单独的位置元素。
获取更多的基于定位数据的欺骗方法,可查看 基于位置服务的 APIs 文档。
- 手动发送单独的经度/纬度坐标到设备。
文件浏览器
通过文件浏览器,你能够浏览设备文件系统和进行基本的管理,像拖和拉文件,这些操作围绕着adb的拖拉命令,提供一个GUI的体验。
打开DDMS,选择设备>文件浏览器... 菜单打开文件浏览器窗口,你可以把文件拖入设备目录,但是不能拖出设备。从设备拷贝文件时,选择文件并单击工具栏上的从设备取出文件按钮,删除文件时,使用工具栏的删除按钮。
如果你对模拟器上的SD卡映像感兴趣,你可以用mksdcard
命令建立一个映像,并在模拟器启动的时候加载它。例如,在/tools
目录,执行:
$ mksdcard 1024M ./img $ emulator -sdcard ./img
现在,当模拟器运行时,DDMS文件浏览器将能读和写sdcard目录。但是,你的文件不会自动显示。例如,如果你添加一个MP3文件到sdcard 目录,媒体播放器将看不到这个文件,直到你重启模拟器后才能看到。(当从命令行重启模拟器时,确保再一次加载sdcard 。)
获取更多关于建立SD卡映像的信息,请查看 其它工具 文档。
屏幕捕获
你能够通过选择设备>屏幕捕获菜单以捕获设备或模拟器上的屏幕图像,或者按下CTRL-S快捷键。
浏览进程
你能够通过在菜单条中选择设备>显示进程状态得到和在特定虚拟机上使用ps -x
命令相同的输出结果。
致使GC产生
按下工具栏的垃圾桶按钮可以进行垃圾回收。
在设备(logcat)运行 Dumpsys and Dumpstate
- 从Dalvik运行 dumpsys (logcat), 选择在菜单栏上的 设备 > 运行 logcat...。
- 从Dalvik运行 dumpstate , 选择在菜单栏上的 设备> 显示设备状态...。
测试无线状态
默认情况下,在一个标准的logcat(包含很多信息)上,无线状态没有输出。要查看无线信息,可以点击设备>显示无线状态...菜单,或者运行描述在 记录无线信息 的logcat。
停止一个虚拟机
你可以选择动作>挂起虚拟机菜单以停止一个虚拟机,按下这个菜单致使虚拟机调用 System.exit(1)
。
了解关于DDMS的缺陷
DDMS有如下已知的缺陷:
- 如果你连接和断开一个调试器,ddms放弃和重连到客户上后,这时虚拟机却以为调试器已经关闭。这将最终被修复。
关于翻译作者
andriodin论坛用户名:zxg1982
联系方式:[email protected]