原文:
http://developer.android.com/tools/debugging/ddms.html#how-ddms-works
Android
提供了一个debug工具叫做:DDMS,它提供了端口转发服务,设备截屏,设备线程和堆信息,日志,进程,模拟接打电话,模拟收发短信,模拟位置数据等功能。本文主要是对DDMS特性的简单阐述,它不是对DDMS所有特性和功能的一个全面的挖掘。
运行DDMS
DDMS被集成到了Eclipse里面,同时在SDK的tools目录下面也有一份。DDMS同时支持模拟器和真实设备。如果它们同时在运行,DDMS默认指向模拟器。
· 在Eclipse里面:点击->
Window > Open Perspective > Other... > DDMS
· 在命令行里面:进入tools目录,输入:ddms(Linux/Mac平台上是./ddms)
DDMS和调试器是如何交互的
在android里面,每一个application运行在单独的进程中,每一个进程运行在自己的虚拟机里面(VM)。每一个虚拟机会暴漏一个唯一的端口号供调试器来连接。
当DDMS启动的时候,它会连接到adb。当一个设备连接上来以后,在adb和DDMS之间会创建一个虚拟机监控服务,当设备上的虚拟机启动或者终止的时候,监控服务会通知DDMS。一旦一个虚拟机运行起来,DDMS会通过adb检索出虚拟机的pid,然后通过设备上的adbd后台进程打开一个DDMS到虚拟机调试器的连接。DDMS现在就可以使用定制化的无线协议和虚拟机进行对话了
DDMS会给设备上的每一个虚拟机赋予一个调试端口。一般来说,DDMS会把8600给第一个调试器,下一个是8601,以此类推。当调试器连接到这些端口的时候,相关联的虚拟机上的所有的数据都会被转发到调试器上。你可以只把一个调试器给一个端口使用,但是DDMS可以处理多个调试器。
默认情况下,DDMS还会监听另一个调试端口,叫做基端口(默认的端口号是8700)。基端口是一个端口转发器,它可以从任何一个调试端口接收虚拟机的数据,然后转到发到8700端口,然后调试设备上的所有的虚拟机。被转发的数据是由在DDMS的Device视图里面当前被选中的进程来决定的。
下图展示了eclipse里面DDMS长的模样。如果你是从命令行启动的DDMS,模样稍微有点不一样,但是大部分的功能是一样的。注意,高亮的进程com.android.email,它是运行在模拟器里面的,同时被赋予了8700和8606的调试端口。这表明当前DDMS会把8606的数据转发到8700上。
Figure 1.
Screenshot of DDMS
如果你不是使用Eclipse和ADT,请阅读
Configuring your IDE to attach to thedebugging port
,来绑定你的调试器。
Tip:你可以通过
File
>
Preferences
设置很多个DDMS的preference。Preference被保存到$HOME/.android/ddms.cfg.
Dalvik的调试的问题
在Dalvik虚拟机中调试和在其他的虚拟机调试基本是一样的,但是,当单步跳出同步代码块的时候,鼠标的当前行会跳到方法的最后一行。
使用DDMS
下面的章节介绍如何使用DDMS,还有DDMD界面上各个分页和面板。Eclipse的版本和命令行的版本在UI上会有细微的差别,但是功能是一样的。如何运行DDMS请参考本文前面的章节。
查看进程占用的heap内存
DDMS允许查看进程占用了多少堆内存,这对跟踪application执行过程中的某个时间点上堆的使用情况非常有用。
查看一个进程的堆的使用情况:
1. 在Devices页面,选中你要查看堆信息的进程。
2. 单击
Update Heap
按钮,允许查看进程的堆信息。
3. 在Heap页面,单击
Cause GC
触发垃圾回收,这会手机堆数据信息。当操作完成以后,你会看到很多数据类型和他们所占用的内存。你可以再次单击
CauseGC
来刷新数据。
4. 在一个数据类型上单击,会出现一个柱状图,它展示了对象的数量和以字节计数分配的内存。
跟踪对象的内存分配
DDMS提供了一种跟踪对象内存分配的特性,可以看到是哪些类和线程正在分配对象。这就允许你实时的跟踪是哪些对象正在被分配,当你的应用作某些操作的时候。这对评估那些可能会影响应用性能的内存的使用非常有用。
跟踪对象的内存分配:
1. 在Devices页面,选中你要查看堆信息的进程。
2. 在AllocationTracker页面,点击
Start Tracking
按钮,开始跟踪。这时,应用里面的任何的动作都会被跟踪下来。
3. 点击
Get Allocations
查看自从你点击了
Start Tracking
以后应用分配的对象的列表。你可以再次点击
Get Allocations
来追加分配的新对象。
4. 点击
Stop Tracking
按钮按钮可以停止跟踪或者是清除数据然后重新开始。
5. 点击列表里面的某一行数据,可以查看更细节的信息,比如:分配对象的代码的方法和行号等。
使用模拟器或者是设备的文件系统
DDMS提供了一个文件浏览器页面,允许你查看、复制、删除设备上的文件。检查你应用创建的文件或者你想在设备上转移文件的时候,这个特性会非常有用。
使用模拟器或者是设备的文件系统
1. 在Devices页面,选中你要查看堆信息的进程。
2. 从设备中拷贝文件,在文件浏览器中定位到文件,点击
Pull file
按钮。
3. 把文件拷贝到设备,在文件浏览器页面点击
Pushfile
按钮。
检查线程信息
DDMS里面的Threads页面展示了某个选中的进程下当前运行的线程。
1. 在Devices页面,选中你要查看堆信息的进程。
2. 点击
Update Threads
按钮.
3. 在Threads页面,就可以看到选中的进程的线程信息。
开始方法分析
方法分析是一种跟踪方法的某些信息的方式,比如说:调用次数,执行时间。关于在哪里收集分析数据,如果你想要获取更细粒度的控制,可以使用
startMethodTracing()
和
stopMethodTracing()
。关于如何产生跟踪日志,请参考:
Profiling and Debugging UIs
.
在DDMS里面开始方法分析之前,要知道有如下的一些限制:
· Android2.1和更早期的版本的设备必须得有SD卡,你的应用必须得有写SD卡的权限。
· Android2.2和高版本的设备不需要SD卡,跟踪日志直接发送到你的开发机上。
开始方法分析:
1. 在Devices页面,选中你要查看堆信息的进程。
2. 点击
Start MethodProfiling
按钮
3. 跟应用进行交互,启动你想要分析的方法。
点击
Stop MethodProfiling
按钮。DDMS停止分析你的应用,然后会打开 含有在你点击
Start Method Profiling
和
Stop MethodProfiling
之间收集到的方法分析信息的
Traceview
视图。
使用网络流量工具
在Android 4.0里面,DDMS包含了一个详细的网络使用情况的页面,这使得监控应用发出的网络请求变为可能。使用这个工具,你可以监控你的应用是在什么时候如何传递数据,可以更好的优化底层的代码。你也可以在使用之前,给网络的socket应用一个“tag”来区分不同的流量的类型,
These tags are shownin a stack area chart in DDMS, as shown in figure 2:
Figure 2.
Network Usage tab.
By monitoringthe frequency of your data transfers, and the amount of data transferred duringeach connection, you can identify areas of your application that can be mademore battery-efficient. Generally, you should look for short spikes that can bedelayed, or that should cause a later transfer to be pre-empted.
To betteridentify the cause of transfer spikes, the
TrafficStats
API allows you to tag the datatransfers occurring within a thread using
setThreadStatsTag()
, followed by manually tagging (anduntagging) individual sockets using
tagSocket()
and
untagSocket()
. For example:
TrafficStats.setThreadStatsTag(0xF00D);
TrafficStats.tagSocket(outputSocket);
// Transfer datausing socket
TrafficStats.untagSocket(outputSocket);
Alternatively,the Apache
HttpClient
and
URLConnection
APIs included in the platformautomatically tag sockets internally based on the active tag (as identifiedby
getThreadStatsTag()
). These APIs correctly tag/untag socketswhen recycled through keep-alive pools. In the following example,
setThreadStatsTag()
sets the active tag to be 0xF00D. There can only be one active tag perthread. That is the value that will be returned by
getThreadStatsTag()
and thus used by
HttpClient
to tagsockets. The finally statementinvokes
clearThreadStatsTag()
to clear the tag.
TrafficStats.setThreadStatsTag(0xF00D);
try {
// Make network request using HttpClient.execute()
} finally{
TrafficStats.clearThreadStatsTag();
}
Socket taggingis supported in Android 4.0, but real-time stats will only be displayed ondevices running Android 4.0.3 or higher.
使用LogCat
LogCat被集成到了DDMS里面,他会打印出你使用Log类打印的消息和其他的系统的消息,比如:当发生异常的时候的堆栈元素。更多关于如何把日志输出到LogCat,请参考
Reading and Writing Log Messages.
当你设置好了你的日志,你可以使用DDMS的LogCat特性来过滤特定的消息,使用以下按钮:
· Verbose
· Debug
· Info
· Warn
· Error
你也可以设置你自己的过滤器定制过滤更多地细节,比如用log的tag来过滤日志,或者是产生日志的pid来过滤日志。add filter,edit filter,和delete filter按钮允许你管理这些定制的过滤器。
模拟手机操作和位置
Emulator control页面允许你模拟手机的语音和网络状态。当你想测试应用在不同网络环境下的健壮性的时候会非常的有用。
改变网络的状态、速度、延迟
Emulatorcontrols页面的Telephony Status区域允许你改变手机网络的状态、速度、延迟。可以应用以下选项,一旦设置,立马生效:
· Voice - unregistered, home, roaming, searching, denied
· Data - unregistered, home, roaming, searching, denied
· Speed - Full, GSM, HSCSD, GPRS, EDGE, UMTS, HSDPA
· Latency - GPRS, EDGE, UMTS
模拟打电话或者是发短信
Emulatorcontrols页面的Telephony Actions区域可以模拟打电话和发短信。当你想测试应用收到来电或者短信的时候的健壮性的时候,会非常的有用。你可以做以下的动作:
· 语音-在
Incoming number
域输入一个号码,点后点击
Call
给模拟器或者是手机打电话。点击
Hang up
按钮挂断。
· SMS-在
Incomingnumber
域输入一个号码,在
Message
域输入短信,点击
Send
按钮,发送短信。
设置手机的位置信息
如果你的应用取决于手机所在的位置,你可以让DDMS给你的设备或者是模拟器发送一个假的位置。当你想测试应用的基于位置的特性的时候,可以不用物理的移动位置,这将会非常的有用。支持以下地理数据类型:
· Manual - set the location by manually specifying decimalor sexagesimal longitude and latitude values.
· GPX - GPS eXchange file
· KML - Keyhole Markup Language file
· 纯手工-手动设置浮点数的经纬度
· GPX-GPS eXchange文件
· KML-KML文件
For more information about providingmock location data, see
Location Strategies
.
关于提供mock位置数据的更多信息,可以参考:
Location Strategies
.
DDMS生成的内存dump文件不能直接用MAT工具打开,会提示文件格式不支持。需要转化:
(1)运行cmd,cd到D:\tools\android-sdk\tools目录下
(2)输入命令hprof-conv xxxx.hprof yyyy.hprof
xxxx.hprof 为原文件,yyyy.hprof 为转化过后的文件(同样生成在D:\tools\android-sdk\tools目录下)
(3)ok, .hprof文件转化完成
参考:
http://blog.csdn.net/jingwen3699/article/details/7977275