Android测试工具DDMS

对于每个开发或测试Android设备的人来说,各种调试、测试工具极多,如颇有名气的ADB、DDMS、APT等等。

DDMS是什么?

DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务。

DDMS功能

(1)测试设备截屏;

(2)查看特定进程正在运行的线程以及堆信息;

(3)Logcat(日志查看);

(4)广播状态信息;

(5)模拟电话呼叫;

(6)模拟接收及发送SMS;

(7)虚拟地理坐标;

(8)端口重定向;

DDMS工作原理

DDMS扮演了一个IDE与移动设备上的应用程序之间的”中间人”角色,在Android上,每一个应用程序都有一个自己的VM并运行在自己的进程中。因此,每个进程都有一个不同的端口用来监听debugger。

1、DDMS启动时,会连接到ADB,并开启一个device监视服务,当有设备连接到ADB或与ADB断开时,DDMS都会得到通知;

2、一旦一个设备连接到ADB,DDMS就会为其创建一个VM监视服务,当移动设备上有VM的启动或终止时,DDMS就会得到通知;

3、一旦一个VM开始运行,DDMS就会通过ADB获取VM的PID,然后,为这个VM打开一个端口,监听来自这个VM的Debugger。为第一个VM打开的监听端口是8600,第二个是8601,依次往后排;

5、DDMS还会打开一个默认为8700的本地端口,并通过这个端口监听来自IDE的Debugger。当有IDE Debugger连接上来时,DDMS查找当前选中的VM,再通过ADB转接上去。流程为:

IDE Debugger–>DDMS8700端口–>ADB–>ADBD–>VM

这样,Debugger就可以向VM发送信息了;

而VM的Debugger抓取到的堆栈、线程等VM的运行时信息通过连接到DDMS为这个VM打开的监听端口上,就可以发送到DDMS上了。

DDMS如何获得版本安装

下载官网:

Android-ADT:https://dl.google.com/android/ADT-23.0.6.zip

Android-SDK: http://developer.android.com/sdk/index.html(可以不安装)

DDMS如何使用

DDMS启动

img

配置android sdk环境变量,dos执行ddms或Android sdk 目录下tools文件夹内ddms.bat、ddms.sh

(1)正常启动后,界面如下:

img

左侧的面板上提供了相应功能的按钮,从左往右依次是:Debug the selected process、Update Heap、Dump HPROF File、Cause GC(Garbage Collection)、Update Threads、Start Method Profiling、Stop Process和Screen Capture,如下图:

右侧显示相应的监测信息并进行文件管理,如下图:

img

DDMS测试APP

DDMS使用

注:以下所有操作必须手机连接PC,连接时确认手机处于”USB调试”模式;

线程监测

DDMS中的线程监控和评测浏览对于管理大量线程的应用很有用。

要启用,点击 Update Threads(更新线程)图标即可开始,如下图:

img

右侧对应的Threads窗口会显示面向选中VM进程的所有线程的名称和其他细节

utime 和stime代表了线程在瞬间运行用户代码(utime)和系统代码(STIME)所花的总时间。一瞬间的时间是由系统定义的,但通常为10毫秒。星号表示守护线程;native状态表示线程正执行原生代码。查看上述样本数据时,除了查看应用主线程花费时间,也要关注GC花费时间,便于测试中发现GC问题或观察处理对象创建,提出有助于优化性能建议。

内存检测

可以使用DDMS中的Heap和Allocation tracker一起定位内存问题,如下:

点击Update Heap(更新堆)按钮,获得有关选定虚拟机中堆分配的信息,如下图:

img

img

右侧对应的Heap,点击”Cause GC”,Heap视图中便会显示当前应用的内存使用量的详细情况;

测试中如何判断程序是否有内存泄漏的可能性呢?需要关注一个值:Heap视图中部有一个Type叫做data object,即数据对象,也就是我们的程序中大量存在的类型的对象。在data object一行中有一列是”Total Size”,其值就是当前进程中所有Java数据对象的内存总量,一般情况下,这个值的大小决定了是否会有内存泄漏,可以这样判断:

(1)不断的操作当前应用,同时注意观察data object的Total Size值;

(2)正常情况下Total Size值都会稳定在一个有限的范围内,虽然不断的操作会不断的生成较多对象,但是虚拟机在不断的进行GC的过程中,对象都被回收了,内存占用量会会落到一个稳定的水平,也就是说程序代码良好,无内存泄露情况出现;

(3)反之如果代码中存在没有释放对象引用的情况,则data object的Total Size值在每次GC后不会有明显的回落,随着操作次数的增多Total Size的值会不断增大,累加到一个极限后导致进程被kill掉。

所以我们测试中可以预判下那些场景容易出现内存泄露,可以重复这个场景的操作,观察heap size值和data object”Total Size” 的变化,若发现内存泄露情况,可使用DMS另一个自带的内存分配跟踪工具Allocation tracker进行跟踪。

操作步骤:

(1)点击 “Start Tracking”;

(2)点击”Get allocations”,更新内存分配显示;

(3)filter输入应用名称进行筛选;

(4)继续不断重复场景操作,再点击”Get allocations”;

(5)若发现某个类占用的内存最大,且有上升的趋势,可点击该类,下方展示该类中运行的各方法,可定位到该类中的具体方法,双击method名,定位到对应的代码;

