Winscope es una herramienta web que te permite grabar, reproducir y analizar los estados de varios servicios del sistema durante las animaciones y transiciones, y después de ellas. Winscope registra todos los estados pertinentes de los servicios del sistema en un archivo de seguimiento. Con la IU de Winscope y el archivo de seguimiento, puedes inspeccionar el estado de estos servicios para cada fotograma de animación, con o sin una grabación de pantalla, reproduciendo, recorriendo y depurando las transiciones.
Seguimientos admitidos
Winscope proporciona la capacidad de recopilar y representar visualmente varios seguimientos, es decir, secuencias de estados de servicios del sistema. Puedes configurar estos seguimientos para que se adapten a casos de uso específicos, desde una sobrecarga baja hasta una gran cantidad de detalles. Winscope admite los siguientes seguimientos:
- EventLog: Recopila el registro de eventos de diagnóstico del sistema con
EventLog. En Winscope, esta información solo se usa para identificar y mostrar las marcas de CUJ. - IME: Realiza un seguimiento de los eventos de la canalización del editor de método de entrada (IME), incluidos IMS, IMMS y el cliente de IME.
- Input: Realiza un seguimiento de los eventos de entrada de varias partes de la canalización de eventos de entrada.
- ProtoLog: Recopila ProtoLog mensajes de los servicios del sistema y el código de los servicios del sistema que se ejecutan en los procesos del cliente.
- Screen recording: Recopila una grabación de pantalla junto con los seguimientos.
- Shell transitions: Registra los detalles del sistema de transición de ventanas y actividades.
- SurfaceFlinger: Recopila seguimientos de SurfaceFlinger que contienen información sobre las superficies (capas), como la posición, el búfer y la composición.
- Transacciones: Realiza un seguimiento del conjunto de cambios atómicos que recibe SurfaceFlinger
con
SurfaceControlpara la composición. - ViewCapture: Captura un rango de propiedades de todas las vistas de las ventanas del sistema que admiten ViewCapture, como la IU del sistema y el selector.
- Window Manager: Realiza un seguimiento de los estados del administrador de ventanas que contienen detalles relacionados con las ventanas, incluidos los eventos de entrada y enfoque eventos, la orientación de la pantalla, las transiciones, las animaciones, el posicionamiento y las transformaciones.
Volcados admitidos
Winscope puede recopilar y mostrar volcados de estado, que son instantáneas del estado del dispositivo tomadas en momentos específicos definidos por ti. A diferencia de los seguimientos, que se recopilan de forma continua durante el uso del dispositivo y pueden afectar el rendimiento, los volcados solo se toman en estos momentos definidos por el usuario para verificar que el rendimiento y la cantidad de detalles no se vean afectados. Esto permite un análisis más enfocado y eficiente del estado del dispositivo en momentos específicos. Winscope admite los siguientes volcados:
- Window Manager: Vuelca un solo estado del administrador de ventanas.
- SurfaceFlinger: Vuelca una sola instantánea de SurfaceFlinger.
- Screenshot: Recopila una captura de pantalla junto con los volcados.
Recursos
Consulta Cómo ejecutar Winscope para obtener información sobre cómo compilar y ejecutar Winscope.
Consulta Cómo capturar seguimientos para obtener información sobre la recopilación de seguimientos.
Consulta Cómo cargar seguimientos para obtener información sobre cómo cargar seguimientos con la IU web de Winscope.
Consulta Cómo analizar seguimientos para obtener información sobre el análisis de seguimientos.
Ejemplos
En el siguiente ejemplo, se describe cómo depurar una prueba fallida de parpadeo y un error informado por el usuario.
Falla en la prueba de parpadeo
En este ejemplo, se muestra cómo usar Winscope para depurar una prueba fallida de parpadeo.
Examina la prueba fallida
Sigue estos pasos para determinar el tipo de problema y examinar el mensaje de prueba fallida.
Para determinar el tipo de problema, examina la prueba y el nombre de la clase.
Prueba y nombre de la clase:
FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]Tipo de problema:
- El CUJ se refiere a iniciar una app desde una notificación de pantalla de bloqueo (
OpenAppFromLockscreenNotificationColdTest). - La prueba espera que la app se haga visible (
#appLayerBecomesVisible).
- El CUJ se refiere a iniciar una app desde una notificación de pantalla de bloqueo (
Examina el mensaje de falla de la prueba, que proporciona información completa sobre la falla, incluidos los siguientes elementos:
- Una comparación entre el resultado esperado y el resultado visible real
- Marcas de tiempo para ayudar a identificar cuándo ocurrió la falla
- El nombre del artefacto o archivo asociado con la falla
- Información contextual adicional pertinente para comprender y depurar la falla
android.tools.flicker.subject.exceptions.IncorrectVisibilityException: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# should be visible Where? Timestamp(UNIX=2024-05-10T11:04:14.227572545(1715339054227572545ns), UPTIME=37m21s184ms79178ns(2241184079178ns), ELAPSED=0ns) What? Expected: com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity# Actual: [e636ecd com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3457: Buffer is empty, Visible region calculated by Composition Engine is empty, com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458: Visible region calculated by Composition Engine is empty] Other information Artifact: FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.zip Check the test run artifacts for trace files at android.tools.flicker.subject.layers.LayerTraceEntrySubject.isVisible(LayerTraceEntrySubject.kt:187) at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:151) at android.tools.flicker.subject.layers.LayersTraceSubject$isVisible$1$1.invoke(LayersTraceSubject.kt:150) at android.tools.flicker.assertions.NamedAssertion.invoke(NamedAssertion.kt:32) at android.tools.flicker.assertions.CompoundAssertion.invoke(CompoundAssertion.kt:42) at android.tools.flicker.assertions.AssertionsChecker.test(AssertionsChecker.kt:79) at android.tools.flicker.subject.FlickerTraceSubject.forAllEntries(FlickerTraceSubject.kt:59) at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:46) at android.tools.flicker.assertions.AssertionDataFactory$createTraceAssertion$closedAssertion$1.invoke(AssertionDataFactory.kt:43) at android.tools.flicker.assertions.AssertionDataImpl.checkAssertion(AssertionDataImpl.kt:33) at android.tools.flicker.assertions.ReaderAssertionRunner.doRunAssertion(ReaderAssertionRunner.kt:35) at android.tools.flicker.assertions.ReaderAssertionRunner.runAssertion(ReaderAssertionRunner.kt:29) at android.tools.flicker.assertions.BaseAssertionRunner.runAssertion(BaseAssertionRunner.kt:36) at android.tools.flicker.legacy.LegacyFlickerTest.doProcess(LegacyFlickerTest.kt:59) at android.tools.flicker.assertions.BaseFlickerTest.assertLayers(BaseFlickerTest.kt:89) at com.android.server.wm.flicker.notification.OpenAppTransition.appLayerBecomesVisible_coldStart(OpenAppTransition.kt:51) at com.android.server.wm.flicker.notification.OpenAppFromNotificationColdTest.appLayerBecomesVisible(OpenAppFromNotificationColdTest.kt:64)En este ejemplo de resultado, se indica lo siguiente:
- El problema ocurre en
2024-05-10T11:04:14.227572545. - Se espera que
NotificationActivitysea visible, pero no lo es. - El nombre del archivo de artefacto que contiene los seguimientos para la depuración es
FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV.
Depurar
Sigue estos pasos para determinar la causa del parpadeo:
Descarga los archivos de seguimiento y cárgalos en Winscope. Winscope se abre con SurfaceFlinger seleccionado automáticamente:
Figura 1: Página de destino de Winscope con la vista de SurfaceFlinger
Para ir a la marca de tiempo en la que ocurre el problema, copia y pega la marca de tiempo del mensaje de excepción en el campo de marca de tiempo. Puedes copiar la marca de tiempo en formato legible (
2024-05-10T11:04:14.227572545) y pegarla en el primer campo, o copiar la marca de tiempo en nanosegundos (1715339054227572545ns) y pegarla en el segundo campo.
Figura 2: Diálogo de marca de tiempo
Presiona la tecla de flecha hacia la izquierda para navegar al fotograma anterior. En este estado, la app NotificationActivity se muestra correctamente en el video, y las superficies de la app y la pantalla de presentación son visibles, lo que se indica con sus rectángulos verdes en la vista 3D y el chip V en sus elementos de jerarquía.
Los nombres de las superficies de la app y la pantalla de presentación son los siguientes:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458` Splash Screen com.android.server.wm.flicker.testapp#3453Esto indica que la app se estaba iniciando cuando la pantalla se puso negra y que este evento ocurre durante el inicio de la app, ya que la pantalla de presentación aún está visible:
Figura 3: En el inicio de la app
Presiona la tecla de flecha hacia la derecha para volver al siguiente fotograma, donde ocurre el parpadeo. En la vista de rectángulos, se muestra
NotificationShadeen la pantalla, en lugar de la app. En este fotograma, se muestran las siguientes superficies:- Superposiciones de decoración de pantalla (superior e inferior)
- Barra de navegación
- Ubicación del puntero (de la grabación de pantalla)
Figura 4: Actividad de parpadeo
Selecciona la actividad de la app en la vista de jerarquía. Si no la encuentras, desactiva Mostrar solo V. Luego, inspecciona la vista de propiedades.
El nombre de la superficie de la app es el siguiente:
com.android.server.wm.flicker.testapp/com.android.server.wm.flicker.testapp.NotificationActivity#3458`
Figura 5: Propiedades de la app
Aunque la actividad de la app está configurada como visible y opaca, la superficie no se muestra debido a un error
Invisible due to: null visible region. Esto ocurre porque se colocó otra superficie opaca delante de ella durante la composición. Esta hipótesis se basa en que el rectánguloNotificationShadeestá delante del rectánguloNotificationActivityen la vista 3D, y que elNotificationShadevisible (verde) podría ser la capa elegida.Para validar esta hipótesis, selecciona la superficie
NotificationShadevisible en el fotograma actual y verifica sus propiedades. Las marcas se configuran comoOPAQUE|ENABLE_BACKPRESSURE (0x102). El nombre de la superficieNotificationShadeesNotificationShade#3447. A continuación, presiona la flecha hacia la izquierda para volver al fotograma anterior (antes del parpadeo) y vuelve a inspeccionar las propiedades de la superficieNotificationShade. Observa que, en lugar de serOPAQUE, la superficie solo tiene la marcaENABLE_BACKPRESSURE (0x100). Esto confirma queNotificationShadese vuelve opaco antes de que finalice el inicio de la app. Dado queNotificationShadeestá delante deNotificationActivity, no se muestra la app.NotificationShadees negro, por lo que la pantalla se pone negra brevemente, lo que causa el parpadeo.Identifica en el código por qué
NotificationShadese vuelve opaco demasiado pronto.
Error informado por el usuario
Los errores informados por el usuario pueden ser difíciles de depurar porque, a menudo, carecen de información detallada. A diferencia de las fallas en las pruebas de parpadeo, que proporcionan marcas de tiempo específicas, detalles de elementos y grabaciones de pantalla, los errores informados por el usuario suelen incluir solo una breve descripción del problema.
En nuestro caso práctico, la única información proporcionada es el título Screen flickered when reopening app from split screen y una marca de tiempo aproximada de Apr 18, 2024 3:51 PM GMT-04:00.
Sigue estos pasos para depurar un error informado por el usuario:
Carga el archivo de seguimiento en Winscope. Winscope se abre con SurfaceFlinger seleccionado automáticamente.
Figura 6: Página de destino de Winscope con la vista de SurfaceFlinger
Para ir a la marca de tiempo aproximada informada por el usuario, en este caso
3:50 PM GMT-04:00, ingresa15:50:00en el campo de marca de tiempo legible.
Figura 7: Diálogo de marca de tiempo
Usa la vista de rectángulos para identificar lo que se dibujó en la pantalla. Para obtener una mejor vista, usa el control deslizante Rotación para cambiar la perspectiva de los rectángulos. Si marcas Mostrar solo V y Plano en la vista Jerarquía , se muestran el fondo de pantalla, la superposición de decoración de pantalla, el formato de pantalla ancha, el selector, los contactos y las superficies del marcador.
Los nombres de los paquetes son los siguientes:
- Selector:
com.google.android.apps.nexuslauncher/com.google.android.apps.nexuslauncher.NexusLauncherActivity#40602 - Contactos:
com.google.android.contacts/com.android.contacts.activities.PeopleActivity#40565 - Marcador:
com.google.android.dialer/com.google.android.dialer.extensions.GoogleDialtactsActivity#40564
Además de las superficies visibles (rectángulos verdes), se muestra un rectángulo gris, que representa la superficie del área de visualización, denominada Unknown display. Para mejorar la visibilidad, haz clic en el (
)
junto a la superficie ScreenDecorHwcOverlay#64para ocultar su rectángulo correspondiente y revelar las superficies que se encuentran detrás. Quitamos la superposición para el análisis porque no es visible para el usuario y no se informaría como una animación parpadeante.
Figura 8: Informe de usuarios
- Selector:
Después de identificar qué superficies están involucradas en la vista de pantalla dividida, usa el seguimiento de Transitions para recorrer varias acciones del usuario y encontrar el parpadeo. Haz clic en la pestaña Transitions en Winscope para visualizar la lista de transiciones reproducidas:
Figura 9: Transitions
La transición reproducida durante este fotograma se destaca en azul. En este caso, las marcas de transición incluyen
TRANSIT_FLAG_IS_RECENTS, que indica que el usuario está ingresando a la pantalla de elementos recientes.Haz clic en el vínculo de la columna Dispatch Time (en este caso
2024-04-18, 15:50:57.205) para ir a ese momento y verificar los rectángulos en la pestaña Surface Flinger. Para confirmar la exactitud del estado del dispositivo durante la transición, recorre la transición con la tecla de flecha hacia la derecha y observa los rectángulos.El selector aparece a las 15:50:57.278, pero la animación no comienza en ese momento. El fondo de pantalla ya está visible porque no se dibuja nada entre las apps de pantalla dividida (divisor). Un fotograma antes (15:50:57.212), el fondo de pantalla no está visible y se muestra el divisor, que es el aspecto de la pantalla dividida cuando no se anima.
Figura 10: Pantalla antes del evento de parpadeo
Para consultar la siguiente transición, haz clic directamente en la línea de tiempo. Los estados de SurfaceFlinger se representan con una fila de bloques azul claro. Las transiciones se representan con una fila de bloques rosas.
Figura 11: Fin de la primera transición
Haz clic en la fila de SurfaceFlinger en la posición inicial de la siguiente transición. En la figura 11, la posición vertical del cursor se indica con la línea azul delgada. El fondo azul claro de la fila de SurfaceFlinger muestra su posición horizontal. Recorre la transición con la tecla de flecha hacia la derecha para ver si se produce un parpadeo. Confirma que el dispositivo se vea correctamente para esta transición.
Omite la siguiente transición, ya que su duración es muy corta, por lo que es poco probable que contenga un parpadeo. En su lugar, haz clic en la línea de tiempo de la fila de SurfaceFlinger en la posición inicial de la siguiente transición más larga, como se indica con el cursor en la siguiente imagen.
Figura 12: Fin de la segunda transición
Durante esta transición, en
15:51:13.239, observa que las capas deSplash Screenpara ambas apps, los contactos y el marcador, están en el mismo lado de la pantalla:
Figura 13: Pantallas de presentación
Aclara qué app está en el lado incorrecto. Para agregar un marcador a tu posición actual, haz clic en el ícono de marca junto al campo de entrada ns para volver a este fotograma más tarde.
Figura 14: Agregar a favoritos
Para ir a un fotograma al final de la transición, haz clic directamente en la línea de tiempo, por ejemplo, en
15:51:13.859. Aquí, las dos apps están ahora en su posición final, con el marcador a la izquierda y los contactos a la derecha:
Figura 15: Pantalla dividida final
Haz clic en la marca del marcador en la línea de tiempo para volver al fotograma con el parpadeo.
Figura 16: Línea de tiempo de marcadores
Ambas apps están a la derecha, lo que indica que el marcador está en la posición incorrecta.
Haz clic en la pantalla de presentación del marcador para ver sus propiedades. Observa específicamente sus propiedades de transformación en la vista Propiedades seleccionada.
Figura 17: Propiedades de transformación
La transformación calculada se aplica a esta superficie, pero no se establece en este nivel. Las columnas calculadas y solicitadas tienen valores diferentes, lo que indica que la transformación se hereda de una superficie superior.
Anula la selección de Plano en la vista de jerarquía para mostrar todo el árbol de jerarquía y navega a los nodos superiores de la superficie de la app hasta que las transformaciones Calculadas y Solicitadas sean las mismas, lo que muestra la transformación solicitada en la superficie
Surface(name=Task=7934)/@0x1941191_transition-leash#40670.Confirma cuándo se estableció la transformación por primera vez y con qué valor. Para contraer las propiedades seleccionadas, haz clic en el ícono junto al título:
Figura 18: Contraer las propiedades seleccionadas
Selecciona Mostrar diferencia en la vista Volcado de Proto para destacar las propiedades que se están cambiando en este fotograma. Escribe
transformen el campo de búsqueda de texto para filtrar las propiedades:
Figura 19: Mostrar diferencia
La transformación se establece de
IDENTITYaSCALE|TRANSLATE|ROT_270en este fotograma paratransition-leash.Esta información muestra que el parpadeo ocurrió cuando se aplicó la transformación a la correa de animación de la app de pantalla dividida del marcador.
Figura 20: Identificación del parpadeo
Identifica en el código por qué esta transformación se establece en la correa de transición de pantalla dividida.