Los volcados de WindowManager proporcionan una instantánea de WindowManager en un momento específico. El registro de WindowManager incluye una secuencia cronológica de estados que proporcionan información valiosa sobre por qué aparece una ventana en la pantalla, su configuración o la de su actividad, tarea, pantalla o cualquier otro elemento de la jerarquía de WindowManager. Esta información es útil para solucionar problemas como ¿Por qué no se ve mi app? o Experimenté parpadeos al cambiar de app.
El visualizador de WindowManager de Winscope muestra esta información para los registros y los volcados.
Consulta WindowManager para obtener más información sobre la recopilación de registros.
Figura 1: Análisis de registros de WindowManager
En el lado izquierdo de la pantalla, se muestra una vista en 3D de las ventanas. La vista de rectángulos tiene en cuenta los límites de la ventana, el orden Z y la opacidad.
El segmento central de la pestaña muestra la jerarquía de ventanas. Además de las relaciones entre ventanas, actividades y tareas, esta vista también incluye la siguiente información:
- V: Identifica las ventanas visibles.
En el lado derecho de la pantalla, se muestra un volcado de proto de todas las propiedades disponibles. Para obtener más información sobre las funciones de la sección de volcado de .proto, consulta Propiedades.
Traducción de @IntDef
La traducción de @IntDef
es una propiedad clave del panel de propiedades de WindowManager.
@IntDef
denota que el elemento anotado de tipo entero representa un tipo lógico y que su valor debe ser una de las constantes con nombre explícito.
@IntDef
se usa dentro de la base de código de Android en lugar de enumeraciones para mitigar el impacto en la memoria y el rendimiento.
A continuación, se muestra un ejemplo del uso de @IntDef:
/**
* The modes to control how root task is moved to the front when calling {@link Task#reparent}.
*/
@Retention(RetentionPolicy.SOURCE)
@IntDef({
REPARENT_MOVE_ROOT_TASK_TO_FRONT,
REPARENT_KEEP_ROOT_TASK_AT_FRONT,
REPARENT_LEAVE_ROOT_TASK_IN_PLACE
})
@interface ReparentMoveRootTaskMode {}
// Moves the root task to the front if it was not at the front
static final int REPARENT_MOVE_ROOT_TASK_TO_FRONT = 0;
// Only moves the root task to the front if it was focused or frontmost already
static final int REPARENT_KEEP_ROOT_TASK_AT_FRONT = 1;
// Do not move the root task as a part of reparenting
static final int REPARENT_LEAVE_ROOT_TASK_IN_PLACE = 2;
Las marcas se almacenan como números enteros, en lugar de usar valores legibles, que pueden ser difíciles de interpretar. Winscope traduce estas marcas en valores legibles con definiciones de @IntDef
.
Durante las compilaciones, Winscope recopila un diccionario de valores de @IntDef
y usa esta lista para decodificar instancias de @IntDef
en un formato legible por humanos en el tiempo de ejecución. Por ejemplo, una actividad con activityType
de 2
se traduce en activityType
de ACTIVITY_TYPE_HOME
. Del mismo modo, una ventana con flags=2173763840
se traduce en Winscope de la siguiente manera:
flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED |
FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR |
FLAG_LAYOUT_IN_SCREEN
Si Winscope no traduce correctamente una instancia de @IntDef
, sigue los pasos que se indican en Actualiza la asignación de @IntDef para actualizar la lista de instancias de @IntDef
que conoce Winscope.