Cómo inspeccionar la actividad de la CPU con CPU Profiler

Reducir el uso de CPU de tu app tiene muchas ventajas; por ejemplo, proporciona una experiencia de usuario más rápida y fluida, y prolonga la duración de la batería del dispositivo.

Puedes usar CPU Profiler para inspeccionar el uso de la CPU de tu app y la actividad de subprocesos en tiempo real mientras interactúas con la aplicación, o bien puedes inspeccionar los detalles en los seguimientos de funciones, del sistema y de métodos registrados.

Se determinarán los tipos específicos de información que registre y muestre CPU Profiler según la configuración que elijas:

  • System Trace: Captura detalles específicos que te permiten inspeccionar cómo interactúa tu app con los recursos del sistema.
  • Method and function traces: Para cada subproceso del proceso de tu app, puedes averiguar qué métodos (Java) o funciones (C/C++) se ejecutan durante un período de tiempo, así como los recursos de CPU que consume cada método o función mientras se ejecuta. También puedes usar seguimientos de métodos y funciones para identificar emisores y destinatarios. Un emisor es un método o función que invoca a otro método o función, y un destinatario es uno que es invocado. Puedes utilizar esta información para determinar qué métodos o funciones son responsables de invocar con demasiada frecuencia tareas particulares que tienen muchos recursos y optimizar el código de tu app para evitar trabajos innecesarios.

    Cuando registras seguimientos de métodos, puedes elegir registros muestreados o instrumentados. Para registrar seguimientos de funciones, solo puedes utilizar el registro muestreado.

Para obtener detalles sobre el uso y la elección de cada una de estas opciones de seguimiento, consulta Cómo elegir una configuración de registro.

Descripción general de CPU Profiler

Para abrir CPU Profiler, sigue estos pasos:

  1. Elige View > Tool Windows > Profiler o haz clic en Profile en la barra de herramientas.

    Si aparece el diálogo Select Deployment Target, elige el dispositivo en el que quieres implementar tu app para la generación de perfiles. Si conectaste un dispositivo mediante USB, pero no lo ves en la lista, asegúrate de haber habilitado la depuración USB.

  2. Haz clic en cualquier parte del cronograma de CPU para abrir CPU Profiler.

Cuando abres CPU Profiler, comienza a mostrarse inmediatamente el uso de CPU y la actividad de subprocesos de tu app. Verás algo similar a lo que se muestra en la figura 1.

Figura 1: Cronogramas de CPU Profiler

Como se indica en la figura 1, en la vista predeterminada de CPU Profiler, se incluye lo siguiente:

  1. Cronograma del evento: Muestra las actividades en tu app mientras pasan por diferentes estados durante su ciclo de vida. También indica las interacciones de los usuarios con el dispositivo, incluidos los eventos de rotación de pantalla. Para obtener información sobre cómo habilitar el cronograma de eventos en dispositivos que ejecutan Android 7.1 (nivel de API 25) o versiones inferiores, consulta Cómo habilitar la generación de perfiles avanzada.
  2. Cronograma de CPU: Muestra el uso de CPU de tu app en tiempo real (como un porcentaje del tiempo de CPU total disponible) y la cantidad total de subprocesos que usa. El cronograma también muestra el uso de CPU de otros procesos (como los del sistema u otras apps), por lo que puedes compararlo con el uso que hace tu aplicación. Puedes inspeccionar datos históricos del uso de CPU desplazando el mouse por el eje horizontal del cronograma.
  3. Cronograma de la actividad del subproceso: Muestra cada subproceso que pertenece al proceso de tu app e indica su actividad en un cronograma usando los colores que se detallan a continuación. Después de registrar un seguimiento de métodos, puedes seleccionar un subproceso de este cronograma para inspeccionar sus datos en el panel de seguimiento.
    • Verde: El subproceso está activo o está listo para usar la CPU. Es decir, se está ejecutando o puede ejecutarse.
    • Amarillo: El subproceso está activo, pero espera una operación de E/S, como una de disco o red, para poder completar su trabajo.
    • Gris: El subproceso está suspendido y no consume tiempo de CPU. A veces, esto ocurre cuando accede a un recurso que todavía no está disponible. O el subproceso entra en suspensión voluntaria, o el kernel suspende el subproceso hasta que se encuentre disponible el recurso requerido.

    CPU Profiler también informa el uso de CPU de los subprocesos que Android Studio y la plataforma Android agregan al proceso de tu app, como JDWP, Profile Saver, Studio:VMStats, Studio:Perfa y Studio:Heartbeat (aunque los nombres exactos que se muestran en el cronograma de actividad de subprocesos pueden variar). Android Studio presenta estos datos para que puedas identificar fácilmente los casos en que la actividad de los subprocesos y el uso de CPU se deban al código de tu app.

