Các kết xuất WindowManager cung cấp ảnh chụp nhanh của 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 xuất hiện hoặc tôi gặp phải tình trạ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 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, bạn sẽ thấy chế độ xem 3D của các cửa sổ. Khung hiển thị rects xem xét ranh giới cửa sổ, thứ tự z và độ mờ.
Phân đoạn trung tâm của thẻ này cho thấy hệ thống phân cấp cửa sổ. Ngoài mối quan hệ cha mẹ – con cái giữa các cửa sổ, hoạt động và tác vụ, chế độ xem này cũng bao gồm những thông tin sau:
- V: Xác định các cửa sổ có thể nhìn thấy.
Phía bên phải màn hình có một proto dump của tất cả các thuộc tính có sẵn. Để biết thêm thông tin về các tính năng của phần kết xuất proto, hãy xem Thuộc tính.
Bản dịch @IntDef
@IntDef
là một thuộc tính chính của bảng thuộc tính WindowManager.
@IntDef
biểu thị rằng phần tử được chú thích thuộc kiểu số nguyên đại diện cho một kiểu 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ì các 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, điều này có thể gây khó khăn cho việc 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 sẽ 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 chính xác một thực thể @IntDef
, hãy làm theo các bước trong phần Cập nhật ánh xạ @IntDef để cập nhật danh sách các thực thể @IntDef
mà Winscope biết.