Tệp báo lỗi WindowManager cung cấp thông tin tổng quan nhanh về WindowManager tại một thời điểm cụ thể. Dấu vết WindowManager có một trình tự theo trình tự thời gian của các trạng thái 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ấu hình của hoạt động, tác vụ, màn hình hoặc bất kỳ phần tử nào khác trong hệ phân cấp WindowManager. Thông tin này sẽ hữu ích khi 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à tệp báo lỗi.
Hãy xem phần 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 các giới hạn cửa sổ, thứ tự z và độ mờ.
Phần trung tâm của thẻ hiển thị 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ũng 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, bạn sẽ thấy một tệp báo lỗi 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 tệp kết xuất proto, hãy xem phần 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 điều khiển 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ì 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 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 thu thập một từ điển gồm 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
của 2
được dịch thành activityType
của ACTIVITY_TYPE_HOME
. Tương tự, một cửa sổ có flags=2173763840
đượ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.