Cómo registrar seguimientos

Para comenzar a registrar un seguimiento, elige una configuración de registro en el menú desplegable ubicado en la parte superior de CPU Profiler y haz clic en Record.

Figura 2: CPU Profiler muestra el estado, la duración y el tipo de registro que se está realizando

Interactúa con tu app y, luego, haz clic en Stop cuando hayas terminado. El generador de perfiles selecciona automáticamente el rango de tiempo registrado y presenta su información de seguimiento en el panel correspondiente, como se muestra en la figura 3. Si quieres inspeccionar el seguimiento de otro subproceso, selecciónalo en el cronograma de la actividad.

Figura 3: CPU Profiler después de registrar un seguimiento de método

  1. Rango seleccionado: Determina la parte del tiempo registrado que se inspeccionará en el panel de seguimiento. Cuando registras un seguimiento por primera vez, CPU Profiler selecciona automáticamente la extensión completa de tu registro en el cronograma de la CPU. Si quieres inspeccionar los datos de seguimiento solo para una parte del rango de tiempo registrado, arrastra los bordes de la región destacada.
  2. Marca de tiempo: Indica la hora de inicio y finalización de un seguimiento registrado, en relación con el momento en que el generador de perfiles comenzó a recopilar información de uso de la CPU. Para seleccionar el registro completo, haz clic en la marca de tiempo.
  3. Panel de seguimiento: Muestra los datos de seguimiento correspondientes al rango de tiempo y al subproceso que elegiste. Este panel aparece solo después de que registres al menos un seguimiento. Allí, puedes seleccionar la forma en que deseas ver cada seguimiento de pila (por medio de las pestañas de seguimiento) y medir el tiempo de ejecución (mediante el menú desplegable de referencia de tiempo).
  4. Pestañas del panel de seguimiento: Elige cómo mostrar los detalles de seguimiento. Para obtener detalles sobre cada opción, consulta Cómo inspeccionar seguimientos.
  5. Menú de referencia de tiempo: Selecciona una de las siguientes opciones para determinar cómo se mide la información de tiempo para cada llamada:
    • Wall clock time: La información de sincronización representa el tiempo real que transcurrió.
    • Thread time: La información de sincronización representa el tiempo real que transcurrió menos cualquier fracción de ese tiempo en la que el subproceso no consume recursos de CPU. Para cualquier llamada determinada, "thread time" siempre es menor o igual que "wall clock time". Si usas "thread time", podrás comprender la fracción de uso de CPU real de un subproceso que se destina a una función o un método determinado.
  6. Filtro: Filtra los datos de seguimiento por nombre de paquete, función, método o clase. Por ejemplo, si deseas identificar rápidamente los datos de seguimiento relacionados con una llamada específica, haz clic en Filter o presiona Ctrl + F (Comando + F en Mac) y escribe el nombre en el campo de búsqueda. En las pestañas Call chart y Flame chart, se enfatizan las pilas de llamadas que incluyen una llamada, un paquete o una clase que coincide con la búsqueda. En las pestañas Top down y Bottom up, esas pilas de llamadas tienen prioridad por sobre otros resultados de seguimiento. También puedes habilitar las siguientes opciones marcando la casilla correspondiente junto al campo de búsqueda:
    • Regex: Para incluir expresiones regulares en tu búsqueda, usa esta opción.
    • Match case: Si tu búsqueda distingue entre mayúsculas y minúsculas, usa esta opción.

Cómo elegir una configuración de registro

