Zrzuty WindowManager zawierają migawkę stanu WindowManager w określonym momencie. Ślady WindowManager to chronologiczna sekwencja stanów, która zawiera cenne informacje 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, takich jak 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.
Rysunek 1. Analiza śladu WindowManager.
Po lewej stronie ekranu znajduje się widok 3D okien. Widok prostokątów uwzględnia granice okien, kolejność z i krycie.
Środkowa część karty pokazuje hierarchię okien. Oprócz relacji nadrzędny-podrzędny między oknami, aktywnościami i zadaniami ten widok zawiera też te informacje:
- V: identyfikuje widoczne okna.
Po prawej stronie ekranu znajduje się zrzut proto wszystkich dostępnych właściwości. Więcej informacji o funkcjach sekcji zrzutu proto znajdziesz w artykule Właściwości.
Tłumaczenie @IntDef
Tłumaczenie @IntDef to kluczowa właściwość panelu właściwości WindowManager.
@IntDef oznacza, że oznaczony element typu integer reprezentuje typ logiczny i że jego wartość musi być jedną z jawnie nazwanych stałych.
@IntDef jest używany w bazie kodu Androida zamiast typów wyliczeniowych, aby zmniejszyć wpływ na pamięć i wydajność.
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 jako
wartości czytelne dla człowieka, które mogą być trudne do interpretacji. Winscope tłumaczy te flagi na wartości czytelne dla człowieka za pomocą definicji @IntDef.
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 activityType równym 2 jest tłumaczona na activityType równy 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 prawidłowo instancji @IntDef,
wykonaj czynności opisane w sekcji Aktualizowanie mapowania @IntDef
aby zaktualizować listę instancji @IntDef znanych przez Winscope.