Kết quả kết xuất WindowManager cung cấp ảnh chụp nhanh về WindowManager tại một thời điểm cụ thể. Dấu vết WindowManager có một chuỗi trạng thái theo trình tự thời gian, cung cấp thông tin chi tiết có giá trị về lý do một cửa sổ xuất hiện trên màn hình, cấu hình của cửa sổ đó hoặc của hoạt động, tác vụ, màn hình hoặc của bất kỳ phần tử nào khác trong hệ phân cấp WindowManager. Thông tin này hữu ích cho việc khắc phục các vấn đề như tại sao ứng dụng của tôi không hiển thị hoặc Tôi gặp phải hiện tượng nhấp nháy khi chuyển đổi giữa các ứng dụng.
Trình xem WindowManager của Winscope hiển thị thông tin này cho cả dấu vết và kết quả kết xuất.
Hãy xem WindowManager để biết thêm thông tin về việc thu thập dấu vết.
Hình 1. Phân tích dấu vết WindowManager.
Bên trái màn hình có chế độ xem 3D của các cửa sổ. Chế độ xem hình chữ nhật xem xét các giới hạn cửa sổ, thứ tự z và độ mờ.
Phần trung tâm của thẻ này cho thấy hệ phân cấp cửa sổ. Ngoài mối quan hệ mẹ-con giữa các cửa sổ, hoạt động và tác vụ, chế độ xem này còn bao gồm các thông tin sau:
- V: Xác định các cửa sổ hiển thị.
Bên phải màn hình có kết quả kết xuất giao thức của tất cả các thuộc tính hiện có. Để biết thêm thông tin về các tính năng của phần kết quả kết xuất giao thức hãy xem bài viết Thuộc tính.
Bản dịch @IntDef
Bản dịch @IntDef là một thuộc tính chính của bảng thuộc tính WindowManager.
@IntDef cho biết rằng phần tử được chú thích của loại số nguyên đại diện cho một loại logic và giá trị của phần tử đó phải là một trong các hằng số được đặt tên rõ ràng.
@IntDef được dùng trong cơ sở mã Android thay vì enum để giảm thiểu tác động đến bộ nhớ và hiệu suất.
Sau đây là ví dụ về cách sử dụng @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;
Các cờ được lưu trữ dưới dạng số nguyên, thay vì sử dụng
các giá trị mà con người có thể đọc được, vì có thể khó diễn giải. Winscope dịch các cờ này thành các giá trị mà con người có thể đọc được bằng cách sử dụng các định nghĩa @IntDef.
Trong quá trình biên dịch, Winscope thu thập một từ điển các giá trị @IntDef và sử dụng danh sách này để giải mã các thực thể @IntDef thành định dạng mà con người có thể đọc được trong thời gian chạy. Ví dụ: một hoạt động có activityType là 2 sẽ được dịch thành activityType là ACTIVITY_TYPE_HOME. Tương tự, một cửa sổ có flags=2173763840 sẽ được dịch trong Winscope như sau:
flags=FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | FLAG_HARDWARE_ACCELERATED |
FLAG_SPLIT_TOUCH | FLAG_SHOW_WALLPAPER | FLAG_LAYOUT_INSET_DECOR |
FLAG_LAYOUT_IN_SCREEN
Nếu Winscope không dịch đúng thực thể @IntDef, hãy làm theo các bước trong bài viết Cập nhật việc ánh xạ @IntDef để cập nhật danh sách các thực thể @IntDef mà Winscope biết.