Cómo obtener una identificación de hilo en Method Traceview de Android Device Monitor en Android Studio

Traceview es un visor gráfico para registros de ejecución que crea utilizando la clase Debug para registrar información de rastreo en su código. Traceview puede ayudarlo a depurar su aplicación y perfilar su rendimiento.

Traceview Layout


Cuando tiene un archivo de registro de seguimiento (generado al agregar código de seguimiento a su aplicación o por DDMS), puede cargar los archivos de registro en Traceview, que muestra los datos de registro en dos paneles:

  • Un panel de línea de tiempo: describe cuándo cada subproceso y método comenzó y se detuvo
  • Un panel de perfil: proporciona un resumen de lo que sucedió dentro de un método

Las secciones a continuación proporcionan información adicional sobre los paneles de salida de traceview.

Panel de línea de tiempo

La Figura 1 muestra un primer plano del panel de la línea de tiempo. La ejecución de cada hilo se muestra en su propia fila, con el tiempo aumentando a la derecha. Cada método se muestra en otro color (los colores se reutilizan de forma circular comenzando por los métodos que tienen el tiempo más inclusivo). Las líneas finas debajo de la primera fila muestran la extensión (entrada a salida) de todas las llamadas al método seleccionado.

Figura 1. El panel de línea de tiempo de Traceview

Panel de perfil

La Figura 2 muestra el panel de perfil, un resumen de todo el tiempo empleado en un método. La tabla muestra los tiempos inclusivos y exclusivos (así como el porcentaje del tiempo total). El tiempo exclusivo es el tiempo empleado en el método. El tiempo inclusivo es el tiempo empleado en el método más el tiempo empleado en cualquier función llamada. Nos referimos a los métodos de llamada como “padres” y a los métodos llamados como “hijos”. Cuando se selecciona un método (haciendo clic en él), se expande para mostrar a los padres e hijos. Los padres se muestran con un fondo morado y los niños con un fondo amarillo. La última columna de la tabla muestra el número de llamadas a este método más el número de llamadas recursivas. La última columna muestra el número de llamadas del total de llamadas realizadas a ese método. En esta vista, podemos ver que hubo 14 llamadas a LoadListener.nativeFinished(); mirar el panel de la línea de tiempo muestra que una de esas llamadas tomó un tiempo inusualmente largo.

Figura 2. El panel de perfil de Traceview

Crear archivos de rastreo


Para usar Traceview, debe generar archivos de registro que contengan la información de rastreo que desea analizar.

Hay dos formas de generar registros de seguimiento:

  • Incluya la clase Debug en su código y llame a sus métodos como startMethodTracing () y stopMethodTracing (), para iniciar y detener el registro de información de rastreo en el disco. Esta opción es muy precisa porque puede especificar exactamente dónde comenzar y detener el registro de datos de rastreo en su código.
  • Utilice la función de perfil de método de DDMS para generar registros de seguimiento. Esta opción es menos precisa porque no modifica el código, sino que especifica cuándo iniciar y detener el registro con DDMS. Aunque tiene menos control sobre exactamente dónde comienza y se detiene el registro, esta opción es útil si no tiene acceso al código de la aplicación, o si no necesita un tiempo de registro preciso.

Antes de comenzar a generar registros de seguimiento, tenga en cuenta las siguientes restricciones:

  • Si está utilizando la clase Debug, su aplicación debe tener permiso para escribir en almacenamiento externo (WRITE_EXTERNAL_STORAGE).
  • Si está utilizando DDMS: Android 2.1 y dispositivos anteriores deben tener una tarjeta SD presente y su aplicación debe tener permiso para escribir en la tarjeta SD. Android 2.2 y dispositivos posteriores no necesitan una tarjeta SD. Los archivos de registro de seguimiento se transmiten directamente a su máquina de desarrollo.

Este documento se enfoca en usar la clase Debug para generar datos de rastreo. Para obtener más información sobre el uso de DDMS para generar datos de rastreo, consulte Uso del servidor Dalvik Debug Monitor.

Para crear los archivos de rastreo, incluya la clase Debug y llame a uno de los métodos startMethodTracing (). En la llamada, especifica un nombre base para los archivos de rastreo que genera el sistema. Para detener el seguimiento, llame a stopMethodTracing (). Estos métodos inician y detienen el rastreo de métodos en toda la máquina virtual. Por ejemplo, podría llamar a startMethodTracing () en el método onCreate () de su actividad, y llamar a stopMethodTracing () en el método onDestroy () de esa actividad.

// comenzar a rastrear a “/sdcard/calc.trace” Debug.startMethodTracing (“calc”); //… // deja de rastrear Debug.stopMethodTracing ();

Cuando su aplicación llama a startMethodTracing (), el sistema crea un archivo llamado .trace . Contiene los datos de rastreo del método binario y una tabla de asignación con hilos y nombres de métodos.

