Android进阶之路 - DDMS调试之旅

因维护老项目,项目中涉及SQL数据库的存储部分,在调试程序时因随时需要查看数据走向,想起了DDMS这种调试工具,记得上一次使用已经是4年前了,毕竟在使用Eclipse开发Android的阶段中DDMS早已存在,虽然现在AndroidStudio已经有了很多新的工具更新替代,但是很多好用的东西终究不会那么轻易过时 ~

搭档篇

场景

根据查询得知AndroidStudio3.0/3.1之后因monitor功能用的基本比较少,Google就不想再占用一个菜单,所以之前通过菜单栏操作已被弱化,当然弱化并不代表不存在 ~

自我需求:查看存储于本地数据库的数据内容

开发工具:AndroidStudio3.2

DDMS基本概念

关于一些基本概念,引用了一位较早道友的总结,本来想在原基础上锦上添花,却发现很容易画蛇添足,故仅以个人理解稍加修饰

DDMS:Dalvik Debug Monitor Service

  • 每一个Android应用都运行在Dalvik虚拟机的实例中,同时每一个虚拟机的实例都是一个独立的进程;
  • 因其内部的线程机制、内存机制等都依赖于底层的操作系统而实现,所以Android应用的线程都对应依赖一个Linux线程,因而虚拟机可以更多依赖操作系统的线程调度和管理机制

工作流程

  • DDMS启动时会与ADB之间建立一个device monitoring service用于监控设备,当设备断开或链接时,这个service就会通知DDMS
  • 当设备链接上之后,DDMS和ADB之间又会建立VM monitoring service用于监控设备上的虚拟机,
  • 通过ADB Deamon与设备上的虚拟机的debugger建立链接,这样DDMS就开始与虚拟机对话了
  • 根据以上所述我们发现DDMS在IDE与设备中承担着中间人的角色
DDMS功能介绍
一级菜单
  • Devices:查看到所有与DDMS连接的设备详细信息,包含模拟器与手机,对应进程最右边相调试器链接的端口
  • Thread:查看进程中线程情况
  • Heap:查看应用中内存(堆)使用情况
  • Allocation Tracker: 分配跟踪器
  • NetWork Statistics: 网络分析功能
  • File Exporler:File Exporler文件浏览器,查看Android模拟器中的文件,可以很方便的导入/出文件
  • Emulator Control:实现对模拟器的控制,如:接听电话,根据选项模拟各种不同网络情况,模拟短信发送及虚拟地址坐标用于测试GPS功能等
  • LogCat :查看日志输入信息,可以对日志输入进行Filter过滤一些调试的信息筛选查看等
二级菜单
Devices
  • Debug: 实现使用DDMS对代码进行调试,使用该功能的前提是IDE中具有该运行进程的源代码,否则该按钮为灰色,功能无法使用
  • Update heap: 实现对进程中的堆进行更新的操作。只有当选择这个按钮后,在右侧的功能面板中的heap选项卡中就能够看见当前进程的堆使用情况: 点击Cause GC 可以触发虚拟机的垃圾回收机制
  • Dump HPROF file: 将当前进程堆使用情况生成文档,使用这个功能可以更加详细的分析当前堆的情况,有利于查找内存泄等问题。
  • Cause GC: 触发垃圾回收机制,可以点击后查看当前进程的堆使用情况
  • Update thread: 这个功能与update heap一样,当点击了这个按钮才能在右侧面板的thread选项卡中查看当前进程的所用的线程运行状态
  • Start Method Profiling: 开始进行方法分析。这个功能比较重要,后面单独写文章分析
  • Stop: 终止当前选中的进程
  • Screen Capture: 截屏按钮,捕获当前设备的屏幕状态,该功能具有一定的延时
Threads
  • ID:虚拟机分配的唯一的线程ID,在Dalvik里,它们是从3开始的奇数。
  • Tid:linux的线程ID
  • Stauts:线程状态,
  • running:正在执行程序代码
  • sleeping:执行了Thread.sleep()
  • monitor:等待接受一个监听锁
  • wait:Object.wait()
  • native:正在执行native代码
  • vmwait:等待虚拟机
  • zombie:线程在垂死的进程
  • init:线程在初始化(我们不可能看到)
  • starting:线程正在启动(我们不可能看到)
  • utime:执行用户代码的累计时间
  • stime:执行系统代码的累计时间
  • name:线程的名字
启动DDMS
通用方式(适用As各版本)

1.获取SDK存储地址:File → Project Structure(Ctrl + Alt +Shift + S) → SDK Location
在这里插入图片描述
2.启动cmd命令依次输入以下命令
在这里插入图片描述
命令分解如下

  • 进入tools
    在这里插入图片描述
  • 执行monitor.bat
    在这里插入图片描述
    3.启动结果
    在这里插入图片描述
较新方式(适用As3.1及之后版本)

1.View → Tool Windows → Device File Explorer
在这里插入图片描述
2.启动结果
在这里插入图片描述

查看数据库
连接场景
查看方式

操作路径:File Explorer → data
在这里插入图片描述
如data下无任何数据,打开cmd命令进行以下操作

  • 模拟器可直接操作
  • 真机需在Root的情况下操作
//进入platform-tools文件夹下 (路径不尽相同,根据之前提到的方式自行查看目录地址)
cd C:\Users\Acer\AppData\Local\Android\Sdk\platform-tools

//打开对应的data权限
adb shell su -c "chmod 777 /data"
adb shell su -c "chmod 777 /data/data"

//逐步打开app、databases、db等对应权限文件
adb shell su -c "chmod 777 /data/data/包名"
adb shell su -c "chmod 777 /data/data/包名/databases"
adb shell su -c "chmod 777 /data/data/包名/databases/*"

如需导出选中文件,通过DDMS右上角的导出工具即可

启动DDMS调试期间 - 所遇问题
8700端口占用问题

1.cmd输入指令 netstat -a -o 8700 (主要查看是哪个进程占用了端口)
在这里插入图片描述

2.cmd输入 tasklist /fi "pid eq 5052 (尾部的5052进程名是通过上一步获取的,每个人不尽相同)

通过进程号我们获取了占用该端口的应用程序,我们只需关闭该程序,重新尝试启动DDMS,即可正常启动
注:这里因我已操作完毕,故可正常启动,如您当前进程运行的也是monitor.exe的程序的话就是正确的

在这里插入图片描述

权限不足问题 - /system/bin/sh: su: not found
  • 场景

此问题产生在获取dada/dada文件夹权限期间

adb shell su -c "chmod 777 /data/data"
  • 解决

最直接的解决方式就是Root, 但是Root了会有很多潜在风险

找不到Hierarchy View 视图工具

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值