如何自动化DDMS快照机制?

时间:2013-11-13 12:56:20

标签: android android-ndk ddms android-testing

Android DDMS是否提供API?我需要自动化本机堆的快照机制。或者是否有任何用于分析DDMS本机堆快照的后处理工具。

4 个答案:

答案 0 :(得分:9)

我认为快照是指堆转储。

您可以通过应用代码调用Debug.dumpHprofData()转储数据。

从脚本中你可以调用

adb shell am dumpheap <process> <file>

其中<process>例如是您的进程ID或名称,<file>是转储文件名。之后,您可以adb pull转储到您的计算机。

要分析您可以使用的堆转储,例如jhat或MAT。在此之前,您需要在转储上运行hprof-conv(包含在Android SDK中),以将其从Dalvik格式转换为标准Java格式。

进一步阅读:Memory Analysis for Android Applications

答案 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