当前位置: 首页 > news >正文

Android开发调试必备 - DDMS

一、真机调试的两个必备条件

(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


DDMS被整合到Eclipse中, 并且被安装到SDK目录的tools文件夹中. 只要创建了模拟器或者连接上真实的设备, 都能使用DDMS进行应用的调试. 如果同时运行着模拟器和真实设备, DDMS则默认会连接模拟器工作.

  • 在Eclipse上, 点击 Window > Open Perspective > Other... > DDMS. 即可启动DDMS.
  • 或者运行命令行 ddms (or ./ddms on Mac/Linux) from thetools/ directory.

DDMS是如何调试的


在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的静态调试端口.

Figure 1. Screenshot of DDMS - DDMS的界面截图

如果你不是使用Eclipse 或 ADT, 请前往原文点击<Configuring your IDE to attach to the debugging port>获取更多相关信息.

提示: 你在以下路径设置DDMs的参数: Window > Preferences. 参数保存在 $HOME/.android/ddms.cfg.

了解Dalvik的一些调试问题

在Dalvik VM中调试应用程序, 也应该以同样的方式在其他VM中工作. 无论如何, 当单步执行脱离同步代码, "当前行"指针可能会跳到方法的最后一行去执行.

使用DDMS


运行DDMS

查看进程的堆(heap)使用情况

DDMS允许你查看进程使用了多少堆内存. 当应用执行时, 这对于跟踪堆在一个确切时间点里的使用情况是很有用的.

如何查看进程的堆使用情况:

  1. 在设备的DDMS界面, 选择你想查看堆信息的进程.
  2. 点击 Update Heap 按钮确认选择该进程的堆信息.
  3. 在堆信息的标签中, 点击 Cause GC  去调用垃圾回收, 回收一次堆数据.当过程完成, 你将会看到已经被分配一组对象类型(object types)和内存信息. 你可以再次点击 Cause GC  刷新这些数据.
  4. 点击列表的对象类型 (object type) 查看对象和内存分配大小, 使用情况的柱状图.

跟踪对象的内存分配情况

DDMS提供一个跟踪对象内存分配以及查看这些类和线程分配的功能. 使你在应用上执行一些操作时能实时跟踪得到内存的分配使用情况. 这些所得到的信息是相当有用的, 因为它能帮助我们评估内存使用情况和应用的性能情况.(比如执行某些操作时, 引用的对象过多, 尤其读取了大量BITMAP图片, 这时内存就会飙升, 当占用率超过一定时, 就会引起OOM. 因此实时知道应用的操作和内存使用的情况, 是很有意义的.)

如何跟踪对象的内存分配:

  1. 在设备的DDMS界面中, 选择你想要跟踪的进程.
  2. 在点开的界面标签中, 点击 Start Tracking 按钮开始跟踪分配使用的情况. 在这时, 你在应用程序上的所有操作都将被跟踪, 具体数据会如实反映到表中.
  3.  点击 Start Tracking 后, 点击 Get Allocations 查看被分配的对象列表.  你可以再次点击 Get Allocations  刷新该信息列表.
  4. 点击 Stop Tracking 按钮可以停止跟踪或者清除数据后点击开始按钮重新开始.
  5. 点击列表中的某一行可以查看更多信息, 比如方法和第几行内代码如何分配了对象.

使用模拟器或设备的文件系统

DDMS提供文件系统的界面, 你可以在设备上浏览, 复制和删除文件.这个功能在检查应用程序是否创建了文件或者你想在设备内转移文件时很有用.

如何使用模拟器或设备的文件系统:

  1. 在设备标签中, 选择你想要浏览文件系统的模拟器.
  2. 在文件系统中定位所需的文件, 点击 Pull file 按钮复制文件. 
  3. 点击 Push file 按钮粘贴文件. 

查看线程信息

在DDMS中线程标签中可以查看选中的进程中当前运行的线程.

  1.  在设备DDMS界面, 选中你想查看线程的进程.
  2. 点击 Update Threads 按钮. 
  3. 在线程标签中, 你能浏览选中进程的线程信息.

开始分析方法

分析方法是一种跟踪特定度量方法的手段. 比如调用的数量, 执行时间, 和执行方法花费的时间. 如果你想获取更多细节数据, 可以使用startMethodTracing()和 stopMethodTracing() 方法. 获取更多关于生成跟踪日志的信息, 可看官方原文的 Profiling and Debugging UIs .

在你开始使用DDMS分析方法前, 请注意以下的事项:

  • Android 2.1和低于2.1的当前设备必须插有SD卡, 并且你的应用程序必须拥有读写SD卡的权限.
  • Android 2.2或更高版本系统的设备可以不需要SD卡. 跟踪日志文件会直接写在当前调试的设备机器中.

如何开始分析方法:

  1. 在界面标签中, 选择你想要开始分析方法的进程.
  2. 点击 Start Method Profiling 按钮. 
  3. 在Android 4.4和更高版本的机器, 根据采样间隔(sampling interval)选择基于跟踪分析(trace-based profiling)或采样分析(sample-based profiling)中任意一个. 而在低于4.4的Android系统版本, 只支持基于跟踪分析的方法.
  4. 伴随着应用程序的启动运行, 开始分析你所需的方法.
  5. 点击 Stop Method Profiling 按钮, DDMS会停止分析你的应用程序, 并且会自动打开界面并展示从点击 Start Method Profiling 到点击 Stop Method Profiling 跟踪期间收集的数据.

Using the Network Traffic tool使用网络通信工具

在Android 4.0, DDMS可以跟踪应用程序发送的网络请求, 从而获知网络的详细使用情况. 而使用该工具, 你可以监听你的应用程序怎么样,什么时候传递数据,以便适当的优化相应代码.你也可以在使用前根据提供 "tag" 给网络套接字去区分不同的数据类型.

下面图2, 是展示在DDMS栈区域的标签截图:

Figure 2. Network Usage tab.

通过监听数据传输的频率, 和在各个连接间传输数据的总量, 你可以确定并使应用程序在运行时更省电. 通常, 你应该寻找可以延迟发生请求的峰值方法,或者应该将后面的方法提前.(主要目的就是要提高网络请求的效率.)

为了更好的确认传递数据的高峰, 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

 LogCat是DDMS中的一部分功能, 它会打印你在程序用使用 Log 类打印的各种信息(比如, Log.i, Log,e, Log.d 等等). 这些打印的信息方便我们知道应用程序运行时的一些情况, 比如一些抛出的异常信息. 如要获取更多相关信息, 可前往官网阅读 Reading and Writing Log Messages.   

 当你创建你记录操作, 你能使用DDMS的LogCat 功能中以下的按钮过滤具体的信息:

  • Verbose - 黑色, 打印任何信息.
  • Debug - 蓝色, 只打印debug调试级别的信息.
  • Info - 绿色, 只打印info,Warn, Error的信息, Verbos和Debug的信息不会打印.
  • Warn - 橙色, 警告性信息.
  • Error - 红色, 错误性信息.

你也可以创建你自己的通用的过滤器去分离更多的细节信息, 比如通过log的标记(tags)或者进程的id去过滤信息, 得到自己想要的log信息. 添加过滤器, 编辑过滤器, 和 删除过滤器的按钮可以让你管理自己的过滤器.

模拟电话业务和位置

模拟器控制选项让你可以模拟电话的语音和数据网络状态. 当你想测试应用程序在不同网络环境下的健壮性时这是很有用的.

更换网络状态,网络速度,网络传输.(Changing network state, speed, and latency)

模拟器控制选项的电话状态部分让你可以更换不同的电话网络状态,网络速度和网络传输. 以下的几点可以用于设置这些不同的变更, 一旦设置就会立刻生效:

  • 语音(Voice) - 未注册的(unregistered), 本地(home), 漫游(roaming), 搜索中(searching), 拒绝(denied).
  • 数据(Data) - 未注册的, 本地, 漫游 , 搜索中, 拒绝.
  • 速度(Speed) - Full, GSM, HSCSD, GPRS, EDGE, UMTS, HSDPA
  • 网络传输(Latency) - GPRS, EDGE, UMTS

模拟电话或短息

模拟器控制选项的电话操作部分让你可以模拟电话和短信服务. 这当你想测试你的应用程序在呼叫号码和发送信息等通信时的健壮性是很有用的. 以下的操作可以选择使用:

  • 语音 - 在 Incoming number 区域输入呼叫号码, 并点击 Call  模拟一个呼叫给模拟器或其他电话设备. 点击 Hang up 按钮可中止呼叫操作. 
  • 短信 - 在 Incoming number 区域输入目标号码和短信内容, 点击 Send 按钮发送信息.      

设置电话的位置信息

如果你的应用程序需要用电话的位置信息, 你可以使用DDMS发送一个虚拟的位置信息给设备或模拟器. 这在不同移动距离就能测试应用程序在不同位置信息下的具体反应是很有用的.以下的几点可以选择使用:

  • 手动的(Manual) - 手动设置十进制或六十进制的经纬度.
  • GPX - GPS exChange files(GPS交换文件).
  • KML - Keyhole Markup Language file(一种标记语言, 基于XML语法和文件格式的文件,用来描述和保存地理信息, 多用于Google Earth).

相关文章:

  • UIAutomator2 click事件 报错 Injecting to another application requires INJECT_EVENTS permission解决
  • python UIAutomator2使用教程
  • Gradle修改下载文件位置
  • 安全传输协议-TLS
  • 浅谈SSL/TLS工作原理
  • SSL/TLS Cipher Suites
  • 数组指针和指针数组的区别
  • python基础 - global关键字及全局变量的用法
  • 斜杠‘/‘ 和反斜杠‘\‘
  • 转义字符详解
  • USB的VID、PID、PVN及分类(Class,SubClass,Protocol)
  • Windows下开发HID设备主机程序
  • Windows与自定义USB HID设备通信说明
  • usb server
  • window api 文件操作之CreateFile、ReadFile和WriteFile
  • CentOS 7 防火墙操作
  • CSS中外联样式表代表的含义
  • Debian下无root权限使用Python访问Oracle
  • js如何打印object对象
  • laravel 用artisan创建自己的模板
  • mac修复ab及siege安装
  • PHP那些事儿
  • SAP云平台里Global Account和Sub Account的关系
  • Vue 2.3、2.4 知识点小结
  • 反思总结然后整装待发
  • 今年的LC3大会没了?
  • 扑朔迷离的属性和特性【彻底弄清】
  • 入门级的git使用指北
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 一天一个设计模式之JS实现——适配器模式
  • 异步
  • 鱼骨图 - 如何绘制?
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云服务器如何修改远程端口?
  • ​ubuntu下安装kvm虚拟机
  • #Z0458. 树的中心2
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (3)llvm ir转换过程
  • (LeetCode) T14. Longest Common Prefix
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)nsfocus-绿盟科技笔试题目
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net快速开发框架源码分享
  • .project文件
  • .sh
  • @Bean注解详解
  • @ModelAttribute使用详解