Antes de comenzar a registrar información de seguimiento, elige la configuración adecuada para la información de perfil que quieras capturar:

  • Sample Java Methods: Captura la pila de llamadas de tu app en intervalos frecuentes durante la ejecución del código basado en Java. El generador de perfiles compara grupos de datos capturados para derivar la información del uso de recursos y sincronización sobre la ejecución del código de tu app.

    Un problema inherente del seguimiento basado en muestras es que, si tu app ingresa en un método luego de una captura de la pila de llamadas y sale de él antes de la siguiente captura, el generador de perfiles no registrará esa llamada al método. Si te interesa el seguimiento de métodos con ciclos de vida tan cortos, debes usar seguimiento instrumentado.

  • Trace Java Methods: Instrumenta tu app durante el tiempo de ejecución para registrar una marca de tiempo al principio y al final de cada llamada al método. Las marcas de tiempo se recopilan y se comparan para generar datos de seguimiento de métodos, como la información sobre sincronización y el uso de CPU.

    Ten en cuenta que la sobrecarga asociada con la instrumentación de cada método afecta el rendimiento del tiempo de ejecución y puede influir en los datos de generación de perfiles. Esto se nota aún más cuando se trata de métodos con ciclos de vida más cortos. Además, si tu app ejecuta muchos métodos en poco tiempo, es posible que el generador de perfiles exceda rápidamente su límite de tamaño de archivo y, por lo tanto, no registre ningún otro dato de seguimiento.

  • Sample C/C++ Functions: Captura seguimientos muestreados de los subprocesos nativos de tu app. Para utilizar esta configuración, debes implementar tu app en un dispositivo que ejecute Android 8.0 (nivel de API 26) o una versión posterior.

    De forma interna, esta configuración usa simpleperf para rastrear el código nativo de tu app. Si deseas especificar opciones adicionales para simpleperf, como muestrear CPU de dispositivos específicos o especificar duraciones de muestreo con una alta precisión, puedes usar simpleperf desde la línea de comandos.

  • Trace System Calls: Captura detalles específicos que te permiten inspeccionar cómo interactúa tu app con los recursos del sistema. Puedes consultar los tiempos y las duraciones exactas de los estados de tus subprocesos, identificar dónde están los cuellos de botella de la CPU en todos los núcleos y agregar eventos de seguimientos personalizados para analizar. Esa información puede ser crucial para cuando intentes solucionar problemas de rendimiento. Para utilizar esta configuración, debes implementar tu app en un dispositivo que ejecute Android 7.0 (nivel de API 24) o una versión posterior.

    Cuando usas esta nueva configuración de seguimiento, puedes marcar visualmente rutinas de código importantes en el cronograma del generador de perfiles mediante la instrumentación del código. Para hacerlo con C/C++, usa la API de seguimiento nativo que proporciona trace.h. En el caso de código Java, usa la clase Trace. Para obtener más información, consulta Cómo instrumentar el código de tu app.

    Esta configuración de seguimiento se basa en systrace. Puedes usar la herramienta de línea de comandos systrace para especificar opciones más allá de las que se proporcionan en CPU Profiler. Los datos adicionales a nivel del sistema que proporciona systrace pueden ayudarte a inspeccionar los procesos nativos del sistema y solucionar problemas relacionados con marcos retrasados o incompletos.

    En los dispositivos que ejecutan Android 9 (nivel de API 28) o versiones posteriores, puedes usar una app del sistema llamada Registro del sistema para registrar los seguimientos en un dispositivo.

Cómo crear, editar o ver una configuración de registro

Puedes crear, editar y ver configuraciones de registro en el cuadro de diálogo CPU Recording Configurations, que se abre seleccionando la opción Edit configurations ubicada en el menú desplegable de configuraciones de registro, en la parte superior de CPU Profiler.

Para ver los ajustes de una configuración de registro existente, selecciónala en el panel izquierdo del diálogo CPU Recording Configurations.

Para crear una nueva configuración de registro, haz lo siguiente:

  1. En la parte superior izquierda del diálogo, haz clic en Add , lo que creará una configuración nueva con algunos ajustes predeterminados.
  2. Asígnale un nombre a tu configuración.
  3. Elige una opción de Trace Technology.
  4. Para configuraciones de registros muestreadas, especifica Sampling interval con un valor en microsegundos (μs). Este valor representa la duración entre cada muestra de la pila de llamadas de tu app. Cuanto más corto sea el intervalo que especifiques, más rápido alcanzarás el límite de tamaño de archivo para los datos registrados.
  5. Especifica File size limit con un valor en megabytes (MB) para los datos registrados que se escriban en el dispositivo conectado. Si detienes el registro, Android Studio analizará estos datos y los mostrará en la ventana del generador de perfiles. Por lo tanto, si aumentas el límite y registras una gran cantidad de datos, Android Studio necesitará mucho más tiempo para analizar el archivo y podría bloquearse.

    Nota: Si usas un dispositivo conectado que ejecute Android 8.0 (nivel de API 26) o una versión posterior, no habrá límite para el tamaño de archivo de los datos de seguimiento y se ignorará este valor. Sin embargo, de todos modos, debes tener cuidado con la cantidad de datos que recopila el dispositivo luego de cada registro, ya que Android Studio podría tener dificultades para analizar archivos de seguimiento de gran tamaño. Por ejemplo, si registras un seguimiento muestreado con un intervalo corto o un seguimiento instrumentado mientras tu app llama a muchos métodos en un período breve, generarás rápidamente archivos de seguimiento muy grandes.

  6. Para aceptar los cambios y seguir modificando otras opciones de configuración, haz clic en Apply. Para aceptar todos los cambios aplicados y cerrar el cuadro de diálogo, haz clic en OK.

