WindowManager 덤프는 특정 시점의 WindowManager 스냅샷을 제공합니다. WindowManager 트레이스에는 창이 화면에 표시되는 이유, 구성, 활동, 작업, 디스플레이 또는 WindowManager 계층 구조의 기타 요소에 관한 유용한 정보를 제공하는 상태의 시간순서가 표시됩니다. 이 정보는 앱이 표시되지 않는 이유 또는 앱 간에 전환하는 동안 화면이 깜박임과 같은 문제를 해결하는 데 유용합니다.
Winscope의 WindowManager 뷰어는 트레이스와 덤프 모두에 대해 이 정보를 표시합니다.
trace 수집에 관한 자세한 내용은 WindowManager를 참고하세요.
그림 1. WindowManager 트레이스 분석
화면 왼쪽에는 창의 3D 보기가 표시됩니다. rects 뷰는 창 경계, z-순서, 불투명도를 고려합니다.
탭의 중앙 세그먼트에는 창 계층 구조가 표시됩니다. 창, 활동, 작업 간의 상위-하위 관계 외에도 이 뷰에는 다음 정보가 포함됩니다.
- V: 표시되는 창을 식별합니다.
화면 오른쪽에는 사용 가능한 모든 속성의 프로토 덤프가 표시됩니다. 프로토 덤프 섹션의 기능에 관한 자세한 내용은 속성을 참고하세요.
@IntDef 변환
@IntDef
변환은 WindowManager 속성 패널의 주요 속성입니다.
@IntDef
는 정수 유형의 주석이 달린 요소가 논리적 유형을 나타내고 그 값이 명시적으로 이름이 지정된 상수 중 하나여야 함을 나타냅니다.
@IntDef
는 메모리 및 성능 영향을 완화하기 위해 Android 코드베이스 내에서 열거형 대신 사용됩니다.
다음은 @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;
플래그는 사람이 읽을 수 있는 값을 사용하는 대신 해석하기 어려울 수 있는 정수로 저장됩니다. Winscope는 @IntDef
정의를 사용하여 이러한 플래그를 사람이 읽을 수 있는 값으로 변환합니다.
컴파일 중에 Winscope는 @IntDef
값의 사전을 수집하고 이 목록을 사용하여 런타임에 @IntDef
인스턴스를 사람이 읽을 수 있는 형식으로 디코딩합니다. 예를 들어 activityType
가 2
인 활동은 activityType
가 ACTIVITY_TYPE_HOME
인 활동으로 변환됩니다. 마찬가지로 flags=2173763840
가 있는 창은 Winscope에서 다음과 같이 변환됩니다.
flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED |
FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR |
FLAG_LAYOUT_IN_SCREEN
Winscope에서 @IntDef
인스턴스를 올바르게 변환하지 않으면 @IntDef 매핑 업데이트의 단계에 따라 Winscope에서 인식하는 @IntDef
인스턴스 목록을 업데이트하세요.