WindowManager dumps ให้ภาพรวมของ WindowManager ณ เวลาหนึ่งๆ ร่องรอยของ WindowManager แสดงลำดับสถานะตามลำดับเวลาซึ่งให้ข้อมูลเชิงลึกที่มีคุณค่าเกี่ยวกับสาเหตุที่หน้าต่างปรากฏบนหน้าจอ การกำหนดค่าของหน้าต่าง หรือการกำหนดค่าของกิจกรรม งาน การแสดงผล หรือองค์ประกอบอื่นๆ ในลําดับชั้น WindowManager ข้อมูลนี้มีประโยชน์ในการแก้ปัญหาต่างๆ เช่น ทำไมแอปของฉันจึงไม่แสดง หรือฉันเห็นหน้าจอกะพริบขณะสลับใช้แอป
เครื่องมือดู WindowManager ของ Winscope จะแสดงข้อมูลนี้สำหรับทั้งร่องรอยและข้อมูลพุล
ดูข้อมูลเพิ่มเติมเกี่ยวกับการรวบรวมร่องรอยได้ที่ WindowManager
รูปที่ 1 การวิเคราะห์การติดตาม WindowManager
ด้านซ้ายของหน้าจอจะแสดงมุมมอง 3 มิติของหน้าต่าง มุมมอง rects จะพิจารณาขอบเขตของหน้าต่างลําดับชั้น z และความทึบแสง
ส่วนกลางของแท็บจะแสดงลําดับชั้นของหน้าต่าง นอกจากความสัมพันธ์แบบ "หลัก-ย่อย" ระหว่างหน้าต่าง กิจกรรม และงานแล้ว มุมมองนี้ยังมีข้อมูลต่อไปนี้ด้วย
- V: ระบุหน้าต่างที่มองเห็นได้
ด้านขวาของหน้าจอจะมีการดัมพ์โปรโตของพร็อพเพอร์ตี้ทั้งหมดที่ใช้ได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ของส่วนการดัมพ์โปรโตได้ที่พร็อพเพอร์ตี้
@IntDef translation
@IntDef
translation เป็นพร็อพเพอร์ตี้หลักของแผงพร็อพเพอร์ตี้ WindowManager
@IntDef
หมายถึงว่าองค์ประกอบที่มีคำอธิบายประกอบซึ่งมีประเภทจำนวนเต็มแสดงถึงประเภทตรรกะ และค่าขององค์ประกอบต้องเป็นหนึ่งในค่าคงที่ที่มีชื่ออย่างชัดแจ้ง
@IntDef
ใช้ภายในโค้ดฐานของ Android แทน enum เพื่อลดผลกระทบต่อหน่วยความจำและประสิทธิภาพ
ตัวอย่างการใช้ @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;
ระบบจะจัดเก็บ Flag เป็นจำนวนเต็มแทนที่จะใช้ค่าที่มนุษย์อ่านได้ ซึ่งอาจตีความได้ยาก Winscope จะแปล Flag เหล่านี้เป็นค่าที่มนุษย์อ่านได้โดยใช้คำจำกัดความ @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 เพื่ออัปเดตรายการอินสแตนซ์ @IntDef
ที่ Winscope รู้จัก