Realizar un seguimiento de las transiciones de ventanas con Winscope

Winscope es una herramienta web que permite a los usuarios grabar, volver a reproducir y analizar los estados de varios servicios del sistema durante y después de las animaciones y transiciones. Winscope registra todos los estados de servicio del sistema pertinentes en un archivo de registro. Cuando usas la IU de Winscope con el archivo de registro, puedes inspeccionar el estado de estos servicios para cada fotograma de animación, con o sin una grabación de pantalla, mediante la repetición, el paso y la depuración a través de las transiciones.

Los servicios del sistema que producen registros que se pueden cargar en Winscope son los siguientes:

  • SurfaceFlinger;
  • WindowManager
  • WMShell
  • IME
  • Selector

Ejecuta el lector de seguimiento de Winscope

El seguimiento de WinScope forma parte de los servicios de la plataforma. En esta sección, se describen los pasos necesarios para descargar, compilar y ejecutar el visor de seguimiento de Winscope.

Sigue estos pasos para configurar tu PC para ejecutar el generador de registros de Winscope:

  1. Descarga el código fuente de Android.
  2. Navega a la carpeta Winscope:

    cd development/tools/winscope
    
  3. Instala las dependencias con el siguiente comando:

    npm install
    

    Para ver una lista de los comandos disponibles, ejecuta lo siguiente: npm run

  4. Compila todos los destinos de producción y de prueba con lo siguiente:

    npm run build:prod
    
  5. Ejecuta Winscope usando lo siguiente:

    npm run start
    

Cómo capturar registros

Puedes capturar registros en el dispositivo, con Winscope o con los comandos de Android Debug Bridge (adb).

Cómo capturar registros en el dispositivo

Captura seguimientos en el dispositivo para recopilar datos cuando envíes errores por problemas de animación. Todos los seguimientos de la IU se registran con este método, ya que no se puede personalizar la configuración.

En el dispositivo Android:

  1. Habilita las opciones para desarrolladores.
  2. Selecciona Registro del sistema en Opciones para desarrolladores.
  3. Habilita la opción Recopilar registros de Winscope.
  4. En Miscellaneous, haz lo siguiente:
    1. Habilita Adjuntar grabaciones a los informes de errores.
    2. Habilita la opción Mostrar la tarjeta de Configuración rápida.
  5. Navega al lugar donde necesitas reproducir el error.
  6. Para iniciar la captura, abre la Configuración rápida y selecciona la opción para registrar seguimiento:

    quick_setting_winscope

    Figura 1: Menú de configuración rápida con Registro de seguimiento

  7. Ejecuta solo los pasos necesarios para reproducir el error.

  8. Para detener la captura, abre la Configuración rápida y selecciona Detener seguimiento.

  9. Comparte el registro capturado con una de las opciones que se muestran, como Gmail, Drive o BetterBug.

Cómo capturar registros con Winscope

Puedes capturar registros con Winscope para el desarrollo y la depuración locales. Winscope usa adb, que admite la conexión de dispositivos a través de USB o Wi-Fi.

En Winscope:

  1. En la pantalla Collect Traces, haz clic en ADB Proxy:

    capturar_seguimientos_winscope

    Figura 2: Capturar registros en Winscope.

  2. Inicia el proxy de Winscope ADB Connect para capturar registros directamente desde tu navegador.

  3. Ejecuta el siguiente comando:

    python3 $ANDROID_BUILD_TOP/development/tools/winscope/src/adb/winscope_proxy.py
    
  4. Para iniciar la captura, en la pantalla Collect Traces, selecciona los destinos y la configuración, y haz clic en Start trace:

    recopilar_seguimientos_winscope

    Figura 3: Recopila registros en Winscope.

  5. Para detener la captura, haz clic en Finalizar seguimiento:

    fin_seguimiento_winscope

    Figura 4: Finaliza el seguimiento en Winscope.

A medida que la herramienta sube los seguimientos a la IU de Winscope, aparecen en la pantalla los mensajes Fetching y Parsing Proto Files.

Genera el volcado de estado con Winscope

Para realizar un volcado de estado con Winscope, en la pantalla Recopilar seguimientos, selecciona la pestaña Dump y, luego, haz clic en Dump state:

volcado-winscope

Figura 5: Estado de volcado en Winscope.

Cómo capturar registros con comandos adb

