1.bugreport
java –jar chkbugreport.jar bugreport.txt
2.simpleperf
simpleperf
3. MAT
命令行提取hprof文件
- adb shell am dumpheap
- adb pull
- /android-sdk/platform-tools/hprof-conv
.hprof - 使用MAT分析
1 | Error opening heap dump 'memory-20190216T171338.hprof'. Check the error log for further details. Error opening heap dump 'memory-20190216T171338.hprof'. Check the error log for further details. Unknown HPROF Version (JAVA PROFILE 1.0.3) (java.io.IOException) Unknown HPROF Version (JAVA PROFILE 1.0.3) |
出现这个错误是因为Android导出的hprof文件格式与标准的JAVA hprof格式不一样,根本原因是虚拟机不一样造成的,在导入MAT前需要用AndroidSDK/tools/hprof-conf.exe进行转换: 例如:
hprof-conv android.hprof mat.hprof
hprof-conv /Users/mypro/Desktop/mat/test1.hprof /Users/mypro/Desktop/mat/test2.hprof
使用MAT:
在使用MAT之前,先使用as的Profile中的Memory去获取要分析的堆内存快照文件.hprof,如果要测试某个页面是否产生内存泄漏,可以先dump出没进入该页面的内存快照文件.hprof,然后,通常执行5次进入/退出该页面,然后再dump出此刻的内存快照文件.hprof,最后,将两者比较,如果内存相除明显,则可能发生内存泄露。(注意:MAT需要标准的.hprof文件,因此在as的Profiler中GC后dump出的内存快照文件.hprof必须手动使用android sdk platform-tools下的hprof-conv程序进行转换才能被MAT打开)
然后,使用MAT打开前面保存的2份.hprof文件,打开Overview界面,在Overview界面下面有4中action,其中最常用的就是Histogram和Dominator Tree。
Dominator Tree:支配树,按对象大小降序列出对象和其所引用的对象,注重引用关系分析。选择Group by package,找到当前要检测的类(或者使用顶部的Regex直接搜索),查看它的Object数目是否正确,如果多了,则判断发生了内存泄露。然后,右击该类,选择Merge Shortest Paths to GC Root中的exclude all phantom/weak/soft etc.references选项来查看该类的GC强引用链。最后,通过引用链即可看到最终强引用该类的对象。
Histogram:直方图注重量的分析。使用方式与Dominator Tree类似。
- 对比hprof文件,检测出复杂情况下的内存泄露:
通用对比方式:
在Navigation History下面选择想要对比的dominator_tree/histogram,右击选择Add to Compare Basket,然后在Compare Basket一栏中点击红色感叹号(Compare the results)生成对比表格(Compared Tables),在顶部Regex输入要检测的类,查看引用关系或对象数量去进行分析即可
针对于Historam的快速对比方式:
直接选择Histogram上方的Compare to another Heap Dump选择要比较的hprof文件的Historam即可。
4.打印trace
- cat proc/[pid]/stack ==> 查看kernel调用栈
- debuggerd -b [pid] ==> 也不可以不带参数-b, 则直接输出到/data/tombstones/目录
- kill -3 [pid] ==> 收集指定进程的trace 生成/data/anr/traces.txt文件
- lsof [pid] ==> 查看进程所打开的文件
5.GDB
6.addr2line
7.Profiler
使用AndroidProfiler的MEMORY工具:
运行程序,对每一个页面进行内存分析检查。首先,反复打开关闭页面5次,然后收到GC(点击Profile MEMORY左上角的垃圾桶图标),如果此时total内存还没有恢复到之前的数值,则可能发生了内存泄露。此时,再点击Profile MEMORY左上角的垃圾桶图标旁的heap dump按钮查看当前的内存堆栈情况,选择按包名查找,找到当前测试的Activity,如果引用了多个实例,则表明发生了内存泄露。
要打开 Profiler 窗口,请依次选择 View > Tool Windows > Profiler,
使用 Debug API 记录 CPU 活动
1 | Debug.startMethodTracing("OkayDock" ); |
trace文件生成位置
1 | /sdcard/Android/data/com.okay.dock/files/OkayDock.trace |
可以直接用AS打开
使用 Memory Profiler 查看 Java 堆和内存分配
8.Systrace
/Users/tracyliu/Library/Android/sdk/platform-tools/systrace
在命令行上捕获系统跟踪信息
Systrace 概览
了解 Systrace
面试Tip之Android优化工具Systrace1
2
3
4
5
6
7在进程的上面有一条很细的进度条,包含了该线程的状态:
灰色: 睡眠。
蓝色: 可以运行(它可以运行,但还未被调度运行)。
绿色: 正在运行(调度程序认为它正在运行)。
红色: 不间断的睡眠(通常发生在内核锁上), 指出I / O负载,对于性能问题的调试非常有用
橙色: 由于I / O负载导致的不间断睡眠。
要查看不间断睡眠的原因(可从sched_blocked_reason跟踪点获取),请选择红色不间断睡眠切片。
1 | 按键操作 作用 |
1 | ./systrace.py -t 10 sched gfx view wm am app webview -a com.okay.dock |
9.Uiautomatorviewer
> open /Users/tracyliu/Library/Android/sdk/tools/bin/uiautomatorviewer
10.反编译
Apktool
https://ibotpeaches.github.io/Apktool/install/
apktool d xxx.apk
1
2
3
4
5
6 1. 将下载好的apktool文件与apktool_2.3.1.jar文件准备好,并将apktool_2.3.1.jar更名为apktool.jar;
2. 将apktool.jar与apktool移动到/usr/local/bin目录下(可以通过在终端中输出命令open /usr/local/bin来打开这个目录);
3. 为上述两个文件增加可执行权限,即在终端中输入并执行:
chmod +x apktool.jar
chmod +x apktool
4. 在终端输入apktool看是否可以运行,如果不可以需要在系统偏好设置中打开安全与隐私中点击仍要运行apktool.jar;
dex2jar
https://sourceforge.net/projects/dex2jar/files/
11.DDMS
Android Studio 3.0开始 DDMS弃用
可以在
SDK/tools/monitor双击打开DDMS