Cómo registrar la actividad de la CPU con la API de Debug

Puedes usar la API de Debug para permitir que tu app inicie y detenga el registro de actividad de la CPU en CPU Profiler.

CPU Profiler comienza a registrar cuando tu app llama a startMethodTracing(String tracePath) y deja de hacerlo cuando llama a stopMethodTracing(). Mientras se registra la actividad de la CPU que se activa con esta API, el generador de perfiles correspondiente muestra la API de Debug como la configuración de registro de CPU seleccionada.

Para controlar el registro de actividad de la CPU con la API de Debug, implementa tu app instrumentada en un dispositivo con Android 8.0 (nivel de API 26) o una versión posterior.

Para obtener más información, consulta Cómo generar registros de seguimiento mediante la instrumentación de tu app.

Cómo registrar la actividad de la CPU durante el inicio de una app

Para comenzar a registrar automáticamente la actividad de la CPU durante el inicio de la app, haz lo siguiente:

  1. Selecciona Run > Edit Configurations.
  2. En la pestaña Profiling, marca la casilla junto a Start recording a method trace on startup.
  3. En el menú, elige una configuración de registro de la CPU.
  4. Haz clic en Apply.
  5. Implementa tu app en un dispositivo que ejecute Android 8.0 (nivel de API 26) o una versión posterior seleccionando Run > Profile.

Cómo exportar seguimientos

Después de registrar la actividad de la CPU con el generador de perfiles correspondiente, puedes exportar los datos como un archivo .trace para compartirlos con otras personas o inspeccionarlos más tarde.

Para exportar un archivo de seguimiento desde el cronograma de la CPU, haz lo siguiente:

  1. En el cronograma de la CPU, haz clic con el botón derecho en el seguimiento del método registrado o en el seguimiento del sistema que quieras exportar.
  2. Selecciona la opción Export trace del menú desplegable.
  3. Busca la ubicación donde quieras guardar el archivo, especifica el nombre y haz clic en OK.

Para exportar un archivo de seguimiento desde el panel Sessions, haz lo siguiente:

  1. En el panel Sessions, haz clic con el botón derecho en el seguimiento registrado que quieras exportar.
  2. Haz clic en el botón Export method trace o Export system trace a la derecha de la entrada de la sesión.
  3. Busca la ubicación donde quieras guardar el archivo, especifica el nombre y haz clic en OK.

Cómo importar seguimientos

Puedes importar archivos .trace creados con la API de Debug o con CPU Profiler.

Para importar el seguimiento, haz clic en Start new profiler session en el panel Sessions y selecciona Load from file.

Puedes inspeccionar un seguimiento importado a CPU Profiler al igual que lo haces con los capturados de forma directa, salvo por las siguientes excepciones:

  • La actividad de la CPU no está representada en el cronograma de la CPU.
  • El cronograma de actividades de subprocesos solo indica que hay datos de seguimiento disponibles para cada subproceso, y no los estados reales de estos (como en ejecución, en espera o suspendido).

Cómo inspeccionar seguimientos

El panel de seguimiento de CPU Profiler proporciona varias pestañas que te permiten elegir cómo ver la información de los seguimientos registrados.

Para seguimientos de métodos y funciones, puedes elegir entre las pestañas Call Chart, Flame Chart, Top Down y Bottom Up. Para los seguimientos del sistema, puedes elegir entre Trace Events, Flame Chart, Top Down y Bottom Up.

Cómo inspeccionar seguimientos con la pestaña Call Chart

La pestaña Call Chart proporciona una representación gráfica de un seguimiento de método o función, en la que el período y el tiempo de una llamada están representados en el eje horizontal, y sus destinatarios, a lo largo del eje vertical. Las llamadas a las API del sistema se muestran en naranja, las que se realizan a los métodos de tu app se muestran en verde y las llamadas a API de terceros (incluidas las de lenguaje Java) se muestran en azul. En la figura 4, se muestra un gráfico de llamadas de ejemplo y se ilustra el concepto de los tipos de tiempo "self", "children" y "total" para un método determinado. Puedes obtener más información sobre estos conceptos en la sección Cómo inspeccionar seguimientos mediante Top Down y Bottom Up.