Ejecuta adb root antes de ejecutar los comandos adb shell para cada uno de los siguientes seguimientos. Al final del seguimiento, los archivos de registro estarán disponibles en /data/misc/wmtrace. Para copiar un archivo o directorio y sus subdirectorios desde un dispositivo, consulta Cómo copiar archivos desde y hacia un dispositivo. Consulta adb para obtener más información.

Seguimientos de WindowManager

Para capturar registros de WindowManager, haz lo siguiente:

  • Habilita el seguimiento:

    adb shell wm tracing start
    
  • Inhabilita el seguimiento:

    adb shell wm tracing stop
    
  • Guarda los datos de registro en un archivo mientras ejecutas una captura de seguimiento:

    adb shell wm tracing save-for-bugreport
    
  • Registra el seguimiento una vez por fotograma:

    adb shell wm tracing frame
    
  • Registra cada transacción:

    adb shell wm tracing transaction
    
  • Establece el tamaño máximo del registro (en KB):

    adb shell wm tracing size
    
  • Imprimir el estado de seguimiento:

    adb shell wm tracing status
    
  • Establece el nivel de registro en critical (solo ventanas visibles con información reducida), trim (todas las ventanas con información reducida) o all (todas las ventanas y la información):

    adb shell wm tracing level
    

ProtoLog

Los siguientes comandos se usan para el sistema ProtoLog.

En el proceso system_server:

  • Inicia ProtoLog:

    adb shell cmd window logging start
    
  • Detener ProtoLog:

    adb shell cmd window logging stop
    
  • Habilita ProtoLog para grupos de registro determinados:

    adb shell cmd window logging enable [group...]
    
  • Inhabilita ProtoLog para grupos de registros determinados:

    adb shell cmd window logging disable [group...]
    
  • Habilita el registro de Logcat para grupos de registros determinados:

    adb shell cmd window logging enable-text [group...]
    
  • Inhabilita el registro de Logcat para determinados grupos de registros:

    adb shell cmd window logging disable-text [group...]
    

En WMShell:

  • Inicia ProtoLog:

    adb shell dumpsys activity service SystemUIService WMShell
    

Seguimiento de la transición

Los siguientes comandos se usan para el seguimiento de transiciones:

En el proceso system_server:

  • Inicia un registro:

    adb shell cmd window shell tracing start
    
  • Sigue estos pasos para detener un seguimiento:

    adb shell cmd window shell tracing stop
    
  • Inicia un registro en WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
    
  • Detén un seguimiento en WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
    

Editor de método de entrada

Los siguientes comandos se usan para el seguimiento del Editor de método de entrada (IME):

  • Inicia el seguimiento de IME para los clientes de método de entrada (IM), el servicio de método de entrada (IMS) y el servicio de administración de métodos de entrada (IMMS):

    adb shell ime tracing start
    
  • Iniciar seguimiento de clientes IME, IMS e IMMS:

    adb shell ime tracing stop
    

Capas de SurfaceFlinger

El registro de capas de SurfaceFlinger usa el registro de Perfetto para la captura. Consulta Configuración de seguimiento para obtener información sobre la configuración.

Consulta el siguiente ejemplo de una configuración para el seguimiento de la capa de SurfaceFlinger:

unique_session_name: "surfaceflinger_layers_active"
buffers: {
    size_kb: 63488
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.layers"
        surfaceflinger_layers_config: {
            mode: MODE_ACTIVE
            trace_flags: TRACE_FLAG_INPUT
            trace_flags: TRACE_FLAG_COMPOSITION
            trace_flags: TRACE_FLAG_HWC
            trace_flags: TRACE_FLAG_BUFFERS
            trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
        }
    }
}

Consulta el siguiente comando de ejemplo para generar un registro de las capas de SurfaceFlinger:

adb shell -t perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Transacciones de SurfaceFlinger

El registro de transacciones de SurfaceFlinger usa el registro de Perfetto para la captura. Consulta Configuración de Trace para obtener información sobre la configuración.

Consulta el siguiente ejemplo de una configuración de Perfetto para el seguimiento activo de SurfaceFlinger:

unique_session_name: "surfaceflinger_transactions_active"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_ACTIVE
        }
    }
}
write_into_file: true
file_write_period_ms: 100

Consulta el siguiente ejemplo de una configuración de Perfetto para el seguimiento continuo de SurfaceFlinger:

unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
    size_kb: 1024
    fill_policy: RING_BUFFER
}
data_sources: {
    config {
        name: "android.surfaceflinger.transactions"
        surfaceflinger_transactions_config: {
            mode: MODE_CONTINUOUS
        }
    }
}

Consulta el siguiente comando de ejemplo para generar un registro de transacciones de SurfaceFlinger:

    adb shell perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Genera un volcado de estado con adb

Winscope lee una instantánea de los estados de WindowManager y SurfaceFlinger de los informes de errores. Los informes de errores almacenan los estados como archivos proto separados dentro de la carpeta proto. Para generar volcados de estado con adb, ejecuta los siguientes comandos:

Para WindowManager:

adb exec-out dumpsys window --proto > window_dump.winscope

Para SurfaceFlinger:

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

Cómo analizar seguimientos

Para depurar estados transitorios y no válidos que causan problemas de animación, Winscope agrega diferentes archivos de registro, proporciona búsqueda y visualización en fotogramas y cronogramas, y presenta mensajes protobuf de manera coherente. El análisis de los seguimientos en Winscope ayuda a identificar la capa, el fotograma y el estado exactos del error.

Usa Winscope

Una vez que hayas capturado seguimientos, analízalos en Winscope:

  1. Sube los seguimientos guardados con el panel de la derecha. Puedes quitar los seguimientos subidos o subir más seguimientos.

    subir_seguimientos_winscope

    Figura 6: Sube registros en Winscope.

  2. Haz clic en Ver seguimientos para visualizar los seguimientos subidos. Las pestañas de cada registro aparecen en el panel superior de la ventana. Si el archivo subido contiene los seguimientos relevantes, se superpone una vista flotante del seguimiento de la grabación de pantalla en la pantalla.

    ver_seguimientos_winscope

    Figura 7: Visualiza seguimientos en Winscope.

    Usa la IU del panel superior de la ventana para cambiar el nombre de editar_nombre y descargar el seguimiento descargar_seguimiento que subiste, o bien subir uno nuevo.

  3. Navega por los seguimientos a lo largo del tiempo con la herramienta de control deslizante de tiempo en el panel inferior de la ventana. Para navegar por el tiempo adicional, usa las siguientes funciones, como se muestra en la Figura 8:

    • Para navegar a un momento o evento en particular, usa el cursor (control deslizante de tiempo), las flechas hacia la izquierda flecha_izquierda_tiempo y hacia la derecha arrow_right_time en el cuadro de visualización de la hora (esquina inferior izquierda) o las flechas hacia la izquierda y la derecha del teclado.
    • Para mostrar los seguimientos codificados por color seleccionados en el cronograma, usa el menú desplegable (a la izquierda del deslizador de tiempo). De forma predeterminada, los tres últimos seguimientos vistos con las pestañas de seguimiento se muestran en el cronograma.
    • Para obtener una vista detallada de todos los seguimientos subidos, usa las herramientas para acercar tiempo_zoom o alejar tiempo_zoom (debajo del control deslizante de tiempo), o bien desplázate por el teclado. Usa el botón de restablecimiento para restablecer el nivel de zoom.
    • Para obtener una vista expandida de la distribución de seguimientos a lo largo del tiempo, haz clic en la flecha hacia arriba arrow_up_time (esquina inferior derecha).

    time_nav_winscope

    Figura 8: Navegación del tiempo en Winscope.

    En la vista expandida (Figura 9), selecciona y acerca intervalos de tiempo específicos para una mejor inspección:

    expand_time_winscope

    Figura 9: Cronograma ampliado en Winscope.

  4. Para examinar los seguimientos, puedes ver el estado del dispositivo con la grabación de pantalla. Para examinar un seguimiento en particular, haz clic en la pestaña de seguimiento relevante en el panel superior de la herramienta.

    • En el seguimiento de Surface Flinger, tres paneles muestran diferentes vistas del seguimiento en un período determinado, como se muestra en la Figura 10: seguimiento_sf

      Figura 10: Seguimiento de Surface Flinger en Winscope.

      • Vista Capas: Es una vista 3D de las capas en superposiciones rectangulares. Los siguientes elementos de la IU ajustan los rectángulos para renderizar los elementos gráficos según su posición, tamaño, transformación y orden z:

        • El control deslizante Rotación (en la parte superior izquierda de la vista Capas) rota los rectángulos con capas para verlos en los ángulos elegidos.
        • El control deslizante Spacing (en la parte superior derecha de la vista Layers) ajusta el espaciado entre las capas para crear la vista compuesta elegida.
        • Las herramientas de zoom (en la parte superior derecha de la vista Capas) acercan tiempo_zoom y alejan zoom_out_time las capas para una mejor inspección.
        • El botón de restablecimiento restablecer_sf (parte superior derecha de la vista Capas) restablece la configuración de la cámara a la vista original.
        • Arrastra los rectángulos para facilitar el zoom.
      • Vista Hierarchy: Es una jerarquía completa de las capas.

        • Solo visible (parte superior derecha de la vista de jerarquía); cuando se selecciona, oculta las capas invisibles de la jerarquía para ayudar a visualizar los elementos en la pantalla.
        • Flat (parte superior derecha de la vista de jerarquía), cuando se selecciona, muestra la jerarquía como una lista acoplada de capas.
        • Mostrar diferencias (en la parte superior izquierda de la vista de jerarquía) solo se selecciona cuando hay una transición de estado. Cuando se selecciona, la herramienta compara el estado actual con el anterior. Un elemento nuevo se destaca en verde, un elemento borrado se destaca en rojo y un elemento modificado se destaca en azul.
      • Vista Properties: Son las propiedades de la capa seleccionada. El panel superior de la vista Properties contiene información solo sobre propiedades clave, como Visibility, Geometry y Buffer. El panel inferior de la vista Properties contiene un volcado de protos de todas las propiedades.

        • La casilla de verificación Show Diff (en la parte superior izquierda de la vista Properties) se comporta como en la vista Hierarchy.
        • La opción Show default (esquina superior izquierda de la vista Properties), cuando se selecciona, muestra los valores proto predeterminados en el volcado de Proto. De forma predeterminada, estos valores no se incluyen en el volcado de Proto. Los valores de proto predeterminados se toman de la definición del campo de proto. Si un campo proto no tiene configurado un valor predeterminado no nulo, los valores proto predeterminados que se muestran son los siguientes:
          • Cadenas: Nulo
          • Números: 0
          • Valores booleanos: falso
          • Objetos: nulos

      La selección entre las tres vistas y la grabación de pantalla está sincronizada, es decir, todos los registros se actualizan de forma síncrona cuando navegas a un momento diferente. Para ver las propiedades de una capa, selecciónala haciendo clic en ella en la vista de jerarquía o en el rectángulo correspondiente en la vista de propiedades. Un rectángulo morado indica que un seguimiento de vista está adjunto a esta capa. Cuando se hace doble clic en una capa púrpura, la IU navega para cambiar a la pestaña de seguimiento de vista relevante.

    • En el seguimiento de Window Manager, tres paneles muestran diferentes vistas del seguimiento en un período determinado, como se muestra en la Figura 11:

      • Vista Windows: Es una vista 3D de las capas.
      • Vista Hierarchy: Es una jerarquía completa de las capas.
      • La vista Properties contiene un Volcado de Proto de todas las propiedades.

      La selección entre las tres vistas y la grabación de pantalla está sincronizada, es decir, todos los registros se actualizan de forma síncrona cuando navegas a un momento diferente.

      wm_trace

      Figura 11: Registro del administrador de ventanas en Winscope.

    • En el caso de los seguimientos de transacciones, las transacciones entre Surface Flinger y Window Manager se presentan en formato de tabla, en el que se pueden buscar los ID, el tipo y el texto que se muestran, junto con una vista de propiedades que muestra el volcado de proto. La selección entre las dos vistas y la grabación de pantalla está sincronizada:

      transaction_trace

      Figura 12: Seguimiento de transacciones en Winscope

    • En el caso de los seguimientos de ProtoLog, la información se presenta en formato de tabla, que se puede buscar por etiquetas, archivos de origen y texto:

      seguimiento_de_protolog

      Figura 13: Registro de ProtoLog en Winscope.

    • En el caso de los seguimientos de transiciones, se muestra una lista de transiciones con el ID, el tipo, la hora de envío, la duración y el estado, junto con las propiedades de la transición seleccionada:

      transitions_trace

      Figura 14: Registro de transiciones en Winscope.