Winscope es una herramienta web que permite a los usuarios grabar, 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 los servicios del sistema pertinentes en un archivo de registro. Con la IU de Winscope y 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, a través de la repetición, el avance y la depuración de las transiciones.
Seguimientos admitidos
Winscope permite recopilar y representar visualmente varios seguimientos o secuencias de estados de los servicios del sistema. Puedes configurar estos seguimientos para que se adapten a casos de uso específicos, que van desde una sobrecarga baja hasta una verbosidad alta. 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: Genera un seguimiento de eventos de la canalización del editor de método de entrada (IME), incluidos IMS, IMMS y el cliente de IME.
- Entrada: Realiza un seguimiento de los eventos de entrada desde varias partes de la canalización de eventos de entrada.
- ProtoLog: Recopila mensajes de ProtoLog de los servicios del sistema y el código de los servicios del sistema que se ejecutan en los procesos del cliente.
- Grabación de pantalla: Recopila una grabación de pantalla junto con los seguimientos.
- Transiciones de shell: Registra los detalles del sistema de transición de ventanas y actividades.
- SurfaceFlinger: Recopila registros de SurfaceFlinger que contienen información sobre las superficies (capas), como la posición, el búfer y la composición.
- Transacciones: Genera un seguimiento del conjunto de cambios atómicos que recibe SurfaceFlinger con
SurfaceControl
para la composición. - ViewCapture: Captura un rango de propiedades de todas las vistas de Windows del sistema que admiten ViewCapture, como la IU del sistema y el selector.
- Administrador de ventanas: Registra los estados del Administrador de ventanas que contienen detalles relacionados con las ventanas, incluidos los eventos de entrada y enfoque, la orientación de la pantalla, las transiciones, las animaciones, el posicionamiento y las transformaciones.
Volcados compatibles
Winscope puede recopilar y mostrar volcados de estado, que son instantáneas del estado del dispositivo tomadas en momentos específicos definidos por el usuario. A diferencia de los registros, que se recopilan de forma continua durante el uso del dispositivo y pueden afectar el rendimiento, los volcados se toman solo en estos momentos definidos por el usuario, lo que garantiza que no se vean comprometidos el rendimiento ni la verbosidad. Esto permite un análisis más enfocado y eficiente del estado del dispositivo en momentos específicos. Winscope admite los siguientes volcados:
- Administrador de ventanas: Genera un volcado de un solo estado del administrador de ventanas.
- SurfaceFlinger: Genera un volcado de una sola instantánea de SurfaceFlinger.
- Captura de pantalla: 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 registros para obtener información sobre cómo cargar registros con la IU web de Winscope.
Consulta Cómo analizar seguimientos para obtener información sobre el tema.
Ejemplos
En el siguiente ejemplo, se describe cómo depurar una prueba de parpadeo fallida y un error informado por el usuario.
Error en la prueba de parpadeo
En este ejemplo, se muestra cómo usar Winscope para depurar una prueba de parpadeo fallida.
Examina la falla de la prueba
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.
Nombre de la prueba y de la clase:
FlickerTestsNotification com.android.server.wm.flicker.notification.OpenAppFromLockscreenNotificationColdTest#appLayerBecomesVisible[ROTATION_0_GESTURAL_NAV]
Tipo de problema:
El CUJ hace referencia al inicio de una app desde una notificación de la pantalla de bloqueo (
OpenAppFromLockscreenNotificationColdTest
).La prueba espera que la app se haga visible (
#appLayerBecomesVisible
).
Examina el mensaje de falla de la prueba, que proporciona información exhaustiva sobre la falla, incluido lo siguiente:
- Una comparación entre el resultado esperado y el resultado visible real
- Marcas de tiempo para ayudar a determinar cuándo ocurrió la falla
- Es el nombre del artefacto o archivo asociado con la falla.
- Información contextual adicional relevante 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)
Este ejemplo de salida indica lo siguiente:
El problema ocurre en
2024-05-10T11:04:14.227572545
.Se espera que
NotificationActivity
sea visible, pero no lo es.El nombre del archivo del artefacto que contiene los seguimientos para la depuración es
FAIL__OpenAppFromLockscreenNotificationColdTest_ROTATION_0_GESTURAL_NAV
.
Depuración
Sigue estos pasos para determinar la causa del parpadeo:
Descarga los archivos de registro y cárgalos en Winscope. Winscope se abre con SurfaceFlinger seleccionado automáticamente:
Figura 1: Página de destino de Winscope con vista de SurfaceFlinger.
Para navegar a la marca de tiempo en la que se produce 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 la flecha hacia la izquierda para navegar al fotograma anterior. En este estado, la app de NotificationActivity se muestra correctamente en el video, y se pueden ver las superficies de la app y la pantalla de presentación, como se indica por sus rectángulos verdes en la vista en 3D y el chip V en sus elementos de jerarquía.
Los nombres de la app y la superficie de 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#3453
Esto indica que la app se estaba iniciando cuando la pantalla se volvió negra y que este evento ocurre durante el inicio de la app, ya que la pantalla de presentación aún es visible:
Figura 3: Al inicio de la app.
Presiona la tecla de flecha hacia la derecha para volver al siguiente fotograma, donde se produce el parpadeo. En la vista de rectángulos, el
NotificationShade
se muestra en la pantalla, en lugar de la app. En este marco, se muestran las siguientes plataformas:- Superposiciones de decoración de la 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 la opción Show only V. Luego, inspecciona la vista de propiedades.
El nombre de la plataforma 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 frente a ella durante la composición. Esta hipótesis se debe a que el rectánguloNotificationShade
está frente al rectánguloNotificationActivity
en la vista en 3D, y elNotificationShade
visible (verde) podría ser la capa elegida.Para validar esta hipótesis, selecciona la superficie
NotificationShade
visible en el fotograma actual y verifica sus propiedades. Las marcas se establecen enOPAQUE|ENABLE_BACKPRESSURE (0x102)
. El nombre de la superficieNotificationShade
esNotificationShade#3447
. Luego, 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 queNotificationShade
se vuelve opaco antes de que se complete el inicio de la app. ComoNotificationShade
está delante deNotificationActivity
, la app no se muestra. ElNotificationShade
es negro, por lo que la pantalla se oscurece brevemente, lo que provoca el parpadeo.Identifica en el código por qué el
NotificationShade
se vuelve opaco demasiado pronto.
Error informado por el usuario
Los errores informados por los usuarios pueden ser difíciles de depurar porque a menudo carecen de información detallada. A diferencia de las fallas de la prueba de parpadeo, que proporcionan marcas de tiempo específicas, detalles de los elementos y grabaciones de pantalla, los errores informados por los usuarios suelen incluir solo una breve descripción del problema.
En nuestro caso de éxito, la única información proporcionada es el título La pantalla parpadeó cuando se volvió a abrir la app desde la pantalla dividida y una marca de tiempo aproximada de 18 de abril de 2024, 3:51 p.m. GMT-04:00.
Sigue estos pasos para depurar un error informado por el usuario:
Carga el archivo de registro en Winscope. Winscope se abre con SurfaceFlinger seleccionado automáticamente.
Figura 6: Página de destino de Winscope con vista de SurfaceFlinger.
Para navegar a la marca de tiempo aproximada que informó el usuario, en este caso
3:50 PM GMT-04:00
, ingresa15:50:00
en el campo de marca de tiempo legible por humanos.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 visualización, 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 mostrarán el fondo de pantalla, la superposición de decoración de pantalla, el formato letterbox, el selector, los contactos y las plataformas del dialer.
Los nombres de los paquetes son los siguientes:
Iniciador:
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 Pantalla desconocida. Para mejorar la visibilidad, haz clic en el (
) junto a la superficie
ScreenDecorHwcOverlay#64
para ocultar su rectángulo correspondiente y revelar las superficies que se encuentran detrás. Quitamos la superposición para el análisis porque el usuario no la ve y no se informará como una animación parpadeante.Figura 8: Informe de usuarios.
Después de identificar qué plataformas participan en la vista de pantalla dividida, usa el seguimiento de transiciones para revisar 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 que se reproduce 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 ingresa a la pantalla Recientes.Haz clic en el vínculo de la columna Dispatch Time (en este caso,
2024-04-18, 15:50:57.205
) para navegar 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, avanza a través de 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 es 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 es visible y se muestra el divisor, que es la forma en que se ve 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 el cronograma. 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: Final de la primera transición.
Haz clic en la fila SurfaceFlinger en la posición de inicio de la siguiente transición. En la figura 11, la línea azul delgada indica la posición vertical del cursor. El fondo azul claro de la fila de SurfaceFlinger muestra su posición horizontal. Explora la transición con la tecla de flecha hacia la derecha para ver si se produce un parpadeo. Confirma que el dispositivo se vea correcto para esta transición.
Omite la siguiente transición, ya que su duración es muy pequeña, 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 de inicio de la siguiente transición más larga, como lo indica el cursor en la siguiente imagen.
Figura 12: Final de la segunda transición.
Durante esta transición, en
15:51:13.239
, observa que las capasSplash Screen
de ambas apps, los contactos y el dialer, 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 favorito a tu posición actual, haz clic en el ícono de bandera junto al campo de entrada ns, para volver a este marco más adelante.
Figura 14: Agregar a favoritos.
Para navegar 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 ahora están en su posición final, con el dialer a la izquierda y los contactos a la derecha:Figura 15: Pantalla dividida final.
Haz clic en la marca del favorito en la línea de tiempo para volver al fotograma con el parpadeo.
Figura 16: Línea de tiempo de favoritos.
Ambas apps están a la derecha, lo que indica que el selector de llamadas está en la posición incorrecta.
Haz clic en la pantalla de presentación del selector para ver sus propiedades. Observa sus propiedades de transformación de forma específica en la vista Propiedades seleccionada.
Figura 17: Transforma propiedades.
La transformación calculada se aplica a esta superficie, pero no se establece como 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 Flat en la vista de jerarquía para mostrar todo el árbol de jerarquía y navega a los nodos superiores de la plataforma de la app hasta que las transformaciones Calculated y Requested sean iguales, lo que mostrará la transformación que se solicita en la plataforma
Surface(name=Task=7934)/@0x1941191_transition-leash#40670
.Confirma cuándo se estableció la transformación por primera vez y a qué valor. Para contraer las propiedades seleccionadas, haz clic en el ícono junto al título:
Figura 18: Contrae las propiedades seleccionadas.
Selecciona Show diff en la vista Proto Dump para destacar las propiedades que se están cambiando en este marco. Escribe
transform
en el campo de búsqueda de texto para filtrar las propiedades:Figura 19: Mostrar diferencia.
La transformación se establece de
IDENTITY
aSCALE|TRANSLATE|ROT_270
en este marco para eltransition-leash
.Esta información muestra que el parpadeo se produjo cuando se aplicó la transformación al control de animación de la app de pantalla dividida del dialer.
Figura 20: Identificación del parpadeo
Identifica en el código por qué esta transformación se establece en el control de transición de pantalla dividida.