From:https://www.e-learn.cn/topic/3527658
Android SDK 中的 ddms 使用详解:https://blog.csdn.net/x83853684/article/details/80643131
ADB、Android Monitor、DDMS、HierarchyViewer、MAT、SysTrace、TraceView 性能分析工具使用大全:
https://www.jianshu.com/p/c83f3669e529
哔哩哔哩( 去掉 "车来了" app 的广告 ):https://www.bilibili.com/video/BV1UE411A7rW?p=35
DDMS
1. DDMS 简介
DDMS 的全称是 Dalvik Debug Monitor Service。可以实现 IDE 与连接终端设备(包含 仿真器 与 真机 )的调试,DDMS 可以实现查询终端设备运行状态,终端设备进程状态,线程状态,文件系统,日志信息(logcat)等。以及控制终端设备完成一些操作。还可以向目标机发送短信、打电话,发送地理位置信息等。可以像 gdb 一样 attach 某一个进程调试。 SDK tools 目录下提供了 ddms 的完整版,直接运行即可。总的来说它是一款性能分析工具,可以帮助开发者快速了APP的运行情况。具体可见 https://developer.android.com/studio/profile/monitor 。
DDMS 怎样与调试器交互?
1,每一个 Android 应用都运行在一个 Dalvik 虚拟机实例里,而每一个虚拟机实例都是一个独立的进程空间。虚拟机的 线程机制,内存分配和管理,Mutex等等都是依赖底层操作系统而实现的。所有Android应用的线程都对应一个Linux线程,虚拟机因而可以更多的 依赖操作系统的线程调度和管理机制。
2,DDMS 在 IDE与设备或模拟器之间的起着中间人的角色。
3,DDMS 启动时会与 adb 之间建立一个 device monitoring service 用于监控设备。当设备断开或链接时,这个 service 就会通知DDMS。
4,当一个设备链接上时,DDSM 和 ADB 之间又会建立 VM monitoring service 用于监控设备上的虚拟机。
5,通过 ADB Deamon 与设备上的虚拟机的 debugger 建立链接,这样 DDMS 就开始与虚拟机对话了。
在安卓平台上,每个应用都运行在自己的进程上,同时每个应用也都运行在自己的虚拟机(VM)上。每个VM公布了唯一的端口号以供调试器连接。
当DDMS启动后,会连接到adb。当有设备连接上,VM监测服务就在adb和DDMS之间创建,它会通知DDMS 设备上的VM是启动了还是终止了。一旦VM是运行的,DDMS就获取VM的进程ID(pid),通过adb和设备上的adb守护进程(adbd)建立到 VM调试器的连接。到此,DDMS就可以使用约定的线协议与VM通信。
DDMS给设备上的每个VM分配一个调试端口。通常,DDMS分配的第一个可调试端口号是8600,下一个是8601,依次往下类推。当调试器连接 到已分配的一个端口时,VM上的所有通信都会被关联到调试器。一个调试器只能连接一个单独的端口,但是DDMS同时可以处理多个连接的调试器。
默认的,DDMS也会监听DDMS的“基本端口”(默认为8700)。基本端口是一个端口转发端口,可以通过8700端口接受来自VM所有调试端口的通信并可以发送信息到调试器。这就允许你将调试器连接到8700端口,然后可以调试所有设备上的虚拟机。在DDMS设备视图下,转发的通信可以被当前所 选进程终止。
接下来的屏幕截图会在Eclipse中显示标准的DDMS屏幕视图。如果你是从命令行启动的DDMS,截图会略有不同,但绝大部分功能是相同的。注意这个特殊进程,com.android.email 它在模拟器上运行时的调试端口是8700,而分配给它的端口是8606。这就表明 DDMS 当前将 8606 端口转发到静态调试端口 8700。
DDMS 启动 方法
DDMS 在 SDK 里面的 tools 文件夹里,下载 SDK 后可以直接进入 tools 文件夹,双击 ddms.bat 启动,如下图:
主界面(手机root后才会显示所安装应用):
Android Device Monitor :DDMS、HierarchyViewer。
Monitor 可以看做 DDMS 和 HierarchyViewer(层次结构)的组合。
Android Device Monitor 已在 Android Studio 3.1 中弃用,并已从 Android Studio 3.2 中移除。
2.DDMS( Monitor ) 功能详解
首先 DDMS 被分为三个部分。左上角为 Device 面板,详细罗列了与电脑相连的终端设备的信息。右上角为详细的功能选项卡,下方为日志信息以及终端信息.
2.1 Devices 面板
1,左边显示了所有当前能找到的所有模拟器或设备列表和每个设备当前正在运行的虚拟机列表。虚拟机是按程序的包命来显示的。
2,通过这些列表可以找到运行着想调试的activity的虚拟机。每个虚拟机旁边的是“debugger pass-through”端口,链接到其中一个端口就会链接到设备上对应的虚拟机。不管如何,在用DDMS时,只需要链接到8700端口,因为DDSM 转发所有的通信到当前选择的虚拟机。这样,就不用在每次切换虚拟机是重新配置debugger端口。
3,当一个正在运行的程序调用waitForDebugger()函数时,客户端名字旁边会显示一个红色的icon,知道debugger连上对 应的虚拟机,这是debugger会变成绿色。
4,如果看到叉icon,着意味着DDMS用于不能打开虚拟机的端口而不能建立debugger与虚拟机建立连接。如果看到所有的虚拟机是这样, 很可能是有另外一个DDSM实例在运行。
这个面板包含了所有的与IDE相连的设备列表以及每个设备上运行的进程的列表,如下图所示:
device 窗口列出了 模拟器(或 真机)中所有的进程,显示进程时会显示进程ID (上图中online那一列显示的即是终端上运行的进程的ID) 以及与进程相关联的端口号,连接端口号从 8600 端口依次往下增加,8700 是 DDMS 接收所有连接终端返回信息的端口,即是 base 端口。Devices 面板顶端从左往右有多个按钮,
上面一排的按钮功能,可以把鼠标放上面会自动显示按钮说明。如果你没有运行或调试程序的话,这些图标是不可用的!
当你选中某个进程,并按下调试进程按钮时,如果 eclipse 中有这个进程的代码,那就可以进行源代码级别的调试。有点像gdb attach。图片抓取按钮可以把当前android的显示桌面抓到你的机器上,也是非常有用。
开始方法分析:
- 1.在设备选项,选择要进行方法分析的进程
- 2.点击 Start Method Profiling按钮。
- 3.与应用进行交互,开始要分析的方法
- 4.点击 Stop Method Profiling按钮。DDMS停止分析应用并打开Traceview,它包含了在点击Start Method Profiling和Stop Method Profiling之间方法分析收集到的信息.
下面一一分析这些按钮的功能
1. Debug: 实现使用DDMS对代码进行调试,使用该功能的前提是 IDE中具有该运行进程的源代码,否则该按钮为灰色,功能无法使用.
2. Update heap: 实现对进程中的堆进行更新的操作。只有当选择这个按钮后,在右侧的功能面板中的heap选项卡中就能够看见当前进程的堆使用情况:
点击 Cause GC 可以触发虚拟机的垃圾回收机制。
3. Dump HPROF file: 将当前进程堆使用情况生成文档,使用这个功能可以更加详细的分析当前堆的情况,有利于查找内存泄等问题。
4. Cause GC: 触发垃圾回收机制,可以点击后查看当前进程的堆使用情况
5. Update thread: 这个功能与update heap一样,当点击了这个按钮才能在右侧面板的thread选项卡中查看当前进程的所用的线程运行状态
6. Start Method Profiling: 开始进行方法分析。这个功能比较重要,后面单独写文章分析
7. Stop: 终止当前选中的进程。
8. Screen Capture: 截屏按钮,捕获当前设备的屏幕状态,该功能具有一定的延时
2.2 功能面板
功能面板从左到右有多个选项卡分别是:
1. Threads: 这个不必多说,表示当前进程中的所有线程状态。线程视图列出了此进程的所有线程。
ID: 虚拟机分配的唯一的线程ID,在Dalvik里,它们是从3开始的奇数。
Tid: linux的线程ID,For the main thread in a process, this will match the process ID.
Stauts: 线程状态,
running: 正在执行程序代码
sleeping:执行了Thread.sleep()
monitor: 等待接受一个监听锁。
wait: Object.wait()
native: 正在执行native代码
vmwait: 等待虚拟机
zombie: 线程在垂死的进程
init: 线程在初始化(我们不可能看到)
starting:线程正在启动(我们不可能看到)
utime: 执行用户代码的累计时间
stime: 执行系统代码的累计时间
name: 线程的名字
2. Heap: 表示当前进程堆使用情况。展示一些堆的状态,在垃圾回收其间更新。当选定一个虚拟机时, VM Heap视图不能显示数据,可以点击右边面包上的带有绿色的”Show heap updates”按钮,然后在点击”Cause GC “实施垃圾回收更新堆的状态。
3. Allocation Tracker: 分配跟踪器,后面单独写文章分析。在这个视图里,我们可以跟踪每个选中的虚拟机的内存分配情况。点击”Start Tracking”后点击”Get Allocations “就可以看到。
4. NetWork Statistics: 网络分析功能。
5. File Explorer: 浏览终端的文件系统,进行文件相关操作。通过 Device > File Explorer 就可以打开 File Explorer。这里可以浏览文件,上传上载删除文件,当然这是有相应权限限制的( 只有 root 权限才能查看 )。 在这里面可以进行将外部文件导入到终端中,或者将终端文件导出,或者删除终端文件,具体操作是右上角三个按钮:
文件操作还是比较重要的,比如一个应用涉及到了SQLite数据库使用,此时可以使用这个功能,导出数据库文件单独分析
6. Emulator Control: 可以实现往模拟器中打电话,发送短信,发送地理位置坐标等功能。
在这里,可以模拟一些设备状态和行为。
Telephony Status:改变电话语音和数据方案的状态,模拟不同的网络速度。
TelePhony Actions:发送模拟的电话呼叫和短信到模拟器。
Location Controls:发送虚拟的定位数据到模拟器里,我们就可以执行定位之类的操作。可以收工的在Manual里输入经度纬度发送到模拟器,也可以通过 GPX和KML文件。
有了AndroidStudio 如果启动了模拟器,可以直接在模拟器上实现相关信息的发送而不需要借助于DDMS
7. System Information: 这个选项卡里面可以查看终端的CPU负载以及内存使用情况。具体的试过就知道了。
2.3 LogCat and Console
这一部分就是系统运行产生的日志信息以及终端打印的信息。比较关心的还是LogCat。
这里的 LogCat 与 AndroidStudio 中的 LogCat 是一样的。使用 LogCat 可以根据程序中的运行日志判断当前程序运行的状态。终端设备一般运行较多的进程,每个进程运行都有大量的日志产生。因此一般需要使用 过滤器过滤其他进程信息。过滤器在 Saved Filter 中的以添加过滤器:
如果指定要观察某一个进程的日志信息,那过滤器就使用PID(进程ID)进行过滤即可,进程ID可以在Devices面板中得到,过滤的等级根据自己代码中写的等级酌情考虑,这样就能够实现只是观察一个进程的日志信息。
去掉 "车来了" app 的广告
首先使用 AndroidKiller 反编译 "车来了" app ,找到 包名
然后 打开 monitor 过滤 com.ygkj.chelaile.standard 的 log,通过观察 log 可以发现,log 中出现了 " 成功发送简单上报广告时间埋点 " 之类的信息,右键 -》 Fiter similar messages... 即可看到详细信息,
复制 广告的网址,然后在 AndroidKiller 中 全文件查找,并替换为空,导致 拼接 的 URL 无法访问,从而达到去掉广告的效果: