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.
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ą @IntDef
definicji.
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.