Android DDMS是否提供API?我需要自动化本机堆的快照机制。或者是否有任何用于分析DDMS本机堆快照的后处理工具。
答案 0 :(得分:9)
我认为快照是指堆转储。
您可以通过应用代码调用Debug.dumpHprofData()
转储数据。
从脚本中你可以调用
adb shell am dumpheap <process> <file>
其中<process>
例如是您的进程ID或名称,<file>
是转储文件名。之后,您可以adb pull
转储到您的计算机。
要分析您可以使用的堆转储,例如jhat或MAT。在此之前,您需要在转储上运行hprof-conv
(包含在Android SDK中),以将其从Dalvik格式转换为标准Java格式。
答案 1 :(得分:7)
@ laalto的答案不太正确
从shell中,您可以执行以下操作,以使用adb为应用程序获取堆转储。
注意:将 19000 替换为正在运行的应用程序的进程ID。文件路径必须是您的应用程序在Android设备上具有写入权限的文件路径。
创建堆转储:
adb shell am dumpheap 19000 /sdcard/Documents/android.hprof
将文件拉到您的机器上:
adb pull /sdcard/Documents/android.hprof
转换为分析器可读的hprof文件:
hprof-conv android.hprof mat.hprof
提示: 获取应用程序的进程ID:
adb shell ps | grep com.sample.application | cut -c10-15
获取进程ID和转储堆:
adb shell am dumpheap `adb shell ps | grep com.sample.application | cut -c10-15` /sdcard/Documents/android.hprof
答案 2 :(得分:0)
DDMS为ADB提供UI。您可以直接使用ADB命令并处理输出。 ADB文档可在此处找到: http://developer.android.com/tools/help/adb.html
答案 3 :(得分:0)
我写了一个小脚本,也许你会发现它很有用
heap_dump_location='/data/local/tmp/tmp.hprof'
dump_heap() {
adb shell rm $heap_dump_location
pid=`adb shell ps | grep 'com.example.packagename' | grep -v 'packagename\.' | cut -c10-15`
adb shell am dumpheap $pid $heap_dump_location
echo "Heap dump started, we have no idea when it's done, so take a look at logs, and when is done use pull_heap_dump"
}
pull_heap_dump() {
adb pull $heap_dump_location $1
}
https://gist.github.com/logcat/8aeca0ee81af6fb0dc10bb0d58940007