Предоставляет ли Android DDMS API? Мне нужно автоматизировать механизм моментальных снимков для нативной кучи. Или есть ли какой-либо инструмент постобработки для анализа собственных снимков кучи DDMS.
Как автоматизировать механизм моментальных снимков DDMS?
Ответы (4)
Я предполагаю, что под снимком вы имеете в виду дамп кучи.
Из кода приложения вы можете вызвать Debug.dumpHprofData()
для сброса данных.
Из сценария вы можете вызвать
adb shell am dumpheap <process> <file>
где <process>
, например. идентификатор или имя вашего процесса, а <file>
— имя файла дампа. После этого вы можете adb pull
скопировать дамп себе на компьютер.
Для анализа дампов кучи вы можете использовать, например. джхат или мат. Перед этим вам нужно запустить hprof-conv
(входит в Android SDK) на дамп, чтобы преобразовать его из формата Dalvik в стандартный формат Java.
Дополнительная литература: Анализ памяти для приложений Android
Ответ @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
DDMS предоставляет пользовательский интерфейс для ADB. Вы можете напрямую использовать команды 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