Android SDK 提供大部分的工具来调试你的应用程序。Eclipise中自带JDWP-compliant (JDWP百科: http://baike.baidu.com/view/4056494.htm )调试器允许你单步调试。一个典型的android调试环境是由以下几个部分组成的:
1.adb
adb是作为一个设备和开发系统的中间角色。它提供多种设备管理功能,包括移动和同步文件到模拟器,在设备或模拟器上执行一个UNIX shell
,为连接模拟器和设备提供通讯。
2.Dalvik Debug Monitor Server
DDMS是一个图形化的程序通过adb来和你的设备通讯。DDMS能截图,收集线程和推栈信息,模拟来电和短信等其他一些功能。
3.真机或虚拟设备
你的应用程序必须运行在一个设备或AVD中,这样才能调试它。
4.JDWP debugger
Dalvik虚拟机 支持 运行JDWP协议 ,以 允许 调试器 附加 到虚拟机。每一个应用程序在虚拟机中执行并暴露一个唯一的端口,这个端口可以通过DDMS附加一个调试器。 如果 你 要调试 多个应用程序, 连接 到 每个端口 可能会冗长 ,所以DDMS 提供了 端口转发 的 功能 可以转发 一个特定的 虚拟机的 调试 端口 到8700。 目前大部分IDE都包含JDWP 调试器,当然Eclipse中也有。
13.4.1 调试环境
下图 展示 了 各种 调试工具 如何 在一个典型的 调试环境 一起 工作 。
13.4.2 工具
接下来我们要认识一些工具,并具体介绍一些工具。Android SDK中包含多种工具帮助我们开发android移动平台的应用程序。这些工具被分为两组:SDK工具和平台工具。 SDK 工具是独立于平台的,它不依赖于平台。而平台工具则是依赖于平台的,根据平台版本的不同功能上会有新特性。
SDK 工具
-
android
- 让你 管理 的 AVDS , 项目和 SDK的 安装的组件 。 Dalvik Debug Monitor Server (ddms)
- 让 你 调试 Android应用程序 。 dmtracedump
- 从 跟踪日志文件 中 生成 的 图形 调用堆栈 图 。这个工具属于调试的范畴 Draw 9-patch
-
创建android专属的
NinePatch
图形,这个工具非常好用,所见即所得。我们后面详细讲解此工具。
Android模拟器
- 你可以 用它来 设计 ,调试 和测试 您的应用程序 。 Hierarchy Viewer ()
- 让你 调试和 优化 Android应用程序 的 用户界面 。属于调试范畴 hprof-conv
- J2SE中提供了一个简单的命令行工具来对java程序的cpu和heap进行 profiling,这个工具叫做HPROF。而android SDK中的这个工具是用来转换HPROF 文件,生成一个标准的格式让我们浏览。 layoutopt
- 让 你 快速分析 应用程序的 布局 , 以 优化 效率 。属于调试范畴 mksdcard
- 帮助您创建 一个磁盘镜像 ,您可以使用 模拟器 , 模拟 外部存储 卡 (如 SD卡) 。 Monkey
- 运行你的模拟器 或设备 ,并产生 伪随机 流 的 用户事件 , 比如 点击 ,触摸 或手势 , 以及 一些 系统级事件 。你可以使用Monkey工具来做压力测试。 monkeyrunner
- 提供 一个API 编写程序 ,用来控制 Android代码 以外 的 Android设备 或 模拟器。 ProGuard
- 缩小, 优化, 混淆你的代码。 sqlite3
- 允许你通过Android应用程序访问 SQLite 数据文件。 traceview
- 提供一个图形化的查看器,用来查看你执行Logs时保存的内容。 zipalign
- 优化. apk文件。当apk被签名后都会调用此工具用来校准.apk文件 。
平台工具
该平台 工具 通常是 每次 你 安装 一个 新的SDK 平台后更新。 每个 平台工具 的更新都会 兼容 旧平台。通常情况下,我们只使用一个工具那就是Android Debug Bridge ( adb
)。这是一款多用途的工具。我们在之前的文章中已经多次提到过它了。
其他平台工具,如aidl,aapt,dexdump和dx通常被称为Android Development Tools (ADT)。我们很少直接使用它们,而是通过Eclipse中的ADT插件自动调用它们。
13.4.3 使用DDMS
首先在Eclipse中选择 Window > Open Perspective > Other... > DDMS。 来打开DDMS界面
13.4.3.1 DDMS与调试器如何交互
在Android上, 每 一个 应用程序运行 在 它自己的进程 中 ,并 运行 在 它自己的虚拟 机(VM) 。 每个虚拟机暴露一个唯一的端口用来连接调试器 。
当DDMS启动时,它就会连接到 adb。当一个设备被连接时,一个虚拟机在设备上启动或停止时它会通知DDMS,在DDMS和adb之间创建一个虚拟机的监控服务。一旦虚拟机运行,DDMS
会通过adb检索虚拟机的进程ID(pid),并通过设备上的abd守护进程打开一个连接到虚拟机的调试器。现在DDMS能和虚拟机对话了。
DDMS会 给 每个 设备上 的VM分配 调试端口 。通常情况下,DDMS为第一次VM调试分配8600端口,下一次为8601,等等。当一个调试器连接其中的一个端口,所有的通信 将被转发到 相
关 的 VM 调试。一个调试器只能附加一个端口,但DDMS能处理多个调试器。可以理解为一个管理器,但这只是DDMS其中一个功能而已。默认情况下,DDMS也会监听另一个调试端口
8700。 下面的截图 显示了 在Eclipse中 的 典型 DDMS的 屏幕 。
图1. DDMS截图
13.4.3.2 DDMS使用方法
查看一个进程中的堆内存使用
DDMS的 允许你查看 一个进程使用 了多少堆 内存 。 这个 信息可以查询 跟踪 应用程序 在 一定时间 点 的执行 过程 中 堆内存的使用情况 。使用步骤如下:
- 在 Devices 选项卡,选择一个你想要查看的进程 。
- 点击 Update Heap 按钮打开堆信息
- 在右边的 Heap 选项卡, 点击 Cause GC 来调用垃圾回收,收集堆数据。 当 操作完成后, 你会看到 一 组 对象类型 和 为每个 类型 已 分配的内存。读者也可以再次点击 Cause GC 来刷新这个数据。
- 点击列表中的一个对象类型,你会看到一个条形图用来显示对象在指定的内存大小分配的数量,单位为字节。
跟踪 对象 的 内存分配
DDMS的 提供了一个 功能来跟踪 类和 线程 分配的 对象所占用的内存 。 允许你实时跟踪 在您的应用程序分配的对象 ,当您执行 某些动作时 。 这个 信息可以评估你的程序的性能 。使用步骤如下:
- 在 Devices 选项卡,选择一个你想要查看的进程 。
- 在 Allocation Tracker 选项卡,点击 Start Tracking 按钮来启动跟踪。此刻,你在此应用上做的任何事情将被跟踪 。
- 点击 Get Allocations 会看到一个对象列表,这个列表是当你点击 Start Tracking 后分配的对象。你也可以再次点击 Get Allocations 追加新对象到列表中
- 要停止跟踪或者清空数据,请点击 Stop Tracking 按钮 .
- 点击列表中一行,你会看到更多信息,例如这个分配对象的方法和行数。
查看使用模拟器和真机上的文件系统
这个功能是非常有用的,我们可以查看,添加,删除某些文件,例如添加一个文件到SD卡中,在模拟器上使用DDMS添加是非常方便的。
- 在 Devices 选项卡,选择一个模拟器或真机 ,然后选择一个文件夹。
- 从设备上复制文件出来,请在 File Explorer中点击 Pull file 。
- 吧文件复制到设备中去,点击 Push file 。
检查 线程信息
使用步骤如下:
1.在 Devices 选项卡, 选择一个你想要查看的进程。
2.点击 Update Threads 按钮。
3.在 Threads 选项卡, 您可以查看 选定 进程 的 线程信息。
启动 方法 分析
方法分析能在某一个角度给我们提供方法测量,例如调用次数,执行时间点, 执行方法所花费的时间。你如果想要更精确的控制,分析被收集的数据,使用Debug.startMethodTracing()
和Debug. stopMethodTracing()方法。
在你开始方法分析之前,请注意以下的限制情况:
- Android 1.5 设备部支持
- Android 2.1 和低于2.1的设备必须当前有SD卡并且你的应用必须有写入SD卡的权限 。
- Android 2.2 和高于2.2的设备不需要SD卡。 trace log 文件会直接以流形式到你的机器设备上。
以下是启动方法分析的步骤:
- 在 Devices 选项卡, 选择一个你想要查看的进程 。
- 点击 Start Method Profiling 按钮.
- 启动你想要分析的方法并互动。
- 点击 Stop Method Profiling 按钮。DDMS停止分析并打开Traceview。
模拟器控制
在设备选项卡的下面,有一个模拟器控制(Emulator Control)选项卡这个里面有很多关于模拟实际手机的功能,例如模拟一个来电,模拟发送一个短信,切换网络制式等。DDMS为我们更好的开发android应用提供了很方便的功能。
13.4.4 读取和写入Logs
Android 日志系统 提供了一个 收集 和查看 系统调试 输出 机制。 Logcat这个工具会转储系统消息的日志,其中包括推栈信息,抛出的错误信息,以及你自己定义的Log信息 ,这些都是实时输出的,就好像原始的System.out.print()。
Log
类
Log是一个日志类,你可以在代码中利用这个类来输入信息到LogCat中。
它有以下几种输出方法:
v(String, String)
(verbose详细全部的信息)d(String, String)
(debug调试信息)i(String, String)
(information信息,通知)w(String, String)
(warning警告)e(String, String)
(error错误)
例如:
Log.i("MyActivity", "MyClass.getView() — get item number " + position);
下面是LogCat的截图
下面还有一个Filer栏,可以让我们输入一些信息来过滤掉没用的,只保留我们我们想查看的信息
13.4.5 调试和分析用户界面
有时你应用程序的布局会使你的应用程序变慢。Android SDK提供Hierarchy Viewer和 layoutopt
这两个工具来帮助调试你的布局问题。
13.4.5.1 使用Hierarchy Viewer来调试与优化用户界面
运行Hierarchy Viewer并选择一个窗口,步骤如下:
- 连接你的设备或启动一个模拟器。
为了安全Hierarchy Viewer只能连接到使用开发版本的Android系统上的设备。目前发现真机连不了,如果有知道方法的同学请告知,root和debug模式我已经试过了
- 安装执行你的应用程序,确保它的用户界面是可见的。
- 从我们本地电脑中的
<sdk>/tools/目录下,直接双击启动
hierarchyviewer
。这里我发现android1.6的模拟器,启动了并没刷新hierarchyviewer界面,使用2.2就刷新了,如果出现类似问题的朋友请切换其他系统版本试下。请记住在Debug模式下是不能启动此工具的。
- 选中列表中的Activity。 现在可以 看看 它 的 视图层次了 。
下面是一张关于启动Hierarchy Viewer后正确显示的截图
关于View Hierarchy 窗口
当我们点击Load View Hierarchy后会进入另外一个界面,这个界面有4个面板:
Tree View : 左边的这个面板显示一个Tree View,这是Activity 对象的层次结构图,使用Tree View能检查单个的View对象,并能看到这个对象与周围View的关系。
底部滑块可以放大的这个面板,或者使用鼠标滚轮放大。并且还能拖动当前View对象生成一张.psd的层次图。
下面还有一个过滤输入栏,可以输入类名或者ID来过滤你想要查看的View。
你还可以在左上角点击 Save As PNG 来保存成一张结构图,在团队合作过程中这是非常有用的
Save As PNG旁边还有一个 Capture Layers 我们点击它,其实就和刚才上面拖动当前View一样会弹出一个框,保存为.psd文件格式。这种层次图可以让你编辑,隐藏某些层来安排其他人员工作。
Tree Overview: 右上方的一个窗口,用来预览整个树视图 ,当你在 Tree View 点击一个View对象时 , 这里会给那个View矩形上色。
Properties View: 右边 中间的 右侧面板中显示 “Properties” View , 它会显示 选定的 视图对象 的 属性 列表,你可以在这里检查这个View的属性
Layout View: 右边下方的面板,用来以实际布局的方式来浏览UI。
当前Activity的UI改变了,这里是不会自动更新的,你需要再次点击 Load View Hierarchy 按钮来刷新。下面是View Hierarchy 窗口的截图:
图3. View Hierarchy 窗口
这个工具网络上也有比较多的文章来介绍使用方法,我们这里只需要了解一下就行了,因为在使用此工具的时候还有许多问题,比如不显示指示图标,n/a的情况。
13.4.5.2 使用layoutopt优化布局
layoutopt
工具让我们分析定义布局的XML文件,并在View Hierarchy找到效率低的地方。l
用法如下:
它会给你一些英语提示,教你该怎么做,但是请注意,它并不是全能的,在有些地方它依然会出现错误,请不要完全依赖它。
讨论群号213821767