WindowManager

Zrzuty WindowManager zawierają migawkę menedżera okien w określonym czasie. Ślady WindowManager zawierają chronologiczną sekwencję stanów, które dostarczają cennych informacji o tym, dlaczego okno pojawia się na ekranie, o jego konfiguracji lub konfiguracji jego aktywności, zadania, wyświetlacza lub dowolnego innego elementu w hierarchii WindowManager. Te informacje są przydatne podczas rozwiązywania problemów, np. dlaczego moja aplikacja nie jest widoczna lub podczas przełączania się między aplikacjami występuje migotanie.

Przeglądarka WindowManager w Winscope wyświetla te informacje zarówno w przypadku śladów, jak i zrzutów.

Więcej informacji o zbieraniu śladów znajdziesz w artykule WindowManager.

windowmanager

Rysunek 1. Analiza śladu WindowManager.

Po lewej stronie ekranu znajduje się widok 3D okien. Widok prostokątów uwzględnia granice okna, kolejność Z i przezroczystość.

Środkowa część karty pokazuje hierarchię okien. Oprócz relacji między oknami, aktywnościami i zadaniami (rodzic–dziecko) ten widok zawiera też te informacje:

  • V: identyfikuje widoczne okna.

Po prawej stronie ekranu znajduje się zrzut protokołu wszystkich dostępnych właściwości. Więcej informacji o funkcjach sekcji zrzutu protokołu znajdziesz w artykule Właściwości.

@IntDef translation

@IntDef to kluczowa właściwość panelu właściwości WindowManager. @IntDef oznacza, że element z adnotacjami typu integer reprezentuje typ logiczny, a jego wartość musi być jedną z jawnie nazwanych stałych. @IntDef jest używany w kodzie Androida zamiast wyliczeń, aby zmniejszyć wpływ na pamięć i wydajność.

Oto przykład użycia adnotacji @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;

Flagi są przechowywane jako liczby całkowite, a nie w postaci wartości zrozumiałych dla człowieka, które mogą być trudne do interpretacji. Winscope tłumaczy te flagi na czytelne dla człowieka wartości za pomocą @IntDefdefinicji. Podczas kompilacji Winscope zbiera słownik wartości @IntDef i używa tej listy do dekodowania instancji @IntDef do formatu czytelnego dla człowieka w czasie działania. Na przykład aktywność z wartością activityType równą 2 jest tłumaczona na activityType równą ACTIVITY_TYPE_HOME. Podobnie okno z symbolemflags=2173763840 jest tłumaczone w Winscope jako:

flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED | FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR | FLAG_LAYOUT_IN_SCREEN

Jeśli Winscope nie przetłumaczy prawidłowo instancji @IntDef, wykonaj czynności opisane w sekcji Aktualizowanie mapowania @IntDef, aby zaktualizować listę instancji @IntDef znanych Winscope.