一、真机调试的两个必备条件
(1)手机打开开发者模式并且运行USB调试
(2)PC上装好手机对应的驱动
二、DDMS(DalvikDebugMonitorServer)四个主要窗口
Devices:当前电脑接入的android设备,及设备运行的进程,可以结束进程,设置程序为debug模式,截屏等。
LogCat:会打印系统运行过程中所有的日志信息
File Explorer:文件夹列表
data/app:第三方应用都会安装目录
data/system:预装应用/系统应用安装目录
data/data:应用的私有目录,只能被当前应用访问,存储数据量小且安全性要求高的数据系统每安装一个新的应用程序,都会在此目录创建该应用包名的文件,用来存放该应用的私有数据,当应用卸载时,该包名的文件夹也会被删除
sdcard:外部存储目录,一般会链接指向到另一个目录,用于存储大数据量的数据,如视频,图片等
Emulator Contr:仿真器控制
三、博客里面找的比较好的相关文章
Android开发平台自带一个调试工具, 叫Dalvik Debug Monitor Server(简称DDMS). 这个工具提供了端口传输服务, 在当前连接的调试设备上截图, 设备的线程和堆(heap)信息, logcat信息, 进程状态信息 和 广播信息, 模拟目标机拨打电话和发送信息, 模拟位置数据等等.这篇文章将会适当的讨论DDMS的特点, 但不会详尽的介绍所有功能特点.
DDMS被整合到Eclipse中, 并且被安装到SDK目录的tools文件夹中. 只要创建了模拟器或者连接上真实的设备, 都能使用DDMS进行应用的调试. 如果同时运行着模拟器和真实设备, DDMS则默认会连接模拟器工作.
ddms
(or ./ddms
on Mac/Linux) from thetools/
directory.在Android上每个应用程序都在自己的进程里运行, 而这些进程都运行在各自的虚拟机(VM)上. 虚拟机(VM)只会暴露唯一的一个接口给调试器来工作.当DDMS开始运行时, 它会连接到adb. 当设备连接上, adb和DDMS之间就会创建一个VM监听服务, 该服务当模拟器或终端的VM开始工作时会通知DDMS.一旦VM运行, DDMS就会通过adb查找VM的进程ID(pid), 然后通过设备的adb后台进程(adbd) 创建和VM调试器的连接. 这时DDMS就可以使用通用的线路协议和VM对话.
DDMS会向设备的每个VM指定分配一个调试器端口. 比如, DDMS向第一个调试的VM指定分配8600端口, 下一个是8601,如此类推. 当调试器连接到这其中的一个接口, 所有通信将从关联的VM转向调试器. 调试器是唯一的, 它也只能连接到唯一的端口, 但DDMS可以控制调试器去对应哪个接口.
默认情况下, DDMS也会监听另一个调试用的端口作为DDMS"基础端口"(默认是8700). 这个基础端口是端口的传输者, 可以接收来自任意调试端口的VM通信信息, 并将这些通信信息传送给目标调试器. 这使得只将一个调试器依附在8700基础端口, 就能调试设备上所有VM. 被传送的通信信息将由当前DDMS界面上选择的进程决定交给谁.(就是说, 在DDMS上, 用户是可以选择调试哪个应用程序的, 而无论调试设备中的哪个应用程序, 比如选择了应用A, A的调试信息就会传送到当前界面来, 选择了B, 则得到的调试信息就是来自B的. 而调试A也好B也好, 使用的都是同一个调试器(debugger).)
下面的截图展示了DDMS在Eclipse上的界面. 如果你通过命令行启动DDMS, 界面会略有不同, 但大多数u功能还是一致的. 但要注意, 图中高亮的,com.android.email
, 是模拟器中正在运行的进程, 拥有8700和所分配的8606调试端口. 这表示DDMS当前正在转发端口8606的信息到8700的静态调试端口.
提示: 你在以下路径设置DDMs的参数: Window > Preferences. 参数保存在 $HOME/.android/ddms.cfg
.
了解Dalvik的一些调试问题
在Dalvik VM中调试应用程序, 也应该以同样的方式在其他VM中工作. 无论如何, 当单步执行脱离同步代码, "当前行"指针可能会跳到方法的最后一行去执行.
DDMS允许你查看进程使用了多少堆内存. 当应用执行时, 这对于跟踪堆在一个确切时间点里的使用情况是很有用的.
如何查看进程的堆使用情况:
DDMS提供一个跟踪对象内存分配以及查看这些类和线程分配的功能. 使你在应用上执行一些操作时能实时跟踪得到内存的分配使用情况. 这些所得到的信息是相当有用的, 因为它能帮助我们评估内存使用情况和应用的性能情况.(比如执行某些操作时, 引用的对象过多, 尤其读取了大量BITMAP图片, 这时内存就会飙升, 当占用率超过一定时, 就会引起OOM. 因此实时知道应用的操作和内存使用的情况, 是很有意义的.)
如何跟踪对象的内存分配:
DDMS提供文件系统的界面, 你可以在设备上浏览, 复制和删除文件.这个功能在检查应用程序是否创建了文件或者你想在设备内转移文件时很有用.
如何使用模拟器或设备的文件系统:
在DDMS中线程标签中可以查看选中的进程中当前运行的线程.
分析方法是一种跟踪特定度量方法的手段. 比如调用的数量, 执行时间, 和执行方法花费的时间. 如果你想获取更多细节数据, 可以使用startMethodTracing()和 stopMethodTracing() 方法. 获取更多关于生成跟踪日志的信息, 可看官方原文的 Profiling and Debugging UIs .
在你开始使用DDMS分析方法前, 请注意以下的事项:
如何开始分析方法:
在Android 4.0, DDMS可以跟踪应用程序发送的网络请求, 从而获知网络的详细使用情况. 而使用该工具, 你可以监听你的应用程序怎么样,什么时候传递数据,以便适当的优化相应代码.你也可以在使用前根据提供 "tag" 给网络套接字去区分不同的数据类型.
下面图2, 是展示在DDMS栈区域的标签截图:
通过监听数据传输的频率, 和在各个连接间传输数据的总量, 你可以确定并使应用程序在运行时更省电. 通常, 你应该寻找可以延迟发生请求的峰值方法,或者应该将后面的方法提前.(主要目的就是要提高网络请求的效率.)
为了更好的确认传递数据的高峰, TrafficStats 这个API中, 我们可以使用 setThreadStatsTag() 方法去线程中的数据传输事件添加标签, 通过tagSocket() 和 untagSocket() 方法手动标记(和不标记)单个socket套接字. 比如:
TrafficStats.setThreadStatsTag(0xF00D);
TrafficStats.tagSocket(outputSocket);
// Transfer data using socket
TrafficStats.untagSocket(outputSocket);
被包含在platform中的 HttpClient 和 URLConnection API方法会在内部基于源标记(这些标记可以使用 getThreadStatsTag() 方法确认 )自动标记套接字. 当回收连接池中连接, 这些API会正确地标记/不标记 套接字. 比如, setThreadStatsTag()方法设置活动标记(active tag)为 0xF00D.每个线程只能有一个活动标记(active tag). 这个值通过 getThreadStatsTag() 方法返回, 并被 HttpClient 用于标记套接字. 最后会调用clearThreadStatsTag() 方法清除标记.
TrafficStats.setThreadStatsTag(0xF00D);
try {
// Make network request using HttpClient.execute()
} finally {
TrafficStats.clearThreadStatsTag();
}
Android 4.0支持标记套接字, 但实时数据只会在4.0.4或更高版本的Android设备上展示.
LogCat是DDMS中的一部分功能, 它会打印你在程序用使用 Log
类打印的各种信息(比如, Log.i, Log,e, Log.d 等等). 这些打印的信息方便我们知道应用程序运行时的一些情况, 比如一些抛出的异常信息. 如要获取更多相关信息, 可前往官网阅读 Reading and Writing Log Messages.
当你创建你记录操作, 你能使用DDMS的LogCat 功能中以下的按钮过滤具体的信息:
你也可以创建你自己的通用的过滤器去分离更多的细节信息, 比如通过log的标记(tags)或者进程的id去过滤信息, 得到自己想要的log信息. 添加过滤器, 编辑过滤器, 和 删除过滤器的按钮可以让你管理自己的过滤器.
模拟器控制选项让你可以模拟电话的语音和数据网络状态. 当你想测试应用程序在不同网络环境下的健壮性时这是很有用的.
模拟器控制选项的电话状态部分让你可以更换不同的电话网络状态,网络速度和网络传输. 以下的几点可以用于设置这些不同的变更, 一旦设置就会立刻生效:
模拟器控制选项的电话操作部分让你可以模拟电话和短信服务. 这当你想测试你的应用程序在呼叫号码和发送信息等通信时的健壮性是很有用的. 以下的操作可以选择使用:
如果你的应用程序需要用电话的位置信息, 你可以使用DDMS发送一个虚拟的位置信息给设备或模拟器. 这在不同移动距离就能测试应用程序在不同位置信息下的具体反应是很有用的.以下的几点可以选择使用: