cf 2014-06-11
DDMS工作机制
DDMS全称DalvikDebugMonitorService.DDMS为IDE和emultor及真正的android设备架起来了一座桥梁,AndroidDDMS将捕捉到终端的ID,并通过adb建立调试器,从而实现发送指令到测试终端的目的
1)每一个Android应用都运行在一个Dalvik虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程。
2)DDMS启动时会与ADB之间建立一个devicemonitoringservice用于监控设备。当设备断开或链接时,这个service就会通知DDMS
3)当一个设备链接上时,DDSM和ADB之间又会建立VMmonitoringservice用于监控设备上的虚拟机。
4)通过ADBDeamon与设备上的虚拟机的debugger建立链接,这样DDMS就开始与虚拟机对话了
通过DDMS看到目标机器上运行的进程/现成状态,可以android的屏幕到开发机上,可以看进程的heap信息,可以查看logcat信息,可以查看进程分配内存情况,可以像目标机发送短信以及打电话,可以向android发送地理位置信息。可以像gdb一样attach某一个进程调试。androidSDKtools提供了ddms的功能。
Eclipse安装好adt后会有一个DDMS得perspective.切换到DDMS的视图下:
DDMS视图组成
如上图所示,DDMS视图由3部分组成:左上窗口(device窗口),左下窗口(EmulatorControl),右边面板组成。
1、device窗口
device窗口显示了所有当前能找到的所有模拟器或设备列表和每个设备当前正在运行的虚拟机列表。虚拟机是按程序的包命来显示的。device标签栏右上角那一排按钮分别为:调试某个进程,更新某个进程,更新进程堆栈信息,停止某个进程,最后一个图片按钮时抓取android目前的屏幕。
2、EmulatorControl
在这里,可以模拟一些设备状态和行为。
TelephonyStatus:改变电话语音和数据方案的状态,模拟不同的网络速度。
TelePhonyActions:发送模拟的电话呼叫和短信到模拟器。
LocationControls:发送虚拟的定位数据到模拟器里,我们就可以执行定位之类的操作。可以收工的在Manual里输入经度纬度发送到模拟器,也可以通过GPX和KML文件。
3、右面板
右边那个窗口中有threads,heap,AllocationTracker,fileexplorer选项卡。分别显示线程统计信息,栈信息,分配跟踪器以及android的文件系统。
1)Threads
线程视图列出了此进程的所有线程。
ID:虚拟机分配的唯一的线程ID,在Dalvik里,它们是从3开始的奇数。
Tid:linux的线程ID,Forthemainthreadinaprocess,thiswillmatchtheprocessID.
Stauts:线程状态,
utime:执行用户代码的累计时间
stime:执行系统代码的累计时间
name:线程的名字
2)VMHeap
展示一些堆的状态,在垃圾回收其间更新。当选定一个虚拟机时,VMHeap视图不能显示数据,可以点击右边面包上的带有绿色的”Showheapupdates”按钮,然后在点击”CauseGC“实施垃圾回收更新堆的状态。
3)AllocationTracker
在这个视图里,我们可以跟踪每个选中的虚拟机的内存分配情况。点击”StartTracking”后点击”GetAllocations“就可以看到。
4)FileExplorer
通过Device>FileExplorer就打开FileExplorer。这里可以浏览文件,上传上载删除文件,当然这是有相应权限限制的。
常用工具
1、堆查看
点击UpdateHeap(更新堆)按钮,获得有关选定虚拟机中堆分配的信息。
图2
图3
点击"CauseGC"开始.堆的详细信息被显示出来,并附有针对特定分配类型的分配大小图示。如果您有分配泄漏,这可能是一个很好的检查点,通过观看HeapSize(堆大小)的总体趋势,确保在应用运行期间它不会一直变大。
2、AllocationTracker(分配跟踪器)
AllocationTracker(分配跟踪器)视图中显示了有关分配的更深层细节。点击“StartTracking(开始跟踪)”,在应用中执行某个操作,然后点击“GetAllocations(获得分配)”。
图4
所示列表按分配排序,首先显示最新的分配。选中它可看到一个关于分配如何创建的堆栈轨迹(stacktrace)。
仔细查看分配细节,下面的代码看起来有改进的空间:
dataStr+=String.format("Std.Dev.:%.3f,%.3f,%.3f\n",devX,devY,devZ);
上例可简单重构为下面的代码,节省构造临时char[]的开销。.
dataStrBuilder.append(String.format("Std.Dev.:%.3f,%.3f,%.3f\n",devX,devY,devZ));
3、MethodProfiling(方法分析)
MethodProfiling(方法分析)是DDMS的一款工具,对于快速概览应用中时间的消耗分布非常有用,也可用于时间关键型函数的详细查看。
图6
在应用运行并执行某个有趣的任务时,如果您想获得更多有关该任务的性能数据,点击“StartMethodProfiling(开始方法分析)”。分析器只收集少量数据(没见过超过2或3秒),所以,几分钟后再次单击该图标以停止收集。从DDMS中激活方法分析器可使工具自动使用内部存储来存储分析结果,当捕捉完成后,将它们发送回主机,作进一步分析。
IDE将自动启动Traceview窗口,帮助您在IDE(图6)中分析结果。
图6
解析结果是最有趣的部分。单击底部窗格中的方法调用可创建一个层级结构,为您显示目前的方法——先是调用该方法的母方法,然后是从选定方法中调用的子方法。