Figura 4: Ejemplo de gráfico de llamadas en el que se muestran los tiempos "self", "children" y "total" para el método D

Sugerencia: Para saltar al código fuente de un método o función, haz clic con el botón derecho en ese elemento y selecciona Jump to Source. Esto funciona desde todas las pestañas del panel de seguimiento.

Cómo inspeccionar seguimientos con la pestaña Flame Chart

La pestaña Flame Chart provee un gráfico de llamadas invertido que agrega pilas de llamadas idénticas. Es decir, las funciones o los métodos idénticos que comparten la misma secuencia de emisores se agrupan en una sola barra más larga en un gráfico de llamas (en lugar de mostrarse como varias barras más cortas, como se ve en un gráfico de llamada). De esta forma, es más fácil ver qué métodos o funciones consumen más tiempo. Sin embargo, esto también significa que el eje horizontal no representa un cronograma; en su lugar, indica la cantidad relativa de tiempo que tarda en ejecutarse cada método o función.

Para ilustrar mejor este concepto, observa el gráfico de llamadas de la figura 5. Ten en cuenta que el método D hace varias llamadas a B (B1, B2 y B3) y algunas de esas llamadas a B hacen una llamada a C (C1 y C3).

Figura 5: Gráfico de llamadas con varias llamadas a métodos que comparten una misma secuencia de emisores

Debido a que B1, B2 y B3 comparten la misma secuencia de emisores (A → D → B), se agrupan como se muestra en la figura 6. De manera similar, C1 y C3 se agrupan porque comparten la misma secuencia de emisores (A → D → B → C). Ten en cuenta que no se incluye C2 porque tiene una secuencia de emisores diferente (A → D → C).

Figura 6: Agregación de métodos idénticos que comparten la misma pila de llamadas

Con las llamadas agregadas, se crea el gráfico de llamas, como se muestra en la figura 7. Ten en cuenta que, para cualquier llamada en un gráfico de llamas, aparecen primero los destinatarios que consumen la mayor cantidad de tiempo de CPU.

Figura 7: Representación en un gráfico de llamas del gráfico de llamadas que se muestra en la figura 5

Cómo inspeccionar seguimientos mediante Top Down y Bottom Up

La pestaña Top Down muestra una lista de llamadas en las que la expansión de un nodo de función o método muestra sus destinatarios. En la figura 8, se muestra un gráfico de Top Down correspondiente al gráfico de llamadas de la figura 4. Cada flecha del gráfico apunta de un emisor a un destinatario.

Como se muestra en la figura 8, al expandir el nodo del método A en la pestaña Top Down, se muestran sus destinatarios, los métodos B y D. Después de eso, al expandir el nodo correspondiente al método D, se exponen los destinatarios, métodos B y C, y así sucesivamente. Como sucede con la pestaña Flame chart, en el árbol de Top Down, se agrega la información de seguimiento de métodos idénticos que comparten la misma pila de llamadas. Es decir, en la pestaña Flame chart, se proporciona una representación gráfica de la pestaña Top down.

La pestaña Top Down proporciona la siguiente información para ayudar a describir el tiempo de CPU invertido en cada llamada (los tiempos también se representan como un porcentaje del tiempo total del subproceso en el rango seleccionado):

  • Self: Cantidad de tiempo que tardó la llamada al método o la función en ejecutar su propio código y no el de sus destinatarios, como se muestra en la figura 4 para el método D
  • Children: Cantidad de tiempo que la llamada al método o la función tardó en ejecutar el código de sus destinatarios y no el suyo propio, como se muestra en la figura 4 para el método D
  • Total: Suma de los tiempos Self y Children del método (representa el tiempo total que la app tardó en ejecutar una llamada, como se ilustra en la figura 4 para el método D)

Figura 8: Árbol de Top Down

Figura 9: Árbol de Bottom Up para el método C de la figura 8

La pestaña Bottom Up muestra una lista de llamadas en las que la expansión de un nodo o método de función muestra sus destinatarios. Usando el seguimiento de ejemplo que se muestra en la figura 8, la figura 9 proporciona un árbol de Bottom Up para el método C. Al abrir el nodo del método C en ese árbol, se muestra cada uno de sus emisores únicos, los métodos B y D. Ten en cuenta que, aunque B llama a C dos veces, B aparece solo una vez cuando se expande el nodo del método C en el árbol de Bottom Up. Luego, al expandirse el nodo para B, se muestran sus emisores, los métodos A y D.

