Android - профилирование определенного потока (UI Thread) через DDMS
Я пытаюсь найти причину зависаний в потоке пользовательского интерфейса в моем приложении в определенных условиях.
Я запустил приложение через профилирование DDMS. Но в нижнем представлении таблицы дерева я вижу все методы, вызываемые во всех потоках, тогда как я хотел бы сосредоточиться только на основном потоке.
Есть ли способ отфильтровать нижний список методов таблицы дерева в DDMS, чтобы включить только статистику для выбранного потока (поток пользовательского интерфейса в моем случае)?
Подвопрос: есть ли хороший Android-профилировщик?
3 ответа
Пользовательский интерфейс не предоставляет способа сделать это - вам просто нужно просмотреть временную шкалу и щелкнуть по занятым разделам.
Есть грубый подход, который может сделать то, что вы хотите.
SDK включает в себя инструмент под названием dmtracedump
которые могут быть использованы для создания отчетов из .trace
файл. Когда вы получаете трассировку с помощью DDMS, обратите внимание на местоположение файла (мой был /tmp/ddms4176182990461128308.trace
). В Linux вы должны запустить:
dmtracedump -o <filename> > trace.txt
Это даст вам файл, который выглядит следующим образом:
VERSION: 3
Threads (13):
1 main
2 GC
3 Signal Catcher
4 JDWP
...
Trace (threadID action usecs class.method signature):
4 xit 0 ..dalvik/system/VMDebug.startMethodTracingDdms (IIZI)V
4 xit 0 .android/os/Debug.startMethodTracingDdms (IIZI)V
4 xit 0 android/ddm/DdmHandleProfiling.handleMPSS (Lorg/apache/harmony/dalvik/ddmc/Chunk;)Lorg/apache/harmony/dalvik/ddmc/Chunk;
...
Как отмечено в выходных данных, каждая строка начинается с идентификатора потока, который соответствует таблице вверху (таким образом, идентификатор 4 потока является потоком JDWP, который обрабатывает трафик DDMS). Далее следует код действия: ent
для ввода метода, xit
для выхода из метода, или unr
для разворачивания стека из-за исключения. После этого следует отметка времени ЦП для каждого потока (т. Е. Совокупное время ЦП, используемое этим потоком), затем имя метода и подпись.
Если вы просто хотите увидеть основной поток пользовательского интерфейса (ID потока 1), вы можете использовать:
grep "^ 1 " trace.txt
Теперь просто разобрать вывод.:-)
Было бы легче справиться, если бы вы могли удалить данные для неинтересных потоков из файла трассировки, а затем просто открыть новый файл с traceview
инструмент (входит в комплект SDK). Если вы откроете файл.trace, вы увидите, что это фрагмент текста, за которым следует фрагмент двоичных данных. Вам нужно написать программу, которая пропускает текст, затем анализирует двоичную часть и удаляет что-либо с идентификатором потока, отличным от того, который вас интересует. Формат прост - коллекция записей фиксированного размера - описано в комментарии в верхней части кода профилирования.
(Я не знаю, написал ли кто-нибудь это уже.)
Для просмотра активности вашего кода (горячие точки со стеками вызовов) в определенном потоке (например, в пользовательском интерфейсе) я предлагаю использовать Intel VTune из System Studio. Вы можете собрать базовый профиль "горячих точек" на вашем Android-устройстве, открыть вкладку "снизу вверх" и выбрать "Группировка: поток / функция / стек вызовов". После этого вы увидите профиль вашего приложения для каждого потока. (подробности на прилагаемом скриншоте)
Вот руководство по использованию VTune: http://software.intel.com/en-us/articles/using-intel-vtune-amplifier-on-non-rooted-android-devices
Лучший Android-профилировщик - это, конечно, Eclipse Memory Analyzer. Это позволяет вам сделать снимок вашей памяти и посмотреть, что на ней происходит. Пожалуйста, посмотрите на ссылку ниже, чтобы узнать больше об этом.
http://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/