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.
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.