Android DDMS是否提供 API?我需要自动化本机堆的快照机制。或者是否有任何用于分析 DDMS 本机堆快照的后处理工具。
4 回答
我假设快照是指堆转储。
从您的应用程序代码中,您可以调用Debug.dumpHprofData()
转储数据。
从脚本中,您可以调用
adb shell am dumpheap <process> <file>
<process>
例如,您的进程 ID 或名称在哪里,并且<file>
是转储文件名。之后,您可以adb pull
转储到您的计算机。
要分析堆转储,您可以使用例如 jhat 或 MAT。在此之前,您需要hprof-conv
在转储上运行(包含在 Android SDK 中)以将其从 Dalvik 格式转换为标准 Java 格式。
进一步阅读:Android 应用程序的内存分析
@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
DDMS 为 ADB 提供了一个 UI。您可以直接使用 ADB 命令并处理输出。ADB 文档可以在这里找到:http: //developer.android.com/tools/help/adb.html
我写了一个小脚本,也许你会发现它很有用
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