Как автоматизировать механизм моментальных снимков DDMS?

Предоставляет ли Android DDMS API? Мне нужно автоматизировать механизм моментальных снимков для нативной кучи. Или есть ли какой-либо инструмент постобработки для анализа собственных снимков кучи DDMS.


person Naresh Kumar    schedule 13.11.2013    source источник


Ответы (4)


Я предполагаю, что под снимком вы имеете в виду дамп кучи.

Из кода приложения вы можете вызвать Debug.dumpHprofData() для сброса данных.

Из сценария вы можете вызвать

adb shell am dumpheap <process> <file>

где <process>, например. идентификатор или имя вашего процесса, а <file> — имя файла дампа. После этого вы можете adb pull скопировать дамп себе на компьютер.

Для анализа дампов кучи вы можете использовать, например. джхат или мат. Перед этим вам нужно запустить hprof-conv (входит в Android SDK) на дамп, чтобы преобразовать его из формата Dalvik в стандартный формат Java.

Дополнительная литература: Анализ памяти для приложений Android

person laalto    schedule 13.11.2013
comment
как использовать MAT из командной строки? Я нашел решение использовать ParseHeapDump.sh, но как его использовать? - person Naresh Kumar; 15.11.2013

Ответ @laalto не совсем правильный

Из оболочки вы можете сделать следующее, чтобы получить дамп кучи для приложения с помощью adb.

Примечание. Замените 19000 идентификатором процесса запущенного приложения. Путь к файлу должен быть путем к файлу, к которому у вашего приложения есть доступ для записи на устройстве Android.

Создайте дамп кучи:
adb shell am dumpheap 19000 /sdcard/Documents/android.hprof
Перетащите файл на свой компьютер:
adb pull /sdcard/Documents/android.hprof
Преобразуйте в файл hprof, читаемый анализатором:
hprof-conv android.hprof mat.hprof

Советы: Получите идентификатор процесса вашего приложения:

adb shell ps | grep com.sample.application | cut -c10-15

Получить идентификатор процесса и дамп кучи:

adb shell am dumpheap `adb shell ps | grep com.sample.application | cut -c10-15` /sdcard/Documents/android.hprof

person vman    schedule 15.08.2014

DDMS предоставляет пользовательский интерфейс для ADB. Вы можете напрямую использовать команды ADB и обрабатывать вывод. Документацию по ADB можно найти здесь: http://developer.android.com/tools/help/adb.html

person sagis    schedule 13.11.2013

Я написал небольшой скрипт, может быть, вам будет полезно

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

person logcat    schedule 10.01.2017