因维护老项目,项目中涉及SQL数据库的存储部分,在调试程序时因随时需要查看数据走向,想起了DDMS这种调试工具,记得上一次使用已经是4年前了,毕竟在使用Eclipse开发Android的阶段中DDMS早已存在,虽然现在AndroidStudio已经有了很多新的工具更新替代,但是很多好用的东西终究不会那么轻易过时 ~
Sing:
场景
根据查询得知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.启动结果
查看数据库
连接场景
- 真机
- 模拟器
- Stetho真机查看数据库
查看方式
操作路径: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了会有很多潜在风险