响应时间检测

Method Profiling(方法分析)对于快速概览应用中时间的消耗分布非常有用,也可用于时间关键型函数的详细查看。

响应时间测试的场景主要是在:遍历查询、递归查询等(循环判断)。

点击Start Method Profiling 图标开始方法分析,操作场景测试,点击Stop Method Profiling 停止分析如下图:

分析结果如下图:

img

incl cpu time%,将各方法时间消耗进行排序;

Incl cpu time%: inclusive时间占总时间的百分比

Excl cpu time%: 执行占总时间的白分比

Calls+Recur Calls/Total: 调用和重复调用的次数

Time/Call: 总的时间(ms)排序

单击底部窗格中的方法调用可创建一个层级结构,显示该方法–先是调用该方法的母方法,然后是从选定方法中调用的子方法,若发现某个方法占用CPU时间过长,可定位到对应代码,查看代码逻辑,针对性发现问题。

UI检查

DDMS下Dump view UI hierarchy for Automator针对程序开发中UI调试好处多多,对于测试而言该工具在UI视觉测试时也是一个利器,该工具能够定位到每个View在屏幕中的绝对位置(精确到具体的PX(像素)级别),在视觉检查测试时可以帮我们很轻松的发现UI视觉问题。

启动时,点击Dump view UI hierarchy for Automator图标,如下图:

img

启动后进入正式界面,可以逐个元素的进行UI视觉稿检测,有问题立即便可知晓,如下图:

img

流量统计

测试中流量大小是1个重要测试点,而DDMS提供了流量统计工具network statistics,该工具可以实时统计查看程序使用网络的情况,也可以通过设置不同的Tag(标签)来区分不同类型的流量使用情况,数据在DDMS中通过图表显示,点击右侧视图中的network statistic,并Start即开始统计,如下图:

img

CPU/Memory/FPS抓取

测试中CPU、内存、帧率测试必不可少,同样DDMS针对此提供了System Information工具,可以用来对CPU、内存和帧进行抓取,可以抓取到整个系统的某个瞬间信息。使用时点击右侧视图中的System Information即可,具体使用方法比较简单,不再赘述。

log抓取

日志一般用于记录程序运行信息,从而使开发者方便开发调试,便于发现问题。我们先看看android.util.Log常用的方法,共有以下六种:Log.v() 、Log.d() 、Log.i() 、Log.w()、 Log.e()以及Log.a() (android 4.0新增加的)。根据首字母对应VERBOSE、DEBUG、INFO、WARN、ERROR、Assert,重要程度排序Assert > Error > Warn > Info > Verbose。

(1)Log.v 的调试颜色为黑色的,任何消息都会输出,平时使用就是Log.v(“”,””);

(2)Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.

(3)Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息

(4)Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。

(5)Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了;

(6)Log.a为4.0新增加的,Assert表示断言失败后的错误消息,这类错误原本是不可能出现的错误,现在却出现了,是极其严重的错误类型;

而我们平时测试Android App过程中会经常通过log定位问题,而DDMS中LogCat则是一个抓取APP运行log的利器,具体操作如下:

打开LogCat窗口,Window -> Show View -> LogCat.

手机连上本地PC,并打开usb调试模式,即可收集到app运行log了。

收集中可以增加log规律规则,点击窗口右上的加号,在Filter Name中输入需要过滤的的字符串。点击OK就行了。

多个设备的Log查看

在模拟器、真机数量多于两个的时候,DDMS仍然适用,DDMS试图,在左上角Devices中双击想要看log的设备即可,具体适用与单设备完全一致。

虚拟地理坐标

如果您的应用程序依赖于位置的手机,你可以有的DDMS送您的设备或AVD一个模拟的位置。这是非常有用的,如果你想测试你的应用程序的特定位置的功能,而不必实际移动的不同方面。
您可以使用下面的地理位置数据类型:
手动设置(Manual)位置 - 通过手动指定十进制或六十进制的经度和纬度值。
GPX - GPS交换文件
KML -Keyhole标记语言文件

img

进程信息

获取进程信息需要点击左侧Update Threads按钮,然后在左侧显示相应的进程信息,包括进程的名称、ID、状态等重要信息
内存信息
需要点击Update Heap,在Heap界面下,上部显示堆的详细信息,点击Cause GC进行垃圾回收,当完成后,可以看到一组对象类型和为每种类型已分配的内存,点击列表中的一个对象类型,为该种特定内存大小的对象分配的数量。

img

img

模拟拨入电话,模拟接收短信

img

模拟器接收模拟发送短信的效果,中文乱码

img

网络状态获取

在Android 4.0, DDMS 具备监控详细的网络使用情况的功能,使得它可以跟踪您的应用程序的网络请求。使用这个工具,你可以监视应用程序的数据传输,并适当优化的底层代码。

系统信息获取

包括三部分CPU相关信息(CPU load)、内存使用信息(MemoryUsage)、框架渲染时间信息(Frame Render Time)

img

CPU load

img

Memory Usage
img

Frame Render Time
测试使用模拟器
img

网速设置

手机文件管理

手机文件管理,如果虚拟机分配了SD卡空间或真机挂载了SD卡可以管理SD中的文件。从设备复制文件,在文件浏览器中找到该文件,然后单击“Pull file”按钮。要复制一个文件到设备上的文件资源管理器“Push file
”按钮。

img