4

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

4

4 回答 4

10

我假设快照是指堆转储。

从您的应用程序代码中,您可以调用Debug.dumpHprofData()转储数据。

从脚本中,您可以调用

adb shell am dumpheap <process> <file>

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

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

进一步阅读:Android 应用程序的内存分析

于 2013-11-13T13:34:28.150 回答
8

@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

于 2014-08-15T00:51:35.820 回答
0

DDMS 为 ADB 提供了一个 UI。您可以直接使用 ADB 命令并处理输出。ADB 文档可以在这里找到:http: //developer.android.com/tools/help/adb.html

于 2013-11-13T13:22:16.067 回答
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

于 2017-01-10T16:31:07.593 回答