Luego, el sistema comienza a almacenar en búfer los datos de rastreo generados, hasta que su aplicación llama a stopMethodTracing (), momento en el cual escribe los datos almacenados en el archivo de salida. Si el sistema alcanza el tamaño máximo del búfer antes de llamar a stopMethodTracing (), el sistema detiene el rastreo y envía una notificación a la consola.

El código interpretado se ejecuta más lentamente cuando se habilita la creación de perfiles. No intente generar tiempos absolutos a partir de los resultados del generador de perfiles (por ejemplo, “la función X tarda 2,5 segundos en ejecutarse”). Los tiempos solo son útiles en relación con otros resultados de perfil, por lo que puede ver si los cambios han hecho que el código sea más rápido o más lento en relación con una ejecución de creación de perfiles anterior.

En Android 4.4 y versiones posteriores, puede usar perfiles basados ​​en muestras para perfilar con menos impacto en el rendimiento del tiempo de ejecución. Para habilitar el perfil de muestra, llame a startMethodTracingSampling () con un intervalo de muestreo especificado. Luego, el sistema recopilará muestras periódicamente hasta que se detenga el seguimiento a través de stopMethodTracing ().

Copiar archivos de rastreo en una máquina host


Después de que su aplicación se haya ejecutado y el sistema haya creado sus archivos de rastreo .trace en un dispositivo o emulador, debe copiar esos archivos en su computadora de desarrollo. Puede usar adb pull para copiar los archivos. Aquí hay un ejemplo que muestra cómo copiar un archivo de ejemplo, calc.trace, desde la ubicación predeterminada en el emulador al directorio / tmp en la máquina host del emulador:

adb pull /sdcard/calc.trace / tmp

Ver archivos de rastreo en Traceview


Para ejecutar Traceview y ver los archivos de seguimiento:

  1. Inicie el monitor de dispositivo Android.
  2. En la barra de herramientas de Android Device Monitor, haga clic en DDMS y seleccione un proceso.
  3. Haga clic en el icono Iniciar perfil de método para iniciar el perfil de método.
  4. Una vez completada la creación de perfiles, haga clic en el icono Detener perfil de métodos para mostrar la vista de seguimiento.

Nota: Si está intentando ver los registros de rastreo de una aplicación que está compilada con ProGuard habilitado (compilación en modo de lanzamiento), algunos métodos y nombres de miembros pueden ofuscarse. Puede usar el archivo Proguard mapping.txt para descubrir los nombres originales no ofuscados. Para obtener más información sobre este archivo, consulte la documentación de Proguard.

Nota: La ejecución de traceview desde la línea de comando ha quedado en desuso.

Usando dmtracedump


dmtracedump es una herramienta que le ofrece una forma alternativa de generar diagramas gráficos de pila de llamadas a partir de archivos de registro de seguimiento. La herramienta utiliza la utilidad Graphviz Dot para crear la salida gráfica, por lo que debe instalar Graphviz antes de ejecutar dmtracedump.

La herramienta dmtracedump genera los datos de la pila de llamadas como un diagrama de árbol, con cada llamada representada como un nodo. Muestra el flujo de llamadas (del nodo principal a los nodos secundarios) usando flechas. El siguiente diagrama muestra un ejemplo de salida dmtracedump.

Figura 3. Captura de pantalla de dmtracedump

Para cada nodo, dmtracedump muestra callname (, ,) , donde

  • – Número de referencia de la llamada, como se usa en los registros de seguimiento
  • – Tiempo transcurrido inclusivo (milisegundos gastados en el método, incluidos todos los métodos secundarios)
  • – Tiempo transcurrido exclusivo (milisegundos gastados en el método, sin incluir ningún método secundario)
  • – Número de llamadas

El uso de dmtracedump es:

dmtracedump [-ho] [-s clasificable] [-d trace-base-name] [-g outfile]

Luego, la herramienta carga datos de registro de rastreo de .data y .key . La siguiente tabla enumera las opciones para dmtracedump.

Opción

Descripción

-d

Difiere con este nombre de rastreo

-g

Generar salida a

-h

Activar salida HTML

-o

Volcar el archivo de rastreo en lugar de perfilar

-d

Base de URL para la ubicación del archivo JavaScript ordenable

-t

Umbral mínimo para incluir nodos secundarios en el gráfico (tiempo inclusivo del niño como porcentaje del tiempo inclusivo primario). Si no se utiliza esta opción, el umbral predeterminado es del 20%.

Problemas conocidos de Traceview


Trapos

El registro de Traceview no maneja bien los hilos, lo que resulta en estos dos problemas:

  1. Si un hilo sale durante la creación de perfiles, el nombre del hilo no se emite (corregido en Android 5.1 y posterior);
  2. La VM reutiliza las ID de subproceso. Si se detiene un subproceso y se inicia otro, pueden obtener la misma ID.