La pestaña Bottom Up es útil para ordenar los métodos o funciones según los que más (o menos) tiempo de CPU consumen. Además, puedes inspeccionar cada nodo para determinar qué emisores pasan la mayor cantidad de tiempo de CPU invocando esos métodos o funciones. En comparación con el árbol de Top Down, la información de sincronización para cada método o función en un árbol de Bottom Up tiene que ver con el método que está en la parte superior de cada árbol (nodo superior). El tiempo de CPU también se representa como un porcentaje del tiempo total del subproceso durante ese registro. La siguiente tabla ayuda a comprender la manera en que debe interpretarse la información de sincronización para el nodo superior y sus emisores (subnodos).

Self Children Total
Método o función en la parte superior del árbol Bottom Up (nodo superior) Representa el tiempo total que el método o la función tardó en ejecutar su propio código y no el de sus destinatarios. En comparación con el árbol de Top Down, esta información de tiempo representa una suma de todas las llamadas a este método o función durante el registro. Representa el tiempo total que el método o la función tardó en ejecutar sus destinatarios y no su propio código. En comparación con el árbol de Top Down, esta información de tiempo representa la suma de todas las llamadas a los destinatarios de este método o función durante el registro. La suma de los tiempos "self" y "children"
Emisores (subnodos) Representa el tiempo total del destinatario cuando lo llama el emisor. Al usar el árbol de Bottom Up de la figura 9 como ejemplo, el tiempo "self" para el método B sería igual a la suma de los tiempos "self" de cada ejecución del método C cuando lo llama B. Representa el tiempo "children" total del destinatario cuando lo invoca el emisor. Al usar el árbol de Bottom Up de la figura 9 como ejemplo, el tiempo "children" del método B sería igual a la suma de los tiempos "children" de cada ejecución del método C cuando lo llama B. La suma de los tiempos "self" y "children"

Nota: Para un registro en particular, Android Studio deja de recopilar datos nuevos cuando el generador de perfiles alcanza el límite de tamaño de archivo (esto, sin embargo, no detiene el registro). Normalmente, esto sucede mucho más rápido cuando se llevan a cabo seguimientos instrumentados, ya que este tipo de seguimiento recopila más datos en un período de tiempo más corto, en comparación con un seguimiento muestreado. Si extiendes el período de tiempo de inspección a un período del registro que se produjo luego de alcanzar el límite, no cambiarán los datos de sincronización del panel de seguimiento (ya que no habrá nuevos datos disponibles). Además, en el panel de seguimiento, se muestra NaN para la información de sincronización cuando seleccionas únicamente la parte de un registro que no tiene datos disponibles.

Cómo inspeccionar seguimientos del sistema usando la pestaña Trace Events

Al inspeccionar un seguimiento del sistema, puedes usar la pestaña Trace Events para ver los detalles de los eventos que se producen en cada subproceso.

Para ver los detalles de un subproceso, selecciona el elemento en cuestión en el panel Thread. Esto destacará la actividad del subproceso en cada núcleo de la CPU en el panel Kernel y mostrará los eventos del subproceso en la pestaña Trace Events. Desplaza el puntero del mouse sobre un evento de la pestaña Trace Events para ver el nombre del evento y el tiempo empleado en cada estado.

Por ejemplo, la figura 10 muestra el elemento RenderThread seleccionado en el panel Threads, su actividad resaltada en CPU 0 y CPU 1 en el panel Kernel, y el tiempo dedicado a un evento específico en la pestaña Trace Events.

Figura 10: Visualización de la actividad de la CPU y eventos de seguimiento correspondientes al subproceso de procesamiento

Para obtener información adicional sobre la inspección de la información de seguimiento del sistema, consulta la sección Cómo investigar problemas de rendimiento de IU de la documentación de systrace.

Cómo inspeccionar datos de procesamiento de marcos

Puedes inspeccionar cuánto tiempo le toma a tu app procesar cada marco del subproceso principal y RenderThread para examinar los cuellos de botella que causan el bloqueo de la IU y una baja velocidad de marcos.

Para ver los datos de procesamiento de marcos, registra un seguimiento utilizando la configuración Trace System Calls. Después de registrar el seguimiento, busca información sobre cada marco debajo de la sección FRAMES, como se muestra en la figura 11.

Figura 11: Se muestran en rojo los marcos que tardan más de 16 ms.