WindowManager

Pliki zrzutu stanu WindowManager stanowią migawkę stanu WindowManager w określonym momencie. Ścieżki 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 do rozwiązywania problemów, takich jak Dlaczego moja aplikacja jest niewidoczna lub Migotanie podczas przełączania się między aplikacjami.

Okno WindowManager w programie Winscope wyświetla te informacje zarówno w przypadku zrzutów pamięci, jak i wykresów.

Więcej informacji o zbieraniu danych dotyczących śledzenia znajdziesz w klasie 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ść.

Centralny segment karty pokazuje hierarchię okien. Oprócz relacji nadrzędna–podrzędna między oknami, aktywnościami i zadaniami ten widok zawiera też te informacje:

  • V: identyfikuje widoczne okna.

Po prawej stronie ekranu znajduje się protodump wszystkich dostępnych właściwości. Więcej informacji o funkcjach sekcji proto dump znajdziesz w artykule Usługi.

@IntDef translation

@IntDef translation to kluczowa właściwość w panelu właściwości WindowManager. @IntDef oznacza, że opatrzony znacznikiem element typu integer reprezentuje typ logiczny, a jego wartość musi być jedną z wyraźnie nazwanych stałych. Aby ograniczyć wpływ na pamięć i wydajność, w kodzie źródłowym Androida zamiast enumów używana jest @IntDef.

Oto przykład użycia @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 wartości zrozumiałe dla człowieka, które mogą być trudne do interpretacji. Winscope przekształca te flagi w wartości zrozumiałe dla człowieka, korzystając z definicji @IntDef. Podczas kompilacji Winscope tworzy słownik wartości @IntDef i wykorzystuje tę listę do dekodowania instancji @IntDef w czytelnym dla człowieka formacie w czasie wykonywania. Na przykład aktywność z wartością activityType w usługi 2 jest przekształcana w wartość activityType w usługi ACTIVITY_TYPE_HOME. Podobnie okno z flags=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 poprawnie wystąpienia @IntDef, wykonaj czynności opisane w sekcji Aktualizowanie mapowania @IntDef, aby zaktualizować listę wystąpień @IntDef znanych przez Winscope.